MySQL root 用户恢复权限和密码流程
背景
版本mysql5.7
在 MySQL 使用 --skip-grant-tables 启动模式时,权限表被跳过,导致用户无法执行权限相关操作。为了恢复 root 用户的权限,我们需要手动修复 MySQL 用户表并恢复正常模式。
步骤 1:使用 --skip-grant-tables 启动 MySQL
- 停止 MySQL 服务: 首先,停止 MySQL 服务。此步骤可以确保 MySQL 不会自动重新启动并且不会使用授权表。
pkill -f -- --skip-grant-tables - 以跳过权限表模式启动 MySQL: 以跳过权限表模式启动 MySQL,允许你在没有权限检查的情况下访问 MySQl
sudo -u mysql /usr/sbin/mysqld --skip-grant-tables --skip-networking &
步骤 2:更新 root 用户的密码
在此模式下,你可以直接更新用户的密码。首先,登录到 MySQL:
然后,执行以下 SQL 来更新 root 用户的密码(此处使用 root 用户和 localhost 主机名):
UPDATE mysql.user SET authentication_string = PASSWORD('Ww265325') WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
authentication_string = PASSWORD('Ww265325'):更新root用户密码为Ww265325。FLUSH PRIVILEGES:刷新权限,确保修改生效。
步骤 3:恢复 root 用户的权限
由于在跳过权限模式下,root 用户的权限未完全生效,我们需要手动修复权限:
UPDATE mysql.user SET Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y', Delete_priv = 'Y',
Create_priv = 'Y', Drop_priv = 'Y', Reload_priv = 'Y', Shutdown_priv = 'Y',
Process_priv = 'Y', File_priv = 'Y', Grant_priv = 'Y', References_priv = 'Y',
Index_priv = 'Y', Alter_priv = 'Y', Show_db_priv = 'Y', Super_priv = 'Y',
Create_tmp_table_priv = 'Y', Lock_tables_priv = 'Y', Execute_priv = 'Y',
Repl_slave_priv = 'Y', Repl_client_priv = 'Y', Create_view_priv = 'Y',
Show_view_priv = 'Y', Create_routine_priv = 'Y', Alter_routine_priv = 'Y',
Create_user_priv = 'Y', Event_priv = 'Y', Trigger_priv = 'Y', Create_tablespace_priv = 'Y'
WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
- 这条语句为
root用户在localhost上赋予了所有常用权限。
步骤 4:关闭跳过权限模式并重新启动 MySQL
- 停止跳过权限模式: 停止当前 MySQL 进程,恢复正常的权限表:
pkill -f -- --skip-grant-tables - 重新启动 MySQL 服务: 使用系统服务重新启动 MySQL:
systemctl start mysqld
步骤 5:验证
最后,验证 root 用户是否已恢复正常权限并能够登录。
mysql -u root -p
输入你在步骤 2 中设置的密码 Ww265325,应该能够成功登录并且可以正常执行命令。
总结
- 使用
--skip-grant-tables启动 MySQL,跳过权限检查。 - 在 MySQL 中直接更新
root用户的密码。 - 手动修复
root用户的权限,确保其具有所有必要的权限。 - 关闭跳过权限模式,重新启动 MySQL 服务。
- 测试
root用户是否可以正常登录并拥有足够权限。
