Troubleshooting MySQL crash when FLUSH PRIVILEGES

近期在客户执行 MySQL 用户创建及授权操作时,数据库实例发生异常。经排查确认,原因为 MySQL 权限表损坏,导致权限变更操作触发实例异常。

考虑到数据库规模约 80GB,为保证恢复效率与稳定性,采用业务数据逻辑导出、新建数据库并重建用户权限后再导入数据的方式完成恢复。数据库运行正常业务恢复。

问题现象:

MySQL数据库在做创建用户并授权,执行FLUSH PRIVILEGES时,数据库CRASH, 后面反复重启未能启动。

Note: 从函数调用中有看到是用户访问权限表。

解决方法

可尝试

mysql> select * from mysql.tables_priv;

mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
       Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
  `Host` char(255) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8mb3_bin NOT NULL DEFAULT '',
  `User` char(32) COLLATE utf8mb3_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8mb3_bin NOT NULL DEFAULT '',
  `Grantor` varchar(288) COLLATE utf8mb3_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '',
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`User`,`Db`,`Table_name`),
  KEY `Grantor` (`Grantor`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0 ROW_FORMAT=DYNAMIC COMMENT='Table privileges'
1 row in set (0.00 sec)

根据DDL 创建新表tables_priv_new 

INSERT INTO tables_priv_new SELECT * FROM tables_priv;

FLUSH TABLES tables_priv,tables_priv_new;

RENAME TABLE
    tables_priv TO tables_priv_old
   ,tables_priv_new TO tables_priv;

FLUSH PRIVILEGES;

如果以上方法不可行,尝试把数据库导出,重建数据库,导入数据,再重新创建所有用户并授权. 该环境是在vm虚机上,建议

  • 是否有 异常关机 / 磁盘 IO / 文件系统问题
  • 是否开启 innodb_force_recovery
  • 是否建议 定期备份 mysql 系统库

— over —

Leave a Comment