从 127.0.0.1 而不是从 localhost 连接到 mysql

mis*_*iek 7 mysql localhost

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

就目前而言,我有用户:

+----------+------------------------------------+
| user     | host                               |
+----------+------------------------------------+
| root     | 127.0.0.1                          |
| root     | localhost                          |
Run Code Online (Sandbox Code Playgroud)

两者都没有密码(就目前而言。我知道这很糟糕!)。

我正在使用以下命令连接到 mysql:

mysql -u root -h 127.0.0.1 --protocol=tcp
Run Code Online (Sandbox Code Playgroud)

登录后,我得到:

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> 
Run Code Online (Sandbox Code Playgroud)

题:

如何以“root”@127.0.0.1 的身份登录?

Rol*_*DBA 3

晚上好,我是@RolandoMySQLDBA ,您提到的那篇文章的作者。

看最后三行

Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP
Run Code Online (Sandbox Code Playgroud)

最后一行表明127.0.0.1 via TCP/IP您 100% 使用 TCP/IP 协议。

你跑了吗SELECT USER(),CURRENT_USER();

如果你这样做了,它应该说

root@127.0.0.1 | root@127.0.0.1
Run Code Online (Sandbox Code Playgroud)

输出看起来很奇怪

root@127.0.0.1 | root@localhost
Run Code Online (Sandbox Code Playgroud)

请注意以下事项:由于两个 root 用户具有相同的授权和相同的密码(在本例中没有),因此 mysqld 决定选择root@localhost. 此时,您可能会想:“为什么会mysqld做出这样的选择?”

在 DBA StackExchange 中,我有一篇 2 年前的帖子(MySQL error: Access returned for user 'a'@'localhost' (using password: YES))。过去,我详细描述了 mysqld 如何执行用户身份验证。请注意《MySQL 5.0 认证学习指南》第 486,487 页中的段落

客户端访问控制分为两个阶段:

在第一阶段,客户端尝试连接,服务器接受或拒绝连接。为了使尝试成功,用户表中的某些条目必须与客户端连接的主机、用户名和密码相匹配。

在第二阶段(仅当客户端已成功连接时才会发生),服务器检查从客户端收到的每个查询,以查看客户端是否有足够的权限来执行它。

服务器根据客户端连接的主机和客户端提供的用户,将客户端与授权表中的条目进行匹配。但是,可能会匹配多个记录:

正如我在认证手册中提到的,it's possible for more than one record to match. 因此,mysqld做出了选择。

如果您删除root@localhostfrom mysql.user,这是匹配的一种方法SELECT USER(),CURRENT_USER();。另一种方法是提供root@127.0.0.1密码。

概括

拥有 2 个具有相同方式用于用户身份验证的 root 用户是您看不到的根本原因root@127.0.0.1。尽管如此,您正在使用TCP/IP.

边注

请确保127.0.0.1在操作系统中定义。运行这个:

cat /etc/hosts | grep -c "127\.0\.0\.1"
Run Code Online (Sandbox Code Playgroud)

如果您得到0,则操作系统不知道它。您需要添加127.0.0.1/etc/hosts重新启动网络,然后重新启动 mysql。

更新 2014-04-26 20:00 美国东部时间

我要说的可能听起来很愚蠢,但文档使用 TCP 而不是 tcp

在 Unix 上,MySQL 程序特别对待主机名 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
Run Code Online (Sandbox Code Playgroud)

即使其他选项通常默认为某些其他协议,--protocol 选项也使您能够建立特定类型的连接。

尝试像这样使用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()"
Run Code Online (Sandbox Code Playgroud)

看看它是否有所作为。

更新 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
Run Code Online (Sandbox Code Playgroud)

然后登录root@127.0.0.1应该可以正常工作

如果你看到这个/etc/hosts

127.0.0.1       localhost
Run Code Online (Sandbox Code Playgroud)

那么root@127.0.0.1就没有工作的机会

  • 那么有没有解决办法呢?即使使用“mysql -u foo -h 127.0.0.1”,“mysql”客户端也会认为您是 foo@localhost 吗? (2认同)
  • 你能解释一下最后一句话吗? “root@127.0.0.1”没有机会工作吗? (2认同)