`

解决mysql 本地用户无法登陆

阅读更多

MySQL Study之--MySQL普通用户无法本地登陆

 

    在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库。在使用用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况,但是从其它的mysql客户端却可以登录。

故障现象:

故障现象:
[root@mysrv ~]# mysql -u root -poracle

1
2
3
4
5
6
7
8
Welcome to the MySQL monitor.  Commands end with or \g.
Your MySQL connection id is 10
Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c) 20002012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version()\g
+-------------------------------------------+
| version()                                 |
+-------------------------------------------+
| 5.6.25-enterprise-commercial-advanced-log |
+-------------------------------------------+
1 row in set (0.00 sec)

创建用户并授权
mysql> grant all on prod.* to 'rose'@'%' identified by 'rose';
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for rose;

1
2
3
4
5
6
7
+-----------------------------------------------------------------------------------------------------+
| Grants for rose@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'rose'@'%' IDENTIFIED BY PASSWORD '*86F57026C60B8CE1038EFB3B9383EC573979A7BD' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'rose'@'%'                                                      |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)


mysql> select user,host from user;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-------+-----------+
| user  | host      |
+-------+-----------+
| jerry | %         |
| rose  | %         |
| tom   | %         |
| tom1  | %         |
| tom2  | %         |
| root  | 127.0.0.1 |
| root  | ::1       |
|       | localhost |
| jerry | localhost |
| root  | localhost |
| scott | localhost |
| tom   | localhost |
|       | mysrv     |
| root  | mysrv     |
+-------+-----------+
14 rows in set (0.00 sec)

用户登陆:

[root@mysrv ~]# mysql -u rose -prose
ERROR 1045 (28000): Access denied for user 'rose'@'localhost' (using password: YES)          

---登陆失败!


[root@mysrv ~]# mysql -u rose -p      

1
2
3
4
5
6
7
8
9
Enter password: 
Welcome to the MySQL monitor.  Commands end with or \g.
Your MySQL connection id is 22
Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c) 20002012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

--在不用密码的情况下可以登陆,但没有权限访问,应该是匿名用户的身份 !

 

远程登陆:

远程登陆:

Center

 

---远程登陆成功!

 

一、登录后查看mysql.user表的情况

可以看到,我的数据库中有rose用户和匿名用户localhost;
mysql> show grants for rose;

1
2
3
4
5
6
7
8
9
10
11
12
13
+-----------------------------------------------------------------------------------------------------+
 
| Grants for rose@%                                                                                   |
 
+-----------------------------------------------------------------------------------------------------+
 
| GRANT USAGE ON *.* TO 'rose'@'%' IDENTIFIED BY PASSWORD '*86F57026C60B8CE1038EFB3B9383EC573979A7BD' |
 
| GRANT ALL PRIVILEGES ON `prod`.* TO 'rose'@'%'                                                      |
 
+-----------------------------------------------------------------------------------------------------+
 
2 rows in set (0.00 sec)

二、在本机用rose用户登录,发现不用密码可以登录;
[root@mysql01 ~]# mysql -urose -p
Enter password: 

mysql> select user(),current_user();
+----------------+----------------+
| user()         | current_user() |
+----------------+----------------+
| rose@localhost | @localhost     |
+----------------+----------------+
1 row in set (0.00 sec)

登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。
USER()函数返回你在客户端登陆时指定的用户名和主机名。
CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。
这里发现,我使用'rose'@'localhost'这个账户登录数据库(因为在本地登陆时没指定主机,默认是以localhost登录),但是数据库使用的是''@'localhost'这个账户来进行登录认证,而''@'localhost'这个匿名用户是没有密码的,因此我输入空密码登录成功了。但是登录后,所对应的用户的匿名用户。

一般在MySQL在安装完毕后,我们使用mysql_install_db这个脚本生成授权表,会默认创建''@'localhost'这个匿名用户。正是因为这个匿名用户,影响了其他用户从本地登录的认证。
那么MySQL是如何进行用户身份认证呢?

        一、当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。授权表中的Host字段是可以使用通配符作为模式进行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com这个主机。授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。 当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。

       二、排序规则:对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。 User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。因此,如果User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。

了解了这个认证流程,就知道为什么server登录失败了。
     使用GaMe在本机登录数据时,不指定-h参数默认为localhost主机登录,而在MySQL中有两个匹配的条目:'rose'@'%'  和 ''@'localhost'
匿名用户能够匹配的原因上面说过,空字符串可以匹配所有的用户名,就像通配符一样。
根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。
而MySQL会优先使用主机名排序第一的条目进行身份认证,因此''@'localhost'被用户对客户端进行认证。因此,只有使用匿名用户的空密码才能登录进数据库。就会出现下面的情况了。
    解决的方法:删除匿名用户(仅仅为了安全也有这个必要)
为什么root用户不会受影响,而只有普通用户不能从本地登录?
因为mysql_install_db脚本会在授权表中生成'root'@'localhost'这个账户。同样的,使用root登录MySQL 时,'root'@'localhost'和''@'localhost'都能匹配登录的账户,但是根据排序规则,主机名相同,而用户名非空字符串优先,因此'root'@'localhost'这个条目的排序更靠前。使用root本地登录是不会被匿名用户遮盖。

 

解决方法:

 

授权rose用户本地登陆:

mysql> grant all on prod.* to 'rose'@'localhost' identified by 'rose';
Query OK, 0 rows affected (0.01 sec)

 

从本地登陆:

[root@mysrv ~]# mysql -u rose -prose

1
2
3
4
5
6
7
8
Welcome to the MySQL monitor.  Commands end with or \g.
Your MySQL connection id is 26
Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Copyright (c) 20002012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use prod;
Database changed
mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

mysql> select * from t1;

+------+-------+
| id   | name  |
+------+-------+
|   10 | tom   |
|   20 | jerry |
|   30 | rose  |
+------+-------+
3 rows in set (0.00 sec)

---登陆成功!

 

分享到:
评论

相关推荐

    Mysql root用户对应的host字段缺少localhost导致本地无法访问数据库问题修复

    Mysql root 用户对应的 host 字段缺少 localhost 导致本地无法访问数据库问题可以通过以上方法解决。需要首先停止 Mysql 服务,然后进入安全模式,修改 host 值为 localhost,保存修改生效,并重启 Mysql 服务。

    mysql本地安装方法及资源

    3. Stack Overflow:解决MySQL使用中遇到的问题。 4. MySQL教程:https://www.w3school.com.cn/mysql/ 以上就是MySQL本地安装的详细步骤和相关资源。在实际使用中,了解和掌握这些知识将有助于你更好地管理和维护...

    MySQL密码正确却无法本地登录-1045

    MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,但在日常使用中,用户可能会遇到各种问题,其中一个常见的问题是“MySQL密码正确却无法本地登录-1045”。这个问题通常表现为尝试使用正确的用户名和密码...

    MySQL密码正确却无法本地登录的解决方法

    当遇到“MySQL密码正确却无法本地登录”的问题时,通常是因为MySQL数据库中的用户权限配置出现了问题。在这种情况下,系统返回的错误代码1045 (28000) 表示访问被拒绝,尽管提供了正确的密码。问题的核心在于`user`...

    mysql不能用localhost,127.0.0.1连接,只能用ip连接 的解决方法

    MySQL的用户权限管理在`mysql.user`表中,这里存储了每个用户的登录信息。按照描述中的文件名,你可以尝试以下操作: - 登录MySQL:`mysql -u root -p` - 选择mysql数据库:`use mysql;` - 检查`mysql.user`表...

    mysql本地登录无法使用端口号登录的解决方法

    本文将详细介绍如何解决MySQL本地登录无法使用端口号登录的问题。 问题描述: 当尝试使用`mysql -h localhost -u root -p -P 3306`命令登录MySQL服务器时,系统可能会返回错误信息`ERROR 2002 (HY000): Can't ...

    mysql增加新用户无法登陆解决方法

    然而,有时在创建用户后,可能会遇到用户无法登录的问题。这个问题通常涉及到权限设置或用户账户配置的细节。以下是一个具体的例子,以及如何解决此类问题的方法。 在安装OpenStack Folsom版本时,我们可能需要为每...

    MYSQL无法远程连接

    ### MySQL无法远程连接问题解析与解决方案 #### 一、问题背景 ...综上所述,通过上述方法可以有效解决MySQL无法远程连接的问题。不过,在实施这些方案时,还需要根据实际情况灵活调整,以达到最佳效果。

    MySQL常见问题及解决方法

    Q: 为什么 mysqld 启动了,却无法登录,提示 "/var/lib/mysql/mysql.sock" 不存在? 这种情况大多数是因为 MySQL 是使用 rpm 方式安装的,它会自动寻找 `/var/lib/mysql/mysql.sock` 这个文件,通过 Unix socket ...

    在Ubuntu下解决MySQL不能远程访问的问题.docx

    本文将详细阐述如何在Ubuntu下解决MySQL不能远程访问的问题,具体步骤分为三个部分:配置文件的修改、MySQL数据库的修改以及再次用Mysql客户端登录验证。 ### 一、配置文件的修改 #### 步骤1:编辑my.cnf文件 ...

    解决mysql不能远程访问的解决方法.docx

    ### 解决MySQL无法远程访问的方法 #### 一、问题背景 在使用MySQL数据库时,有时会遇到无法从远程计算机访问数据库的问题。这通常是因为MySQL默认只允许本地(localhost)访问,而不支持远程连接。本文将详细介绍...

    MYSQL权限不够解决办法

    本文将详细介绍如何解决MySQL权限不足的问题,并提供具体的解决方案。 #### 一、理解MySQL权限系统 在深入探讨解决方法之前,首先需要了解MySQL的权限管理系统。MySQL使用基于角色的访问控制(RBAC)机制,通过定义...

    mysql远程登录解决方法

    ### MySQL远程登录解决方案详解 MySQL作为一种广泛使用的开源关系型数据库管理系统,在...通过遵循上述指南,你可以有效地解决MySQL远程登录的问题,无论是临时需求还是长期部署,都能确保数据库的高效和安全访问。

    MYSQL不能从远程连接的解决方法

    当遇到MySQL无法进行远程连接的问题时,可以通过修改用户权限设置或者授权特定IP地址的远程访问权限来解决。这些步骤通常涉及到对MySQL系统数据库的修改,因此务必谨慎操作,并确保理解每一步的意义。此外,在进行...

    MYSQL密码过期问题解决

    以上两条命令分别设置了本地登录(localhost)和远程登录(%)的用户密码永远不会过期。 ##### 3. 检查密码策略 在某些情况下,MySQL可能会因为密码强度不够而拒绝设置新的密码。这时需要检查并调整MySQL的密码...

    mysql授权问题解决办法

    本文将详细介绍如何解决MySQL中的授权问题,包括但不限于如何更改root用户的密码、如何确保数据库服务正常运行以及如何通过命令行执行特定的初始化脚本。 #### 一、系统管理员权限获取 在解决MySQL授权问题之前,...

    mysql连接错误解决

    2. **权限配置问题**:MySQL的安全设置可能阻止了root用户从本地或其他主机登录。您需要检查MySQL的配置文件(my.cnf 或 my.ini)以确保root用户具有正确的权限。 3. **认证插件不兼容**:MySQL 8.0及更高版本默认...

    Mysql安装错误 解决方法

    此错误通常意味着你的本地机器无法与MySQL服务器建立连接,原因可能是个人防火墙阻止了必要的TCP端口3306,或者服务尚未启动。 #### 解决方案: 1. **检查防火墙设置**:确保你的个人防火墙已开放TCP端口3306。...

    解决mysql远程连接不上问题

    ### 解决MySQL远程连接不上问题 在日常的数据库管理和维护工作中,我们经常会遇到MySQL数据库只能通过本地`localhost`访问而无法通过IP地址进行远程连接的问题。这种情况不仅限制了数据库的可访问性和灵活性,还...

Global site tag (gtag.js) - Google Analytics