专栏首页bisal的个人杂货铺MySQL数据字典提示1146不存在的问题解决

MySQL数据字典提示1146不存在的问题解决

最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,

[ERROR] InnoDB: Table `mysql`.`innodb_table_stats` not found.
2021-09-03T08:26:52.446564Z 2 [ERROR] InnoDB: Fetch of persistent statistics requested for table `jira`.`clusteredjob` 
      but the required system tables mysql.innodb_table_stats 
      and mysql.innodb_index_stats are not present or 
      have unexpected structure. 
      Using transient stats instead.

从提示来看,mysql.innodb_table_stats这张表是不存在,但是执行了show tables显式存在这张表,

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
...
| innodb_index_stats        |
| innodb_table_stats        |
...
+---------------------------+
31 rows in set (0.00 sec)

然而看他的建表语句,就提示了错误,

mysql> show create table innodb_table_stats;
ERROR 1146 (42S02): Unknown error 1146

1146的错误,表不存在,

P.S.

https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html

有点懵了,这张表到底存在不存在?

我们知道,MySQL的innodb引擎下,默认情况,每张表都对应本地的一组文件,进入数据路径,发现这张innodb_table_stats只有frm结构文件,并没有ibd数据文件,

[mysql@bisal mysql]$ ls -l innodb*
-rwxrwxrwx 1 mysql mysql 12982 Jan  6  2020 innodb_index_stats.frm
-rwxrwxrwx 1 mysql mysql 98304 Jan  6  2020 innodb_index_stats.ibd
-rwxrwxrwx 1    27    27  8830 May  8  2018 innodb_table_stats.frm

推测可能是因为当前数据文件所在磁盘之前非常规卸载,手工挂载,导致文件异常,物理文件已经被删除了,只剩结构文件,从文件名称看,这个应该是存储表统计信息的数据字典,原则上,不影响系统运行,因此数据库可访问但是当需要用到表的统计信息时,因为表实际已经被删除,所以提示错误。针对这种情况,看了一些资料,可以通过手工重建的操作,恢复数据字典。

首先到这个路径,

cd /usr/share/mysql

其中存储了很多的脚本,

[mysql@bisal mysql]$ ls
bulgarian  dictionary.txt   estonian              greek                        italian   mysql-log-rotate              mysql_system_tables.sql       polish      serbian  ukrainian
charsets   dutch            fill_help_tables.sql  hungarian                    japanese  mysql_security_commands.sql   mysql_test_data_timezone.sql  portuguese  slovak   uninstall_rewriter.sql
czech      english          french                innodb_memcached_config.sql  korean    mysql_sys_schema.sql          norwegian                     romanian    spanish
danish     errmsg-utf8.txt  german                install_rewriter.sql         magic     mysql_system_tables_data.sql  norwegian-ny                  russian     swedish

可以打开mysql_system_tables_data.sql,其中包含了innodb_table_stats这张表的定义,

SET @create_innodb_table_stats="CREATE TABLE IF NOT EXISTS innodb_table_stats (
        database_name                   VARCHAR(64) NOT NULL,
        table_name                      VARCHAR(64) NOT NULL,
        last_update                     TIMESTAMP NOT NULL NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        n_rows                          BIGINT UNSIGNED NOT NULL,
        clustered_index_size            BIGINT UNSIGNED NOT NULL,
        sum_of_other_index_sizes        BIGINT UNSIGNED NOT NULL,
        PRIMARY KEY (database_name, table_name)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0";

但是执行提示,还是说这张表不存在,即使执行了drop操作,还提示错误,

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed


