【问题标题】:Can't connect to 127.0.0.1, but `mysqld` is listening无法连接到 127.0.0.1,但 `mysqld` 正在监听
【发布时间】:2017-05-07 14:29:26
【问题描述】:

无法在新安装的服务器版本 5.7.18-0ubuntu0.17.04.1 (Ubuntu) 上通过 TCP 连接到 localhost 上的 mysql

这行得通:

# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.7.18-0ubuntu0.17.04.1 (Ubuntu)

这不是:

# mysql -h 127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

在客户端我看到mysql 被配置为监听 127.0.0.1:

mysql> show variables like '%bind%';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| bind_address  | 127.0.0.1 |
+---------------+-----------+
1 row in set (0.00 sec)

它确实在听:

# netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:mysql         0.0.0.0:*               LISTEN

因此,PHP 也失败了:

Warning: mysqli_connect(): (HY000/1698): Access denied for user 'root'@'localhost'

如何解决这个问题?也许有一个设置禁用基于密码的 TCP 登录?

更新appearedlocalhost 表示本地套接字,因此我为 TCP 连接创建了另一个记录 'root'@'127.0.0.1'。

CREATE USER 'root'@'127.0.0.1';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1';
FLUSH PRIVILEGES;

但还是不行:

# mysql --protocol=TCP --host=127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

密码未设置。

mysql> SELECT host, user, authentication_string FROM mysql.user;
+-----------+------------------+-------------------------------------------+
| host      | user             | authentication_string                     |
+-----------+------------------+-------------------------------------------+
| localhost | root             |                                           |
| localhost | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | debian-sys-maint | *4CF7B81390C295E6AF38067F3B621BBF736D3366 |
| 127.0.0.1 | root             |                                           |
+-----------+------------------+-------------------------------------------+
4 rows in set (0.01 sec)

UPDATE 2:我从头开始,所以这是失败的测试:

mysql -h 127.0.0.1

但重新创建用户后,它开始工作:

DROP USER 'root'@'localhost';
CREATE USER 'root'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

为什么它不适用于开箱即用的同一用户?

【问题讨论】:

  • this 帖子。
  • 我猜你有 mysql 的密码。两种情况都需要传递root密码
  • 如果有密码,那么没有-hmysql 将不起作用。
  • @RogerRV 我已经在 root 下。
  • @AlexHowansky 不错的领导 - mysql -h localhost 工作正常。一旦我检查它是否有帮助,我会接受必要的GRANT 命令的答案。

标签: php mysql connection


【解决方案1】:

这是解决方案:

UPDATE mysql.user SET plugin='mysql_native_password' WHERE user='root' AND host ='localhost';
FLUSH PRIVILEGES;

默认情况下,'root'@'localhost' 配置为通过仅适用于本地 unix 套接字的插件进行身份验证。此命令切换到用户的mysql_native_password 插件,该插件适用于 TCP(我的本地 PHP 安装需要)。

在 UPDATE 2 之后,我比较了 mysql.user 之前和之后重新创建 root@localhost 并发现 plugin 列中的差异。

【讨论】:

  • 谢谢,这已经帮我解决了。
【解决方案2】:

您有 root 用户的密码吗?试试命令

mysql -h 127.0.0.1 -u root -p

如果您运行 mysql_secure_installation,它会阻止远程 root 登录。您可以尝试以下方法来重置 root 用户。

停止 MySQL 服务

#/etc/init.d/mysql stop

使用 --skip-grant-tables 执行 MySQL 服务器

#mysqld -u mysql --skip-grant-tables &

以root身份执行mysql客户端

#mysql -u root

更新您的密码

mysql> update mysql.user set password=password('newpassword') where user='anotheruser';

重新加载权限

mysql> flush privileges;

杀死mysqld

#killall mysql

启动mysql守护进程

#/etc/init.d/mysql start

【讨论】:

  • 我需要一个没有密码的连接。更新了问题。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2016-12-13
  • 2021-05-30
  • 2023-03-08
  • 2018-03-05
  • 2019-12-12
  • 2022-01-24
相关资源
最近更新 更多