1.模拟误删用户表的用户

1.1 查看下当前用户表的用户
mysql> SELECT User,Host FROM mysql.user;
+------+-----------+
| User | Host |
+------+-----------+
| root | 127.0.0.1 |
| root | db02 |
| root | localhost |
+------+-----------+
3 rows in set (0.00 sec)
1.2 误删所有用户
mysql> DELETE FROM mysql.user WHERE 1=1;
Query OK, 3 rows affected (0.00 sec)

查看误删后的用户表,所有用户都被删除了。

mysql> SELECT User,Host FROM mysql.user;
Empty set (0.00 sec)
1.3 重新登录数据库

虽然数据库中用户表的所有用户都被删除了,但是现在还可以继续使用root用户登录数据库(注意不能重启数据库)。一旦重启数据库就无法登录数据库了。

重启后登录数据库,可以发现已经无法登录数据库了。

$ mysql -uroot -p123
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

2. 解决无法登录数据的问题

2.1 停止数据库
systemctl stop mysqld
2.2 启动数据库
  • 跳过授权表启动数据库

只跳过授权表启动数据库后,任何一台服务器都可以连接此数据库,安全性极低。

mysqld_safe --skip-grant-tables &                       
  • 跳过授权表和网络启动数据库

跳过网络启动,只能这台服务器连接数据库了。

mysqld_safe --skip-grant-tables --skip-networking &
2.3 登录数据库

启动成功后,使用mysql命令直接登录,不需要指定用户和密码。

$ mysql

3.恢复用户表中的用户

3.1 登录数据库给root用户授权

通过跳过网络和授权表的方式启动数据库后,给root用户授权

  • 刷新数据库权限和缓存
mysql> FLUSH PRIVILEGES;
  • 授权root用户
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;
3.2 重启数据库
  • 关闭mysqld_safe方式启动的数据库
mysqladmin -uroot -p123 shutdown
  • 使用systemd来启动数据库
systemctl start mysqld.service
3.3 登录数据库
mysql -uroot -p123

登录数据库后,查看用户表:

mysql> SELECT User,Host FROM mysql.user;
+------+-----------+
| User | Host |
+------+-----------+
| root | localhost |
+------+-----------+
1 row in set (0.00 sec)

查看其权限:

mysql> SELECT * FROM mysql.user WHERE User='root' AND Host='localhost'\G
*************************** 1. row ***************************
Host: localhost
User: root
Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
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
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
1 row in set (0.00 sec)

可以看到root用户已经恢复,并且拥有了所有权限。

3.4 恢复其他用户

root用户恢复完成后,就可以再继续开始恢复其他用户。