• mysql普通用户本机无法登录的解决办法


    背景

    mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况


    ## 分析 先查看下用户表 ```sql mysql> select user, host, password from mysql.user; +------+------------------+-------------------------------------------+ | User | Host | Password | +------+------------------+-------------------------------------------+ | root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | root | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | sweet| % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | root | % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | | localhost | | +------+------------------+-------------------------------------------+
    最后一条user为空的记录就是匿名用户的记录
    
    <br>
    普通用户为什么无法登录呢?因为匿名用户的主机名(host)是localhost,当我们在本机登录时,我们只会输入user,
    ```sql
    mysql -usweet -p
    
    

    所以mysql默认host为localhost,由于mysql的规则是host优先级比user高,所以会先匹配host,mysql就会去用户表里取host=localhost的数据进行认证,所以普通用户(比如sweet)的记录当然就被过滤掉了,因而也就登录不上了,这里有读者可能就会问:%不是可以匹配所有的ip吗,那么应该也可以匹配localhost啊?是的,%可以匹配localhost,但是这里涉及到一个优先级的问题,匹配到了localhost就不会继续匹配%


    ``` mysql -usweet-p ```

    当我们输入以上指令登录时,mysql的匹配逻辑是这样的:

    1. 匹配host,匹配成功(匹配到一条或多条)就进入下一步
    2. 匹配user,匹配到第一条后停止,进入下一步
    3. 有匹配验证密码,没有密码提示输入密码

    这里需要注意:匿名用户的user为空(''),是可以匹配所有字符的,所以只要有匿名用户存在,其余普通用户在本机是登录不上的!

    我们以普通用户sweet和root用户为例分别模拟上述认证过程

    sweet用户

    • 匹配host=localhost,匹配到两条记录
    | root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    |      | localhost        |                                           |
    

    - 从以上两条记录中匹配user=sweet,匹配到一条记录(空字符可以匹配到所有字符) ```sql | | localhost | | ```
    - 匹配password,匹配失败,返回access denied
    root用户
    • 匹配host=localhost,匹配到两条记录
    | root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    |      | localhost        |                                           |
    

    - 从以上两条记录中匹配user=root,匹配到一条记录(root为非空,优先级高于空字符,匹配到一条就进入下一步) ```sql | | localhost | | ```
    - 匹配password,匹配成功,进入登录界面

    补充:root用户可以登录的原因是mysql初始化时就在用户表里创建了一条root | localhost的记录,而root为非空,优先级高于空字符,所以先匹配到,因而roo用户可以正常登录


    ## 解决办法

    删除匿名用户


    ### 查看用户表,找到匿名用户对应的记录 ```sql select user,host,password from mysql.user;
    
    <br>
    ### 删除匿名用户
    
    ```sql
    drop user ''@'localhost';
    
    

    重启mysql服务

    注意一定要重启服务才会生效!!!

    linux下重启命令为:

    systemctl stop mariadb
    systemctl start mariadb
    
    

    windows下重启命令为

    net stop mysql
    net start mysql
    
    
  • 相关阅读:
    Android-内存泄漏
    性能adb命令
    设置Nginx开机自启动
    【转 记录】python中的encode以及decode
    SVN 提交回滚
    Linux基础
    CentOS6.X关闭防火墙
    SCP用法
    Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置(转)
    (转,记录用)jQuery页面加载初始化的3种方法
  • 原文地址:https://www.cnblogs.com/zzliu/p/10661295.html
Copyright © 2020-2023  润新知