如果您尝试连接到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端口,名为pipe或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
数据库目录中命名的文件。如果没有,请初始化数据目录。执行此操作并启动服务器后,通过执行此命令测试初始权限:shell> mysql -u root
服务器应该让你连接没有错误。
-
全新安装后,您应该连接到服务器并设置用户及其访问权限:
shell> mysql -u root mysql
如果您使用mysqld初始化MySQL --initialize-secure不为初始
root
帐户创建密码,则服务器应允许您连接密码(请参见 第2.10.1.1节“使用mysqld手动初始化数据目录”)。这是一个安全风险,因此设置root
帐户的密码 是您在设置其他MySQL帐户时应该执行的操作。有关设置初始密码的说明,请参见 第2.10.4节“保护初始MySQL帐户”。 -
如果您将现有的MySQL安装更新到较新版本,您是否运行mysql_upgrade 脚本?如果没有,请这样做。添加新功能时,授权表的结构会偶尔更改,因此升级后应始终确保表具有当前结构。有关说明,请参见 第4.4.7节“ mysql_upgrade - 检查和升级MySQL表”。
-
如果客户端程序在尝试连接时收到以下错误消息,则表示服务器希望以比客户机能够生成的更新格式的密码:
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client
有关如何处理的信息,请参见 第6.1.2.4节“MySQL中的密码哈希”和 第B.5.2.4节“客户端不支持身份验证协议”。
-
请记住,客户端程序使用在选项文件或环境变量中指定的连接参数。如果在命令行上没有指定客户端程序似乎发送不正确的默认连接参数,请检查任何适用的选项文件和环境。例如,如果您
Access denied
在运行客户端时没有任何选项,请确保您没有在任何选项文件中指定旧密码!您可以通过使用该选项来禁止客户端程序使用选项文件
--no-defaults
。例如:shell> mysqladmin --no-defaults -u root version
客户端使用的选项文件列在 第4.2.6节“使用选项文件”中。环境变量列在第4.9节“MySQL程序环境变量”中。
-
如果您收到以下错误,则表示您使用的
root
密码不正确:shell> mysqladmin -u root -pxxxx ver Access denied for user 'root'@'localhost' (using password: YES)
如果即使没有指定密码也会出现上述错误,这意味着您在某些选项文件中列出了错误的密码。尝试
--no-defaults
上述项目中所述的选项。有关更改密码的信息,请参见 第6.3.6节“分配帐户密码”。
如果丢失或忘记了
root
密码,请参阅B.5.3.2节“如何重置根密码”。 -
如果您使用
SET PASSWORD
,INSERT
或 更改密码UPDATE
,则必须使用该PASSWORD()
功能对密码进行加密。如果您不使用PASSWORD()
这些语句,密码将无法正常工作。例如,以下语句分配密码,但无法对其进行加密,因此用户以后无法连接:SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
而是像这样设置密码:
SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');
-
PASSWORD()
当使用CREATE USER
orGRANT
语句或 mysqladmin password命令指定密码时, 该函数是不必要的 。每个都会自动使用PASSWORD()
密码加密。请参见 第6.3.6节“分配帐户密码”和 第13.7.1.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上,可能会发生此错误的另一个原因是您使用的是使用不同版本的
glibc
库编译的二进制MySQL版本。在这种情况下,您应该升级您的操作系统glibc
,或者下载MySQL版本的源代码,并自行编译。源RPM通常是简单的编译和安装,所以这不是一个大问题。 -
如果在尝试连接时指定主机名,但是收到主机名未显示或是IP地址的错误消息,则表示在尝试解析客户端主机的IP地址时出现错误一个名字:
shell> mysqladmin -u root -pxxxx -h some_hostname ver Access denied for user 'root'@'' (using password: YES)
如果您尝试连接
root
并获取以下错误,则表示您的user
表中没有User
列值,'root'
并且 mysqld无法解析客户端的主机名:Access denied for user ''@'unknown'
这些错误表示DNS问题。要修复它,请执行 mysqladmin flush-hosts以重置内部DNS主机缓存。请参见第8.12.5.2节“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.2节“连接到MySQL服务器”。 -
在Windows上,如果您在同一台计算机上运行服务器和客户端,并且服务器支持命名管道连接,则连接到主机名
.
(句点)。连接.
使用命名管道而不是TCP / IP。
-
-
如果
mysql -u root
工作但是 导致(本地主机的实际主机名在哪里 ),表中的主机可能没有正确的名称。这里常见的一个问题是表行中的值 指定了不合格的主机名,但是系统的名称解析例程返回完全限定的域名(反之亦然)。例如,如果您在 表中有一行与主机,但您的DNS告诉MySQL您的主机名是该行不起作用。尝试向包含主机IP地址的表添加一行 作为列值。mysql -h
your_hostname
-u rootAccess 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
-uuser_name
-
如果您无法弄清楚原因
Access denied
,请从user
表中删除所有Host
包含通配符(包含'%'
或'_'
字符的行)的行。一个非常常见的错误是使用Host
='%'
andUser
= 插入一个新行 ,认为这样可以指定 从同一台机器进行连接。这不起作用的原因是默认权限包括带有= 和 = 的行 。因为该行的值 比以前更具体 ,当连接时,它优先于新行!正确的步骤是插入一个第二行与 = 和 = ,或删除的行 = 和 = 。删除该行后,请记住发出一个 语句以重新载入授权表。另见第6.2.4节“访问控制,阶段1:连接验证”。删除该行后,请记住发出一个语句以重新载入授权表。另见第6.2.4节“访问控制,阶段1:连接验证”。删除该行后,请记住发出一个语句以重新载入授权表。另见第6.2.4节“访问控制,阶段1:连接验证”。'
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 INFILE
声明时会收到 消息 ,user
表中的行将 不FILE
启用该 权限。 -
如果直接更改授予表(例如,通过使用
INSERT
,,UPDATE
或DELETE
语句),并且您的更改似乎被忽略,请记住必须执行FLUSH PRIVILEGES
语句或mysqladmin flush-privileges命令才能使服务器重新加载权限表。否则,您的更改在下次重新启动服务器之前无效。记住,在root
使用UPDATE
语句更改密码后,在刷新权限之前不需要指定新密码,因为服务器不知道您已经更改了密码! -
如果您的权限似乎在会话中间发生变化,那么MySQL管理员可能会更改它们。重新加载授予表会影响新的客户端连接,但它也会影响现有连接,如第6.2.6节“权限更改生效时”所示。
-
如果您有访问Perl,PHP,Python或ODBC程序的问题,请尝试使用或连接到服务器。如果您能够使用mysql客户端进行连接,问题在于您的程序,而不是访问权限。(有之间没有空格和密码;您还可以使用 语法来指定密码。如果您使用。 或 选择不使用密码的值时,MySQL提示你输入密码。)
mysql -u
user_name
db_name
mysql -u
user_name
-pyour_pass
db_name
-p
--password=
your_pass
-p
--password
-
出于测试目的,请 使用该选项启动mysqld服务器
--skip-grant-tables
。然后,您可以更改MySQL授权表,并使用该SHOW GRANTS
语句来检查您的修改是否具有所需的效果。当您对更改感到满意时,请执行mysqladmin flush-privileges来告诉 mysqld服务器重新加载权限。这样可以在不停止和重新启动服务器的情况下开始使用新的授权表内容。 -
如果一切都失败,请 使用调试选项启动mysqld服务器(例如
--debug=d,general,query
)。这将打印有关尝试连接的主机和用户信息,以及发出的每个命令的信息。请参见 第28.5.3节“DBUG软件包”。 -
如果您的MySQL授权表有任何其他问题,并且感觉您必须将问题发布到邮件列表中,请始终提供MySQL授权表的转储。您可以使用mysqldump mysql命令转储表。要提交错误报告,请参阅 第1.7节“如何报告错误或问题”中的说明。在某些情况下,你可能需要重新启动mysqld的与
--skip-grant-tables
运行 的mysqldump
-