对连接到MySQL的问题进行故障排除
如果您在尝试连接到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分发),安装过程将初始化MySQL数据目录,包括
mysql
包含授权表的系统数据库。对于不执行此操作的发行版,必须手动初始化数据目录。有关详细信息,要确定是否需要初始化授权表,请
mysql
在数据目录下查找目录。(数据目录通常命名为dat
,var
并且位于MySQL安装目录下。)确保user.MYD
在mysql
数据库目录中有一个命名文件。如果没有,请初始化数据目录。这样做并启动服务器后,您应该能够连接到服务器。全新安装后,如果尝试
root
不使用密码即可登录服务器,则可能会收到以下错误消息。shell>
mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)这意味着在安装过程中已经分配了root密码,并且必须提供该密码。有关可以分配密码的不同方式,以及在某些情况下如何查找密码,请参见“保护初始MySQL帐户”。如果需要重设根密码,请参见第B.4.3.2节“如何重设根密码”中的说明。找到或重置密码后,
root
使用--password
(或-p
)选项再次登录:shell>
mysql -u root -p Enter password:但是,
root
如果使用mysqld --initialize-insecure初始化了MySQL ,则服务器将允许您不使用密码就可以进行连接(有关详细信息,请参见“初始化数据目录”)。这是安全隐患,因此您应该为该root
帐户设置密码。有关说明,请参见“保护初始MySQL帐户”。- 如果您已将现有的MySQL安装更新为较新的版本,是否执行了MySQL升级过程?如果没有,请这样做。添加新功能后,授权表的结构有时会发生变化,因此,升级后,您应始终确保表具有当前结构。有关说明,请参见“升级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“使用选项文件”中列出了客户端使用的选项文件。“环境变量”中列出了环境变量。
如果收到以下错误,则表明您使用的
root
密码不正确:shell>
mysqladmin -u root -pxxxx ver Access denied for user 'root'@'localhost' (using password: YES)如果即使没有指定密码也发生上述错误,则意味着在某些选项文件中列出了错误的密码。请尝试
--no-defaults
上一项中所述的选项。有关更改密码的信息,请参见“帐户密码管理”。
如果您丢失或忘记了
root
密码,请参见第B.4.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主机缓存。请参见“ DNS查找优化和主机缓存”。
一些永久性的解决方案是:
- 确定您的DNS服务器出了什么问题并进行修复。
- 在MySQL授权表中指定IP地址而不是主机名。
/etc/hosts
在Unix或\windows\hosts
Windows 上输入客户端计算机名称的条目。- 在启用系统变量的情况下启动mysqld
skip_name_resolve
。 - 使用该选项启动mysqld
--skip-host-cache
。 - 在Unix上,如果您正在同一台计算机上运行服务器和客户端,请连接到
localhost
。对于与的连接localhost
,除非指定了确保客户端建立TCP / IP连接的连接参数,否则MySQL程序会尝试使用Unix套接字文件连接到本地服务器。有关更多信息,请参见“使用命令选项连接到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_namesome_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
=,或删除的行= 和= 。删除该行后,请记住发出一条语句以重新加载授权表。另'some_user'
Host
'localhost'
User
''
FLUSH PRIVILEGES
- 如果您能够连接到MySQL服务器,但是
Access denied
在发出SELECT ... INTO OUTFILE
或LOAD DATA
语句时得到一条消息,则user
表中的行未FILE
启用特权。 - 如果直接更改授予表(例如,使用
INSERT
,UPDATE
或DELETE
语句),而您的更改似乎被忽略,请记住,必须执行一条FLUSH PRIVILEGES
语句或mysqladmin flush-privileges命令才能使服务器重新加载特权表。否则,您的更改将在下一次重新启动服务器之前不起作用。请记住,root
使用UPDATE
语句更改密码后,直到刷新特权后才需要指定新密码,因为服务器尚不知道您已更改密码! - 如果您的特权在会话过程中似乎已更改,则可能是MySQL管理员已更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有的连接,如“特权更改何时生效”中所述。
- 如果您在使用Perl,PHP,Python或ODBC程序时遇到访问问题,请尝试使用或连接到服务器。如果您能够使用mysql客户端进行连接,则问题出在您的程序上,而不是访问权限上。(和密码之间没有空格;您也可以使用语法指定密码。如果使用不带密码值的 or 选项,MySQL会提示您输入密码。)
mysql -u user_namedb_name
mysql -u user_name-ppassworddb_name
-p
--password=password
-p
--password
- 为了进行测试,请使用选项启动mysqld服务器
--skip-grant-tables
。然后,您可以更改MySQL授权表,并使用该SHOW GRANTS
语句检查您的修改是否具有所需的效果。当您对更改感到满意时,请执行mysqladmin flush-privileges以告知mysqld服务器重新加载特权。这样,您就可以开始使用新的授权表内容,而无需停止和重新启动服务器。 - 如果其他所有操作均失败,请使用调试选项(例如,)启动mysqld服务器
--debug=d,general,query
。这将打印有关尝试连接的主机和用户信息,以及有关发出的每个命令的信息。请参见“ DBUG软件包”。 - 如果您对MySQL授权表有任何其他问题,并在MySQL Community Slack上询问,请始终提供MySQL授权表的转储。您可以使用mysqldump mysql命令转储表。要提交错误报告,请中的说明。在某些情况下,你可能需要重新启动mysqld的同
--skip-grant-tables
向运行的mysqldump。