MySQL误删root用户导致无法登陆解决方法

测试环境


      删除前

 

     mysql> select user,host,password from mysql.user;
     +------+-----------+-------------------------------------------+
     | user | host      | password                                  |
     +------+-----------+-------------------------------------------+
     | root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
     | root | jinch     |                                           |
     | root | 127.0.0.1 |                                           |
     | root | ::1       |                                           |
     | test | 10.0.0.%  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
     

   

删除root用户
   

 mysql> drop user root@'localhost';

     为了测试,把其他root相关都删除了,命令就不一一展示了,显示结果。


    删除后

 

     mysql> select user,host from mysql.user;
     +------+-----------+
     | user | host      |
     +------+-----------+
     | test | localhost |
     +------+-----------+
     1 row in set (0.00 sec)

    
    退出再登陆

     [root@db01 ~]# mysql -uroot -p
     Enter password:
     ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    

  现在已经无法登陆了,之前误删过一次。。。无奈那会儿不知道如何解决,就只能重装了,但是,经过一段时间的学习,发现并不是没有解决办法的。

 

解决方法

  

  首先,关闭数据库

service mysqld stop


   用安全模式设置开启免密登陆

  

mysqld_safe --skip-grant-tables --skip-networking &


     --skip-grant-tables  关闭连接层的验证模块
     --skip-networking    关闭远程连接数据库(只允许本地登陆,可设置防火墙达到相同效果)

     [root@jinch ~]# mysqld_safe --skip-grant-tables
     181010 16:57:03 mysqld_safe Logging to '/usr/local/mysql/data/jinch.err'.
     181010 16:57:04 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

    
  然后使用mysql命令就可以直接进入数据库
    进入之后,使用insert 命令重新插入表
     

 mysql> insert into user(user,host,password,ssl_type,ssl_cipher,x509_issuer,x509_subject) values('root','localhost',PASSWORD('123'),'','','','');
    

PASSWORD大写的原因:在mysql中密码都是密文的,所以这里是调用一个函数,将明文加密成密文。
    然后退出重启一下数据库就可以重新使用账号密码登录了

     mysql> quit
     Bye
     [root@db01 ~]# /etc/init.d/mysqld restart     
     [root@db01 ~]# mysql -uroot -p123
     Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     

     mysql>  --这边就放一部分啦,
  误删root用户无法登陆的解决就到这里啦

 

 

注意 如果成功后访问出现1142没有权限问题:

    

    mysql> select user,password from mysql.user;
ERROR 1142 (42000): SELECT command denied to user 'root'@'localhost' for table 'user'


看了一下报错信息,权限不够。。。那就是没有权限了
     退出数据库并且关闭mysql服务
     mysql> quit
     Bye
     安全模式启动mysql,root用户登录

     [root@db01 ~]# mysqld_safe --skip-grant-tables &
     [root@db01 ~]# mysql -uroot -p123 mysql

  切换数据库&查看表信息中的root用户的localhost权限
   

 mysql> use mysql;
     Database changed
     mysql> show tables;
     +---------------------------+
     | Tables_in_mysql           |
     +---------------------------+
     | columns_priv              |
     | db                        |
     | event                     |
     | func                      |
     | general_log               |
     | help_category             |
     | help_keyword              |
     | help_relation             |
     | help_topic                |
     | innodb_index_stats        |
     | innodb_table_stats        |
     | ndb_binlog_index          |
     | plugin                    |
     | proc                      |
     | procs_priv                |
     | proxies_priv              |
     | servers                   |
     | slave_master_info         |
     | slave_relay_log_info      |
     | slave_worker_info         |
     | slow_log                  |
     | tables_priv               |
     | time_zone                 |
     | time_zone_leap_second     |
     | time_zone_name            |
     | time_zone_transition      |
     | time_zone_transition_type |
     | user                      |
     +---------------------------+
     28 rows in set (0.00 sec)
     
     mysql> select * from user where user='root' and host='localhost'\G;
     *************************** 1. row ***************************
                       Host: localhost
                       User: root
                   Password: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
                Select_priv: N
                Insert_priv: N
                Update_priv: N
                Delete_priv: N
                Create_priv: N
                  Drop_priv: N
                Reload_priv: N
              Shutdown_priv: N
               Process_priv: N
                  File_priv: N
                 Grant_priv: N
            References_priv: N
                 Index_priv: N
                 Alter_priv: N
               Show_db_priv: N
                 Super_priv: N
      Create_tmp_table_priv: N
           Lock_tables_priv: N
               Execute_priv: N
            Repl_slave_priv: N
           Repl_client_priv: N
           Create_view_priv: N
             Show_view_priv: N
        Create_routine_priv: N
         Alter_routine_priv: N
           Create_user_priv: N
                 Event_priv: N
               Trigger_priv: N
     Create_tablespace_priv: N
                   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: NULL
           password_expired: N
     1 row in set (0.00 sec)
     
     ERROR:
     No query specified


     
     这里发现全部都是N ,表示root用户本地登陆没有权限
 修改root用户的localhost权限
    01.

update mysql.user set Grant_priv='Y',Super_priv='Y' where user='root';

flush privileges;

grant all on *.* to 'root'@'localhost';

 下面这写行不用输入,上面命令的实质就是下面 的操作

mysql> update user set `Insert_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Update_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Delete_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Create_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Drop_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Reload_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Shutdown_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Process_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `File_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Grant_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `References_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Index_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Alter_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Show_db_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Super_priv` ='Y',`Create_tmp_table_priv` = 'Y' where user='root'' and host='localhost';
     
     
     mysql> update user set `Lock_tables_priv` ='Y' where user='root' and host='localhost';  
     
     mysql> update user set `Execute_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Repl_slave_priv` ='Y' where user='root' and host='localhost';
     
     
     mysql> update user set `Repl_client_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Create_view_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Show_view_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Create_routine_priv` ='Y' where user='root' and host='localhost'';
     
     mysql> update user set `Alter_routine_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Create_user_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Event_priv` ='Y' where user='root' and host='localhost';
     
     mysql> update user set `Trigger_priv` ='Y' where user='root' and host='localhost';
     
     mysql> flush privileges;
     Query OK, 0 rows affected (0.00 sec)


退出&重启&登陆

     mysql> quit
     Bye
     [root@jinch ~]# /etc/init.d/mysqld restart
     Shutting down MySQL.. SUCCESS!
     Starting MySQL.. SUCCESS!
     [root@jinch ~]# mysql -uroot -p123

切换库

     mysql> use mysql;
     Reading table information for completion of table and column names
     You can turn off this feature to get a quicker startup with -A
     
     Database changed

#####  查看表信息
 

   mysql> select * from user\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: N
                   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: NULL
           password_expired: N
     1 row in set (0.01 sec)
     
     ERROR:
     No query specified
     

     权限已经基本都有了
测试一下

mysql> create database jinc;
     Query OK, 1 row affected (0.00 sec)
     
     mysql> select user,host from mysql.user;
     +------+-----------+
     | user | host      |
     +------+-----------+
     | root | localhost |
     +------+-----------+
     1 row in set (0.00 sec)
     
     mysql> drop database jinc;
     Query OK, 0 rows affected (0.00 sec)
posted on 2018-11-14 16:05  kingle-l  阅读(729)  评论(0编辑  收藏  举报

levels of contents