我有类似的问题 这里。问题是那里提出的解决方案对我来说不起作用:
目前我有用户:
+----------+------------------------------------+
| user | host |
+----------+------------------------------------+
| root | 127.0.0.1 |
| root | localhost |
都无需密码(只是现在。我知道这很糟糕!)。
我正在使用以下命令连接到 mysql:
mysql -u root -h 127.0.0.1 --protocol=tcp
登录后,我得到:
mysql -u root -h 127.0.0.1 --protocol=tcp
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.61-log Source distribution
Copyright (c) 2000, 2011, 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> \s
--------------
mysql Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1
Connection id: 5
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.61-log Source distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
TCP port: 3306
Uptime: 2 days 9 hours 2 min 13 sec
Threads: 1 Questions: 102 Slow queries: 0 Opens: 19 Flush tables: 1 Open tables: 12 Queries per second avg: 0.0
--------------
mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)
mysql>
问题:
如何以“root”@127.0.0.1 身份登录?
答案1
晚上好,@RolandoMySQLDBA,作者你提到的那个帖子。
看看最后三行
Server version: 5.1.61-log Source distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
最后一行表明127.0.0.1 via TCP/IP
您 100% 使用 TCP/IP 协议。
你跑步了吗SELECT USER(),CURRENT_USER();
?
如果你这样做了,应该会说
[email protected] | [email protected]
输出结果看起来很奇怪
[email protected] | root@localhost
请注意以下几点:由于两个 root 用户具有相同的授权和相同的密码(在本例中为无),mysqld 决定选择root@localhost
。此时,您可能想知道,“为什么会mysqld
做出这样的选择?”
在 DBA StackExchange 中,我有这篇 2 年前的帖子 (MySQL 错误:拒绝用户‘a’@‘localhost’访问(使用密码:是))。在那篇文章中,我详细描述了mysqld如何执行用户身份验证。请注意第486、487页的段落MySQL 5.0 认证学习指南
客户端访问控制分为两个阶段:
在第一阶段,客户端尝试连接,服务器接受或拒绝连接。为了成功连接,用户表中的某些条目必须与客户端连接的主机、用户名和密码相匹配。
在第二阶段(仅当客户端已成功连接时才会发生),服务器会检查从客户端收到的每个查询,以查看客户端是否具有足够的权限来执行它。
服务器根据客户端连接的主机和客户端提供的用户,将客户端与授权表中的条目进行匹配。但是,可能会有多个记录匹配:
正如我在认证书中提到的那样it's possible for more than one record to match
。因此,mysqld
做出了选择。
如果您root@localhost
从 中删除mysql.user
,这是获得SELECT USER(),CURRENT_USER();
匹配的一种方法。另一种方法是输入[email protected]
密码。
概括
有 2 个 root 用户使用相同的方式进行用户身份验证,这是您无法看到 的根本原因[email protected]
。尽管如此,您仍在使用TCP/IP
。
边注
请确保127.0.0.1
在操作系统中已定义。运行以下命令:
cat /etc/hosts | grep -c "127\.0\.0\.1"
如果出现0
,则操作系统不知道它。您需要添加127.0.0.1
并/etc/hosts
重新启动网络,然后重新启动 mysql。
更新时间:2014-04-26 20:00 EDT
我要说的可能听起来很傻,但文档使用的是 TCP 而不是 tcp
在 Unix 上,MySQL 程序会特殊处理主机名 localhost,与其他基于网络的程序相比,这种方式可能与您预期的不同。对于与 localhost 的连接,MySQL 程序会尝试使用 Unix 套接字文件连接到本地服务器。即使给出了 --port 或 -P 选项来指定端口号,也会发生这种情况。要确保客户端与本地服务器建立 TCP/IP 连接,请使用 --host 或 -h 指定主机名值 127.0.0.1,或本地服务器的 IP 地址或名称。您还可以使用 --protocol=TCP 选项明确指定连接协议,即使对于 localhost 也是如此。例如:
shell> mysql --host=127.0.0.1 shell> mysql --protocol=TCP
即使其他选项通常默认为其他协议,--protocol 选项也使您能够建立特定类型的连接。
尝试使用协议=TCP像这样
mysql -u root -h 127.0.0.1 --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
mysql -u root -h localhost --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
看看是否有什么不同。
更新时间 2014-05-09 16:19
你需要仔细/etc/hosts
查看
如果你看到这个/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
然后登录即可[email protected]
正常工作
如果你看到这个/etc/hosts
127.0.0.1 localhost
那么[email protected]
就没有机会发挥作用
答案2
对于仍在寻找解决方案的人:事实证明,如果未设置“skip-name-resolve”,服务器将尝试获取源地址的反向解析。当使用 root 用户连接到 127.0.0.1 时,如果您的 /etc/hosts 包含此条目,则此地址将被反向解析为 localhost。在搜索权限表时,解析结果优先于 ip 地址,从而查找 root@localhost 而不是[电子邮件保护]
答案3
PHP 仍在尝试使用默认套接字位置。如果您有移动了 MariaDB/MySQL 文件夹从/var/lib/mysql到另一个位置。为了解决这个问题,你必须在/etc/php.ini文件。
mysqli.default_socket =/newDBLocation/mysql/mysql.sock
请注意,根据您使用的驱动程序,您可能必须指定pdo_mysql.default_socket=!
为了检查当前目录,请在 mysql 中运行以下命令:
select @@datadir;