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

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

时间:2023-06-19 11:06:15浏览次数:66  
标签:index stats 1146 MySQL innodb mysql table NULL 字典


最近某套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的错误,表不存在,

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

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


标签:index,stats,1146,MySQL,innodb,mysql,table,NULL,字典
From: https://blog.51cto.com/u_13950417/6511639

相关文章

  • 小白学习MySQL - 随机插入测试数据的工具
    我们日常做一些MySQL测试的时候,经常要造数据,通常就写个循环插入数据的存储过程。前两天碰巧看文章说,mysql_random_data_load程序能向MySQL随机插入大量数据,于是了解一下。mysql_random_data_load是个开源的项目,github路径如下,https://github.com/Percona-Lab/mysql_random_data_loa......
  • mysql
    创建库createdatabasedb1查看库showdatabase切换当前库usedb1删除库dropdatabasedb1 创建表createtablestudents清空表deletefrom表名增语法:insertinto表名(列1,列2...)values(值,值...)Eg:insertintostudents(name,sex,age)values(‘zm’,’male’,1......
  • mysql 存储过程实例
    mysql存储过程实例1. 存储过程-递归查询数据字典树数据CREATEDEFINER=`lihongyuan`@`%`PROCEDURE`GetDataDictionaryTree`(intkeyvarchar(200))BEGINWITHRECURSIVEcteAS(SELECTid,name,ParentId,`Order`FROMlbd_app......
  • MySQL8(glibc2.28)二进制安装
    操作系统:centos7.9安装数据库:mysql-8.0.33-linux-glibc2.28一、升级gcc(传送阵:升级gcc)1、添加mysql8依赖库软连接mv/lib64/libstdc++.so.6/lib64/libstdc++.so.6_oldln-s/usr/local/gcc/lib64/libstdc++.so.6/lib64/libstdc++.so.62、查看GLIBC_2.28是否更新成功stri......
  • 73.Mysql密码验证组件
    Mysql在设置用户密码时有一个关于密码验证组件,该组件的功能就是提高用户设置密码时的安全性。1.安装和卸载mysql>INSTALLCOMPONENT'file://component_validate_password';mysql>UNINSTALLCOMPONENT'file://component_validate_password';2.查看mysql>SHOWVARIABLE......
  • 我们如何打造一个近乎完美的密码字典
    先说明,我在该领域也是新手,和网友共同探讨交流方法。这些是我总结的内容。社工收集字典优先使用该字典,比如你要对某个个人的具有身份验证web页面进行破,在你知道用户名的情况下在社工字典中找到了该人,如果你用该字典破,准确性会十分的高。私人单位定制字典。比如你知道某个个人姓名......
  • DataX在Windows上实现Mysql到Mysql同步数据以及配置多个job/多个表同步定时执行bat
    场景DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步:DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步_sqlserver数据同步工具_霸道流DataX-在Windows上实现postgresql同步数据到mysql:DataX-在Windows上实现postgres......
  • 【mysql】1378. 使用唯一标识码替换员工ID
    题目:Employees表:±--------------±--------+|ColumnName|Type|±--------------±--------+|id|int||name|varchar|±--------------±--------+id是这张表的主键。这张表的每一行分别代表了某公司其中一位员工的名字和ID。EmployeeUNI表:±--------......
  • 必知必会:MySQL
    复制表结构和其数据:createtabletable_name_newasselect*fromtable_name_old表结构相同,复制表数据:insertintotable_name_newselect*fromtable_name_old表结构不同,复制表数据:insertintotable_name_new(column1,column2...)selectcolumn1,column2........
  • MySQL 优化
    SQL优化是提高MySQL数据库性能和查询效率的过程。下面是一些常见的SQL优化技巧:优化表结构:合理的表结构设计有助于提高性能。特别是,列是否具有正确的数据类型,每个表是否具有符合业务需求的列?例如,执行频繁更新的业务通常表比较多,列很少,而分析大量数据的业务通常表比较少,列很......