问题:

问题:

我有类似的问题 这里。问题是那里提出的解决方案对我来说不起作用:

目前我有用户:

+----------+------------------------------------+
| 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;

相关内容