MySQL数据库误删用户故障解决

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用户登录数据库(注意不能重启数据库)。一旦重启数据库就无法登录数据库了。

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

[root@db02 ~]# 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)

[root@db02 ~]# 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命令直接登录,不需要指定用户和密码。

[root@db02 ~]# 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用户恢复完成后,就可以再继续开始恢复其他用户。

点赞

发表回复