mysql> CREATE TABLE innodb_table_stats (
    ->         database_name                   VARCHAR(64) NOT NULL,
    ->         table_name                      VARCHAR(64) NOT NULL,
    ->         last_update                     TIMESTAMP NOT NULL NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->         n_rows                          BIGINT UNSIGNED NOT NULL,
    ->         clustered_index_size            BIGINT UNSIGNED NOT NULL,
    ->         sum_of_other_index_sizes        BIGINT UNSIGNED NOT NULL,
    ->         PRIMARY KEY (database_name, table_name)
    -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
ERROR 1146 (42S02): Unknown error 1146

此时,我们就可以用到运维领域的第一法宝 - 重启,再次执行,

mysql> CREATE TABLE innodb_table_stats (
    ->         database_name                   VARCHAR(64) NOT NULL,
    ->         table_name                      VARCHAR(64) NOT NULL,
    ->         last_update                     TIMESTAMP NOT NULL NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->         n_rows                          BIGINT UNSIGNED NOT NULL,
    ->         clustered_index_size            BIGINT UNSIGNED NOT NULL,
    ->         sum_of_other_index_sizes        BIGINT UNSIGNED NOT NULL,
    ->         PRIMARY KEY (database_name, table_name)
    -> ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
Query OK, 0 rows affected (0.01 sec)

见证奇迹的时刻,show tables就出现了这张表,

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
...
| innodb_index_stats        |
| innodb_table_stats        |
...
+---------------------------+
31 rows in set (0.00 sec)

查看表的定义,

mysql> desc innodb_table_stats;
+--------------------------+---------------------+------+-----+-------------------+-----------------------------+
| Field                    | Type                | Null | Key | Default           | Extra                       |
+--------------------------+---------------------+------+-----+-------------------+-----------------------------+
| database_name            | varchar(64)         | NO   | PRI | NULL              |                             |
| table_name               | varchar(64)         | NO   | PRI | NULL              |                             |
| last_update              | timestamp           | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| n_rows                   | bigint(20) unsigned | NO   |     | NULL              |                             |
| clustered_index_size     | bigint(20) unsigned | NO   |     | NULL              |                             |
| sum_of_other_index_sizes | bigint(20) unsigned | NO   |     | NULL              |                             |
+--------------------------+---------------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

物理文件同时存在了innodb_table_stats的两个文件,

[mysql@jf-vra-app2390 mysql]$ ls -l innodb*
-rwxrwxrwx 1 mysql mysql  12982 Jan  6  2020 innodb_index_stats.frm
-rwxrwxrwx 1 mysql mysql 131072 Sep  3 16:29 innodb_index_stats.ibd
-rw-r----- 1 mysql mysql   8830 Sep  3 16:27 innodb_table_stats.frm
-rw-r----- 1 mysql mysql  98304 Sep  3 16:29 innodb_table_stats.ibd

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql-存储过程(转载)

    转自(http://www.cnblogs.com/exmyth/p/3303470.html)

    用户2038589
  • mysql表名忽略大小写问题记录

    问题描述: 一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下: mysql>...

    洗尽了浮华
  • 排障集锦:九九八十一难之第九难!mysql备份恢复路上的小插曲

    不吃小白菜
  • 最近碰到的问题

    问题1 MySQL报错MySQL“ERROR 1046(3D000):未选择数据库”更新查询

    bisal
  • MyCAT全局表描述及示例

    Leshami
  • MySQL关于数据字典的一个疑问

    今天看着MySQL的数据字典,突然想到一个问题:为什么MySQL数据字典 information_schema中的表名是大写,而performance_sche...

    jeanron100
  • MySQL主从报错解决:Table ‘mysql.gtid_slave_pos’ doesn’t exist

    给内部一个数据库做异地热备,热备部分采用了 MariaDB 的 galera 集群模式。然后挑选其中一台作为 Slave 和深圳主集群做主从同步。

    张戈
  • Hive SQL使用过程中的奇怪现象|避坑指南

    hive是基于Hadoop的一个数据仓库工具,用来进行数据的ETL,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive能将结构化的数据...

    数据社
  • MySQL备份文件.ibd、.frm、.MYD、.MYI的恢复教程

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    业余草
  • 小白学习MySQL - 聊聊数据备份的重要性

    最近某套MySQL数据库服务器异常关机,导致MySQL不能正常拉起来,启动过程中,error日志中记录了如下的信息,可以看到,数据库因为异常关闭,此时会进行实例...

    bisal
  • Mysql错误代码大全

    1016错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复。 1044错误:数据库用户权限不足,请联系空间商解决 1045错误:数据库服务器/...

    苦咖啡
  • MySQL5.5版本部署的一个问题

    目前公司部署MySQL是通过平台化操作的,周五的时候,平台暂时出了点儿问题,手上有个需求比较着急,就直接手动的部署了一下,由于好长时间没有部署环境了,...

    AsiaYe
  • Discuz! X3.4报错:UCenter info: MySQL Query Error 1146

    检查了好久终于解决了,问题出在数据库名称的大小写了,因为Windows系统字母不区分大小写,而Linux是大小写敏感的,在搬家的时候一定要注意这一点,在命名的时...

    德顺
  • mysql主从同步问题解决汇总

    程序员同行者
  • Python一个有趣的彩蛋

    上周组内技术分享会,朋友介绍了Python语言有趣的历史,其中一个有意思的环节就是Python之禅,或者叫Python的彩蛋-this.py,

    bisal
  • 小知识:MySQL修改lower_case_table_names参数

    环境:MySQL 5.7.25 起初创建环境时没有要求表名称不区分大小写,后续应用使用提出要设置lower_case_table_names=1的需求,期望表...

    Alfred Zhao
  • 数据库常见错误码

    我们知道网页有他的状态码,比如最常见的404,500。都有他自己的含义,但是,在MySQL数据库里面也有他们的一个错误码,相信很多同学见过但是没有注意到吧。很多...

    全栈开发Dream
  • Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析

    本文实例讲述了Laravel 框架基于自带的用户系统实现登录注册及错误处理功能。分享给大家供大家参考,具体如下:

    砸漏
  • MySQL 解决外键约束不能删除数据的问题

    第一种方法是使用MySQL 官方提供的文档方法             这个禁用约束: 运行这个命令 SET FOREIGN_KEY_CHECKS=0; 之后数...

    冷冷

扫码关注云+社区

领取腾讯云代金券