也不知道是造了什么虐,昨天搭建好的MySQL服务器今天竟然挂了。。。无奈又写了这篇。这篇文章主要包括两个部分,一是如何重置root密码,二是如何直接重建整个数据库。除非遇到一些比较极端的情况,否则所述的内容可能不会很常用。

1. 重置root密码

重置密码的步骤从网络上的资料看五花八门,所以还是参考官方指南更靠谱。

这个教程给出了3种方案,说是分别对应Windows系统、(类)Unix系统,和通用方案。我采用了其中的“通用方案”,总共分为6个步骤。

1.1 停止mysql服务
1
service mysql stop
1.2 加上参数–skip-grant-tables重启mysql服务

这个是需要以安全模式直接启动mysqld守护,因此和大多数情况下用service操作不太一样。如果不愿意这么做,也可以把这个参数直接加进配置文件里

1
2
3
[mysqld]
# 加上这么一行,其他配置保持不变
skip-grant-tables

教程中还建议一并加上–skip-networking参数。因为在skip-grant-tables模式下,mysql不需要输入密码就可以登录,这是相对不安全的,skip-networking可以阻止通过网络访问mysql。

1.3 直接登录mysql
1
mysql -uroot
1.4 重置密码

因为skip-grant-tables的原因,alter user、set password等操作都会被拒绝,教程里仍然提到了这个办法,可能是兼容性的考虑吧。

此时要修改密码,可以直接修改user表,注意保存密码的字段已经不是老教程里说的password了,而是authentication_string。

1
2
3
4
5
6
7
8
# 切换数据库
use mysql;
# 更新密码字段
update user set authentication_string = password('<new_password>') where user = 'root;
# 刷新权限
flush privileges;

1.5 恢复配置并重启服务

就是删除或者注释掉刚加在配置文件里的skip-grant-tables,然后按照正常的方式重新启动mysql服务。

1.6 用新密码登录mysql
1
mysql -uroot -p

登录成功,但是执行任何操作都提示需要“重置密码”,不过这次就可以使用正常的方式修改密码了。

1
2
3
4
5
# 适合5.7.6及以后版本
alter user 'root'@'localhost' identified by '<new_password>'
# 适合5.7.5及以前版本
set password for 'root'@'localhost' = password('<new_password>');

2. 重建整个数据库

需要重建整个数据库的概率应当比重置root密码更低,一般是数据库发生了比较严重的故障或者损坏,且数据都不太重要或者做好了备份的情况下,直接清除掉现有的全部内容,恢复mysql服务到最原始的状态。总共分为4个步骤。

2.1 停止mysql服务
1
service mysql stop
2.2 删除数据目录(data_dir)下的全部文件
1
2
3
# 视data_dir而定
cd /var/lib/mysql
rm -rf *

如果没有做这一步,下一步会提示“数据目录中存在文件,操作失败”

2.3 重建数据库
1
mysqld --initialize
2.4 重启服务
1
service mysql start

注意因为数据库已经被重置了,我也不知道新的root密码是什么了,试了下不是空密码,所以还得乖乖参考上一步,重置下密码。