Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

1033人浏览 / 0人评论

参考

mysql8.0x小版本覆盖升级修复漏洞方法(8.023到8.025)_mysql8.0小版本升级-CSDN博客

MySql解决mysql没有root用户问题_mysql no root-CSDN博客

说明

我本地的 MySQL 版本是 8.0.29,某次电脑重启后报了这个错,结果就是 MySQL 完全无法启动,期间尝试过如下方案都不太行:

  • 重新初始化 data 文件夹然后复制库文件夹和 ibdata1 文件;
  • 解析 .ibd 文件,提取建表语句,然后通过 ALTER TABLE xxx IMPORT TABLESPACE;命令导入;

也想过重建系统表,但是查到的那些命令都不能用,最终决定通过版本升级来重新生成系统表。

过程

1、停止 MySQL,删除 MySQL 服务。

net stop mysql

sc delete mysql 或者  mysqld --remove mysql

2、备份 data 文件夹。

3、下载比当前高一个小版本的 MySQL。

下载地址:https://downloads.mysql.com/archives/community/

4、复制 my.ini 文件和 data 文件夹到新版 MySQL。

5、修改环境变量。

6、添加到服务。

mysqld --install 或 ./mysqld --install

7、启动。

net start mysql

MySQL 启动正常但没有 root 用户

1、停止 MySQL:

net stop mysql

# 跳过登录验证
mysqld --console --skip-grant-tables --shared-memory

2、控制台启动 MySQL 并跳过登录验证:

mysqld --console --skip-grant-tables --shared-memory

3、另外打开一个 CMD 窗口,输入:

mysql -u root -p

## 输入任意密码登录后,按步骤执行后续操作。

4、创建 root 用户:

create user 'root'@'localhost' identified by '123456';

此步骤可能会报以下错误(没报错的跳第5步):

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

报错的输入:

flush privileges;

再次执行:

create user 'root'@'localhost' identified by '123456';

再次报错,这步没报错的也是直接跳第5步,报错的执行以下操作:

drop user 'root'@'localhost';

然后再次执行:

create user 'root'@'localhost' identified by '123456';

结果没有再报错,root 用户创建成功。

5、为 root 用户授权:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
flush privileges;
exit;

6、返回 mysqld --console --skip-grant-tables --shared-memory 命令执行的窗口,Ctrl + C 结束运行,然后使用 net start mysql 命令正常启动MySQL。

全部评论