如果您在尝试连接到 MySQL 服务器时遇到问题,以下项目描述了您可以采取的一些措施来纠正问题。
-
确保服务器正在运行。如果不是,则客户端无法连接到它。例如,如果尝试连接到服务器失败并显示如下消息之一,一个原因可能是服务器没有运行:
shell> mysql ERROR 2003: Can't connect to MySQL server on 'host_name' (111) shell> mysql ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
复制 -
可能是服务器正在运行,但您尝试使用与服务器正在侦听的端口不同的 TCP/IP 端口、命名管道或 Unix 套接字文件进行连接。要在调用客户端程序时更正此问题,请指定一个
--port
选项来指示正确的端口号,或者指定一个 选项来指示--socket
正确的命名管道或 Unix 套接字文件。要找出套接字文件的位置,您可以使用以下命令:shell> netstat -ln | grep mysql
复制 -
确保服务器未配置为忽略网络连接或(如果您尝试远程连接)未将其配置为仅在其网络接口上本地侦听。如果服务器在
skip_networking
启用系统变量的情况下启动,则不接受任何 TCP/IP 连接。如果服务器在bind_address
系统变量设置为 的情况下启动127.0.0.1
,则它仅在环回接口上本地侦听 TCP/IP 连接,并且不接受远程连接。 -
检查以确保没有防火墙阻止对 MySQL 的访问。您的防火墙可能会根据正在执行的应用程序或 MySQL 用于通信的端口号(默认为 3306)进行配置。在 Linux 或 Unix 下,检查您的 IP 表(或类似)配置以确保端口未被阻止。在 Windows 下,可能需要将 ZoneAlarm 或 Windows 防火墙等应用程序配置为不阻止 MySQL 端口。
-
必须正确设置授权表,以便服务器可以使用它们进行访问控制。对于某些分发类型(例如 Windows 上的二进制分发,或 Linux 上的 RPM 和 DEB 分发),安装过程会初始化 MySQL 数据目录,包括
mysql
包含授权表的 系统数据库。对于不这样做的发行版,您必须手动初始化数据目录。有关详细信息,请参阅 第 2.10 节 “安装后设置和测试”。要确定是否需要初始化授权表,请
mysql
在数据目录下查找目录。(数据目录通常命名为data
orvar
并且位于您的 MySQL 安装目录下。)确保您user.MYD
在mysql
数据库目录中有一个命名的文件。如果没有,则初始化数据目录。这样做并启动服务器后,您应该能够连接到服务器。 -
全新安装后,如果您尝试在
root
不使用密码的情况下登录服务器,您可能会收到以下错误消息。shell> mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
复制这意味着在安装过程中已经分配了一个 root 密码,并且必须提供它。请参阅 第 2.10.4 节,“保护初始 MySQL 帐户的安全”,了解分配密码的不同方式,以及在某些情况下如何找到它。如果您需要重置 root 密码,请参阅第 B.3.3.2 节“如何重置 Root 密码”中的说明。找到或重置密码后,
root
使用--password
(或-p
) 选项再次登录 :shell> mysql -u root -p Enter password:
复制但是,
root
如果您使用mysqld --initialize-insecure初始化 MySQL ,服务器将允许您在不使用密码的情况下进行连接 (有关详细信息,请参阅 第 2.10.1 节,“初始化数据目录”)。这是一种安全风险,因此您应该为该root
帐户设置密码 ;有关说明,请参阅 第 2.10.4 节,“保护初始 MySQL 帐户”。 -
如果您已将现有 MySQL 安装更新到较新版本,您是否执行了 MySQL 升级过程?如果没有,请这样做。当添加新功能时,授权表的结构偶尔会发生变化,因此在升级之后,您应该始终确保您的表具有当前结构。有关说明,请参阅第 2.11 节,“升级 MySQL”。
-
如果客户端程序在尝试连接时收到以下错误消息,则意味着服务器需要比客户端能够生成的格式更新的密码:
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client
复制 -
请记住,客户端程序使用在选项文件或环境变量中指定的连接参数。如果客户端程序在您未在命令行中指定它们时似乎发送了不正确的默认连接参数,请检查任何适用的选项文件和您的环境。例如,如果您
Access denied
在没有任何选项的情况下运行客户端时出现,请确保您没有在任何选项文件中指定旧密码!您可以通过使用选项调用客户端程序来禁止客户端程序使用选项文件
--no-defaults
。例如:shell> mysqladmin --no-defaults -u root version
复制客户端使用的选项文件在第 4.2.2.2 节“使用选项文件”中列出 。环境变量在第 4.9 节“环境变量”中列出。
-
如果出现以下错误,则表示您使用了错误的
root
密码:shell> mysqladmin -u root -pxxxx ver Access denied for user 'root'@'localhost' (using password: YES)
复制如果未指定密码也出现上述错误,则表示某些选项文件中列出的密码不正确。尝试
--no-defaults
上一项中所述的 选项。有关更改密码的信息,请参阅 第 6.2.14 节 “分配帐户密码”。
如果您丢失或忘记了
root
密码,请参阅第 B.3.3.2 节“如何重置根密码”。 -
localhost
是本地主机名的同义词,如果您未明确指定主机,它也是客户端尝试连接的默认主机。您可以使用一个
--host=127.0.0.1
选项来明确命名服务器主机。这会导致到本地mysqld 服务器的 TCP/IP 连接。您还可以通过指定--host
使用本地主机的实际主机名的选项来使用 TCP/IP 。在这种情况下,必须user
在服务器主机上的表行中指定主机名,即使您在与服务器相同的主机上运行客户端程序。 -
该
Access denied
错误消息会告诉您尝试以谁的身份登录、尝试连接的客户端主机以及是否使用了密码。通常,user
表中应该有一行 与错误消息中给出的主机名和用户名完全匹配。例如,如果您收到包含 的错误消息using password: NO
,则表示您尝试在没有密码的情况下登录。 -
如果
Access denied
在尝试使用 连接到数据库时出现错误,则表可能有问题。通过执行并发出以下 SQL 语句来检查这一点:mysql -u *
user_name*``user``mysql -u root mysql
SELECT * FROM user;
复制结果应包含一行,其中
Host
和User
列与您的客户端主机名和您的 MySQL 用户名相匹配。 -
如果尝试从运行 MySQL 服务器的主机以外的主机连接时出现以下错误,则表示
user
表中没有Host
与客户端主机匹配的值的行:Host ... is not allowed to connect to this MySQL server
复制您可以通过为尝试连接时使用的客户端主机名和用户名组合设置帐户来解决此问题。
如果您不知道要连接的机器的 IP 地址或主机名,则应在表中放置一行
'%'
作为Host
列值user
。尝试从客户端计算机连接后,使用SELECT USER()
查询来查看您是如何真正连接的。然后'%'
将user
表行中的更改为日志中显示的实际主机名。否则,您的系统将不安全,因为它允许来自任何主机的给定用户名的连接。在 Linux 上,可能发生此错误的另一个原因是您使用的是二进制 MySQL 版本,该版本
glibc
是使用与您正在使用的库版本不同的库版本编译的。在这种情况下,您应该升级您的操作系统或glibc
,或者下载 MySQL 版本的源代码分发并自行编译。源 RPM 的编译和安装通常是微不足道的,所以这不是一个大问题。 -
如果在尝试连接时指定了主机名,但收到错误消息,其中主机名未显示或为 IP 地址,则表示 MySQL 服务器在尝试将客户端主机的 IP 地址解析为时出错一个名字:
shell> mysqladmin -u root -pxxxx -h some_hostname ver Access denied for user 'root'@'' (using password: YES)
复制如果您尝试以 as 连接
root
并收到以下错误,则表示user
表中没有User
列值为 的行,'root'
并且 mysqld无法解析客户端的主机名:Access denied for user ''@'unknown'
复制这些错误表明存在 DNS 问题。要修复它,请执行 mysqladmin flush-hosts以重置内部 DNS 主机缓存。请参见第 5.1.12.3 节,“DNS 查找和主机缓存”。
一些永久的解决方案是:
- 确定您的 DNS 服务器出了什么问题并修复它。
- 在 MySQL 授权表中指定 IP 地址而不是主机名。
/etc/hosts
在 Unix 或\windows\hosts
Windows上 为客户端机器名称输入一个条目 。- 在 启用系统变量的情况下 启动mysqld
skip_name_resolve
。 - 使用该 选项 启动mysqld
--skip-host-cache
。 - 在 Unix 上,如果您在同一台机器上运行服务器和客户端,请连接到
localhost
. 对于到 的连接localhost
,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器,除非指定了连接参数以确保客户端建立 TCP/IP 连接。有关更多信息,请参阅 第 4.2.4 节,“使用命令选项连接到 MySQL 服务器”。 - 在 Windows 上,如果您在同一台机器上运行服务器和客户端,并且服务器支持命名管道连接,请连接到主机名
.
(句点)。连接到.
使用命名管道,而不是TCP / IP。
-
如果
mysql -u root
工作但 导致(本地主机的实际主机名在哪里 ),则表中可能没有正确的主机名称。这里的一个常见问题是表行中的值 指定了一个不合格的主机名,但您系统的名称解析例程返回一个完全合格的域名(反之亦然)。例如,如果您在 表中有一行包含主机,但您的 DNS 告诉 MySQL 您的主机名是,则该行不起作用。尝试在包含主机 IP 地址的表中添加一行 作为mysql -h *
your_hostname* -u root``Access denied
your_hostname
user``Host``user``'pluto'``user``'pluto.example.com'``user``Host
列值。(或者,您可以user
使用Host
包含通配符的值(例如,'pluto.%'
)向表中添加一行 。但是,使用以Host
结尾的 值%
是不安全的, 不推荐使用!) -
如果有效但 无效,则您尚未授予对名为 的数据库的给定用户的访问权限。
mysql -u *
user_name*``mysql -u *
user_name* *
some_db*
some_db
-
如果在服务器主机上执行时有效,但在远程客户端主机上执行时无效,则您尚未启用对来自远程主机的给定用户名的服务器访问。
mysql -u *
user_name*``mysql -h *
host_name* -u *
user_name*
-
如果您不知道为什么会得到
Access denied
,请从user
表中删除所有Host
值包含通配符的行(包含'%'
或'_'
字符的行)。一个非常常见的错误是使用Host
='%'
和User
=插入新行 ,认为这使您可以指定 从同一台机器连接。这不起作用的原因是默认权限包括带有=和 =的行 。因为该行的值 比'*
some_user*'``localhost``Host``'localhost'``User``''``Host``'localhost'``'%'
,从localhost
!连接时优先使用新行!正确的步骤是插入一个第二行与Host
='localhost'
和User
= ,或删除的行 =和 = 。删除行后,记得发出一条语句来重新加载授权表。另请参见第 6.2.6 节“访问控制,第 1 阶段:连接验证”。'*
some_user*'``Host``'localhost'``User``''
FLUSH PRIVILEGES
-
如果您能够连接到 MySQL 服务器,但
Access denied
每次发出SELECT ... INTO OUTFILE
orLOAD DATA
语句时都会收到一条 消息 ,则user
表中的行没有FILE
启用特权。 -
如果您直接更改授权表(例如,通过使用
INSERT
、UPDATE
、 或DELETE
语句)并且您的更改似乎被忽略,请记住您必须执行FLUSH PRIVILEGES
语句或 mysqladmin flush-privileges命令以使服务器重新加载权限表。否则,您的更改在下次重新启动服务器之前不会生效。请记住,root
使用UPDATE
语句更改 密码 后,在刷新权限之前不需要指定新密码,因为在此之前服务器不知道您更改了密码。 -
如果您的权限似乎在会话中间发生了更改,则可能是 MySQL 管理员更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有连接,如第 6.2.13 节“权限更改生效时”所示。
-
如果您在使用 Perl、PHP、Python 或 ODBC 程序时遇到访问问题,请尝试使用或连接到服务器。如果您能够使用mysql客户端进行连接,则问题在于您的程序,而不是访问权限。(和密码之间没有空格;您也可以使用 语法来指定密码。如果您使用没有密码值的 或 选项,MySQL 会提示您输入密码。)
mysql -u *
user_name* *
db_name*``mysql -u *
user_name* -p*
password* *
db_name*``-p
--password=*
password*
-p
--password
-
出于测试目的,请 使用该选项启动mysqld服务器
--skip-grant-tables
。然后您可以更改 MySQL 授权表并使用该SHOW GRANTS
语句检查您的修改是否达到预期效果。当您对更改感到满意时,执行mysqladmin flush-privileges告诉 mysqld服务器重新加载权限。这使您无需停止和重新启动服务器即可开始使用新的授权表内容。 -
如果其他一切都失败了,请 使用调试选项(例如,)启动mysqld服务器
--debug=d,general,query
。这将打印有关尝试连接的主机和用户信息,以及有关发出的每个命令的信息。请参见 第 5.9.4 节,“DBUG 包”。 -
如果您对 MySQL 授权表有任何其他问题并在MySQL Community Slack上询问 ,请始终提供 MySQL 授权表的转储。您可以使用mysqldump mysql命令转储这些表。要提交错误报告,请参阅第 1.6 节“如何报告错误或问题”中的说明。在某些情况下,你可能需要重新启动mysqld的同
--skip-grant-tables
向运行 的mysqldump。