在每次查询运行时获取 InnoDb 内部错误

Jat*_*eth 5 mysql innodb mysql-5.6

在运行每个查询时,我在 error.log 中遇到以下错误,因此我无法正确使用 error.log。

2016-05-30 09:39:58 7f7c7e3cb700 InnoDB: Error: Column last_update in table "mysql"."innodb_table_stats" is INT UNSIGNED NOT NULL but should be BINARY(4) NOT NULL (type mismatch).
2016-05-30 09:39:58 7f7c7e3cb700 InnoDB: Error: Fetch of persistent statistics requested for table "mysql"."innodb_table_stats" 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.
Run Code Online (Sandbox Code Playgroud)

我已经检查了“mysql”。“innodb_table_stats”和 mysql.innodb_index_stats 表存在,但仍然收到这些错误。

两个表的结构如下:

CREATE TABLE `innodb_index_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `index_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `stat_value` bigint(20) UNSIGNED NOT NULL,
  `sample_size` bigint(20) UNSIGNED DEFAULT NULL,
  `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `innodb_table_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `n_rows` bigint(20) UNSIGNED NOT NULL,
  `clustered_index_size` bigint(20) UNSIGNED NOT NULL,
  `sum_of_other_index_sizes` bigint(20) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)

MySql Server 详情:服务器类型:MySQL Server 版本:5.6.19-1~dotdeb.1 - (Debian)

我想添加更多关于相同的细节,几周前我面临着 Mysql 的默认位置的一些问题,所以;我使用以下步骤更改了 Mysql 的位置。

  1. 关闭Mysql
  2. 将旧文件夹中的所有 Mysql 文件移动到新文件夹
  3. 更改配置文件 my.cnf 中的 datadir 变量
  4. 重启 MySql 服务器

小智 6

该问题与“时间戳”字段的内部表示有关,可能是由于从以前的版本升级时发生的数据库转换过程中的错误引起的。

导出和导入数据库“mysql”解决了我的 debian 服务器中的问题。

在修复过程中,最好停止 Apache 和任何其他使用数据库的软件,以防万一。

导出数据库:

mysqldump --events --quick --single-transaction mysql > mysql-dump.sql
Run Code Online (Sandbox Code Playgroud)

导出后立即导入:

mysql mysql < mysql-dump.sql
Run Code Online (Sandbox Code Playgroud)

重要提示:此时必须重启mysql服务才能重新加载权限。

service mysql restart
Run Code Online (Sandbox Code Playgroud)

当然,我建议修复所有数据库,因为它们可能会受到影响。您可以手动一步一步完成,也可以使用一个简单的脚本一次性完成:

mysqldump="mysqldump --events --quick --single-transaction"
exclude="information_schema|performance_schema"

cd /tmp

# Backup and re-import each database on the system
for db in $(mysql -e "show databases;" -s --skip-column-names | grep -vE "($exclude)")
do
        echo "Repairing database $db"
        $mysqldump $db > $db.sql
        mysql $db < $db.sql
done
Run Code Online (Sandbox Code Playgroud)