如果在尝试连接到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包含授权表的系统数据库。对于不执行此操作的发行版,必须手动初始化数据目录。有关详细信息,请参见第2.10节“安装后的设置和测试”。

要确定是否需要初始化授权表,请mysql在数据目录下查找目录。(数据目录通常命名为 data,var并且位于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.4.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.4.3.2节“如何重设根密码”。
localhost 是本地主机名的同义词,也是显式未指定主机的客户端尝试连接的默认主机。

您可以使用--host=127.0.0.1 选项来明确命名服务器主机。这将建立与本地mysqld 服务器的TCP / IP连接。您还可以通过指定--host使用本地主机的实际主机名的选项来使用TCP / IP 。在这种情况下,user即使您在与服务器相同的主机上运行客户端程序,也必须在服务器主机上的表行中指定主机名。
该Access denied错误消息会告诉您您要尝试登录的用户,您要尝试与其连接的客户端主机以及是否正在使用密码。通常,user表中应有一行 与错误消息中给出的主机名和用户名完全匹配。例如,如果收到包含的错误消息 using password: NO,则表示您尝试不使用密码登录。

如果Access denied使用尝试连接到数据库时遇到错误,则表可能有问题。通过执行 mysql -u user_name user和mysql -u root mysql发出此SQL语句来检查此情况:

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主机缓存。请参见第8.12.4.2节“ DNS查找优化和主机缓存”。

一些永久性的解决方案是:
确定您的DNS服务器出了什么问题并进行修复。
在MySQL授权表中指定IP地址而不是主机名。
/etc/hosts在Unix或\windows\hostsWindows 上 输入客户端计算机名称的条目 。
在 启用系统变量的情况下 启动mysqldskip_name_resolve。
使用该 选项 启动mysqld--skip-host-cache。
在Unix上,如果您正在同一台计算机上运行服务器和客户端,请连接到localhost。对于与的连接localhost,除非指定了连接参数以确保客户端建立TCP / IP连接,否则MySQL程序会尝试使用Unix套接字文件连接到本地服务器。有关更多信息,请参见 第4.2.4节“使用命令选项连接到MySQL服务器”。

在Windows上,如果服务器和客户端在同一台计算机上运行,并且服务器支持命名管道连接,请连接到主机名. (句点)。连接到.使用命名管道,而不是TCP / IP。

如果mysql -u root可行但 导致(本地主机的实际主机名在哪里), 则表中的主机名可能不正确。此处的一个常见问题是,表行中的值 指定了不合格的主机名,但是系统的名称解析例程返回了完全合格的域名(反之亦然)。举例来说,如果你有一排主机的 表,但是你的DNS告诉MySQL你的主机名是,行也不行。尝试在包含主机IP地址的表中添加一行 作为mysql -h your_hostname -u rootAccess deniedyour_hostnameuserHostuser'pluto'user'pluto.example.com'userHost列值。(或者,您可以在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'localhostHost'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或LOAD DATA 语句时得到一条 消息 ,则user表中的行未FILE启用特权。

如果直接更改授予表(例如,使用 INSERT, UPDATE或 DELETE语句),而您的更改似乎被忽略,请记住,必须执行一条 FLUSH PRIVILEGES语句或 mysqladmin flush-privileges命令才能使服务器重新加载特权表。否则,您的更改将在下一次重新启动服务器之前不起作用。请记住,root使用UPDATE语句更改密码 后 ,直到刷新特权后才需要指定新密码,因为服务器尚不知道您已更改密码!

如果您的特权在会话过程中似乎已更改,则可能是MySQL管理员已更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有的连接,如第6.2.13节“特权更改何时生效”中所述。

如果您在使用Perl,PHP,Python或ODBC程序时遇到访问问题,请尝试使用或连接到服务器。如果您能够使用mysql客户端进行连接,则问题出在您的程序上,而不是访问权限上。(和密码之间没有空格;您也可以使用 语法指定密码。如果使用不带密码值的 or 选项,MySQL会提示您输入密码。) mysql -u user_name db_namemysql -u user_name -ppassword db_name-p--password=password-p--password

为了进行测试,请 使用选项启动mysqld服务器 --skip-grant-tables。然后,您可以更改MySQL授权表,并使用该 SHOW GRANTS语句检查您的修改是否具有所需的效果。当您对更改感到满意时,执行mysqladmin flush-privileges告诉 mysqld服务器重新加载特权。这使您可以开始使用新的授权表内容,而无需停止和重新启动服务器。

如果其他所有操作均失败,请 使用调试选项(例如,)启动mysqld服务器 --debug=d,general,query。这将打印有关尝试连接的主机和用户信息,以及有关发出的每个命令的信息。请参见 第29.5.4节“ DBUG软件包”。

如果您对MySQL授权表有任何其他问题,并在MySQL Community Slack上询问 ,请始终提供MySQL授权表的转储。您可以使用mysqldump mysql命令转储表。要提交错误报告,请参见第1.7节“如何报告错误或问题”中的说明。在某些情况下,你可能需要重新启动mysqld的同 --skip-grant-tables向运行 的mysqldump。