• 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 userG;
         *************************** 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)
    
  • 相关阅读:
    非阻塞式线程安全列表-ConcurrentLinkedDeque
    计数器
    Linux 查看服务器内存使用情况
    Oracle to_date, to_timestamp
    Hibernate session.flush() 使用
    阿里规约认证(题库附答案)
    多态性
    Java数据类型
    String类特点分析
    数组的定义
  • 原文地址:https://www.cnblogs.com/kingle-study/p/9958455.html
Copyright © 2020-2023  润新知