症状:我刚刚尝试创建一个用户,就像我过去多次做的那样,只是收到此错误:
错误 1728 (HY000): 无法从 mysql.user 加载。该表可能是 损坏
原因:自从我上次通过phpMyAdmin创建用户以来,我能想到的唯一可能导致这种情况的事情就是apt-get升级。 据我所知,所有用户帐户都可以正常工作(测试所有帐户将是一个漫长的过程),其他数据库能够很好地读/写/等
故障 排除:
升级:我已经尝试了mysql_upgrade
两者都将该表(和所有其他表)报告为正常,并且需要--force
选项。我已经完成了一个完整的apt-get upgrade dist
并重新启动(随后是另一个mysql_upgrade
- 嘿,为什么不),问题仍然存在。
权限:我已经验证了/var/lib/mysql
以南的所有文件中的权限是mysql:root rw:rw:--(最初也是mysql组,但仅对用户可见),包括/var/lib/mysql-files
(空)/var/lib/mysql-keyring
(一个文件)和/var/lib/mysql-upgrade
(一个文件)
users:我有两个根用户(名称不同,权限几乎相同),并且都显示对mysql.user的完全访问权限(显示并能够快速编辑良好 - 尽管完整编辑缺少BLOB文件,这可能是问题吗?)通过phpMyAdmin。
创建用户方法:我在使用CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
时遇到与尝试通过 phpMyAdmin 时相同的错误 - 通过我的两个根帐户
在这一点上,我对重新安装MySQL甚至Ubuntu感到羞于堆栈溢出,我看到的最接近的文章是mysql.proc(没有工作)。
更新日志显示:
[警告] 表 mysql.user 的定义不正确:预期列 "password_expired"在位置41,找到"password_last_changed"。
[错误]/usr/sbin/mysqld:无法从 mysql.user 加载。该表是 可能已损坏
即使在重新运行mysql_upgrade
后,用户的列仍然顺序错误。
我的(不优雅的)解决方案是:
- 导出用户
- 重新排列表列定义(与
password_last_changed
交换password_expired
) - 作为
user2
导入(只是为了确保) DROP TABLE user;
(天哪!- 将
user2
复制到用户(谢天谢地,它奏效了!