近期在客户执行 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 —