表 mysql/innodb_index_stats 在列名 table_name 中的长度不匹配。请运行 mysql_upgrade

Roy*_*ley 22 mysql errors mysql-8.0

mysqld.log我有数千行,如:

Table mysql/innodb_index_stats has length mismatch in the column name table_name.  Please run mysql_upgrade
Run Code Online (Sandbox Code Playgroud)

因此,根据几乎所有关于此事的帖子(以及错误消息本身):

mysql_upgrade -u root -p

Enter password: 
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
...
Run Code Online (Sandbox Code Playgroud)

并且所有数据库中的所有表都像

...
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
The sys schema is already up to date (version 1.5.1).
Checking databases.
...
Run Code Online (Sandbox Code Playgroud)

但是,我仍然在日志中收到错误

2019-01-27T18:37:15.304587Z 66190 [Warning] InnoDB: Table mysql/innodb_table_stats has length mismatch in the column name table_name.  Please run mysql_upgrade
2019-01-27T18:37:15.304620Z 66190 [Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name.  Please run mysql_upgrade
2019-01-27T18:37:15.304684Z 66190 [Warning] InnoDB: Table mysql/innodb_table_stats has length mismatch in the column name table_name.  Please run mysql_upgrade
2019-01-27T18:37:15.304707Z 66190 [Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name.  Please run mysql_upgrade
Run Code Online (Sandbox Code Playgroud)

结构看起来没问题。是不是配置有问题?请指教。

答案似乎是 - 重新启动服务器。我无权执行此操作,但在管理员重新启动后,问题似乎已解决。不知道为什么只是重新启动 MySQL 没有解决?

小智 12

也许这些信息很有用。

https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-23.html

笔记

此版本包括对 innodb_index_stats 和 innodb_table_stats 系统表的更改。升级到此版本时,请确保运行 mysql_upgrade 以包含这些更改。

  • 开门见山,解决得很好。谢谢你! (2认同)

Ric*_*mes 10

您知道生成警告时发生了什么吗?听起来像是某种形式的版本不匹配。你有插件吗?

请在 bugs.mysql.com 上提交错误。

同时,执行以下操作:

USE mysql;
SHOW CREATE TABLE innodb_index_stats ;
Run Code Online (Sandbox Code Playgroud)

特别检查 的定义table_name。以前是这样的:

`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
Run Code Online (Sandbox Code Playgroud)

但在 MySQL 8.0 中它变成了:

`table_name` varchar(199) COLLATE utf8_bin NOT NULL,
Run Code Online (Sandbox Code Playgroud)

如果它仍然是 64,则重新运行mysql_update 应该执行的操作,方法是

ALTER TABLE innodb_index_stats
    MODIFY   `table_name` varchar(199) COLLATE utf8_bin NOT NULL;
Run Code Online (Sandbox Code Playgroud)

同上innodb_table_stats

另请参阅 Giacomo1968 的评论

  • 我尝试了“ALTER TABLE”,但警告不断出现。我运行了“mysq_upgrade”,现在不再有警告 (3认同)

Tit*_*ter 5

在命令行中:

  1. 跑步mysql_upgrade --user=your_user_name --password
  2. 输入密码。

--force如果数据库已经升级并且出现问题,您可能必须使用(如果您在这里,可能就是这种情况)。别担心,mysql_upgrade我们会告诉您这一点,因此您只需使用 重新运行它即可--force

就是这样。