如果在尝试连接到MySQL服务器时遇到问题,下面的项目描述了一些可以纠正问题的操作过程。
确保服务器正在运行。如果不是,则客户端无法连接到它。例如,如果连接到服务器的尝试失败,并收到以下消息之一,一个原因可能是服务器没有运行:
$> mysql ERROR 2003:无法连接mysql服务器host_name' (111) $> mysql ERROR 2002: Can't connect to local mysql server through socket '/tmp/mysql. '袜子”(111)
可能是服务器正在运行,但您试图使用TCP/IP端口、命名管道或Unix套接字文件进行连接,而该套接字文件与服务器正在监听的端口不同。若要在调用客户机程序时纠正此错误,请指定
——港口
选项,以指示正确的端口号或——套接字
选项来指示正确的命名管道或Unix套接字文件。要查找套接字文件的位置,可以使用这个命令:$> netstat -ln | grep mysql
确保服务器没有被配置为忽略网络连接,或者(如果您试图远程连接)没有被配置为只在其网络接口上本地监听。方法启动服务器
skip_networking
系统变量已启用,不接受TCP/IP连接。方法启动服务器bind_address
系统变量设置为127.0.0.1
,它只在本地环回接口上监听TCP/IP连接,不接受远程连接。检查并确保没有防火墙阻止对MySQL的访问。您的防火墙可以根据正在执行的应用程序或MySQL用于通信的端口号(默认为3306)进行配置。在Linux或Unix下,检查您的IP表(或类似的)配置,以确保端口没有被阻塞。在Windows下,可能需要配置不阻止MySQL端口的应用程序,如ZoneAlarm或Windows Firewall。
授权表必须正确设置,以便服务器可以使用它们进行访问控制。对于某些发行类型(例如Windows上的二进制发行版,或Linux上的RPM和DEB发行版),安装过程初始化MySQL数据目录,包括
mysql
包含授权表的系统数据库。对于不这样做的发行版,必须手动初始化数据目录。详情请参见第2.10节“安装后设置和测试”.要确定是否需要初始化授权表,请查找
mysql
目录下的数据目录。数据目录通常命名为数据目录数据
或var
它位于MySQL安装目录下。)确保您有一个名为用户。MYD
在mysql
数据库目录。否则,请初始化data目录。这样做并启动服务器之后,您应该能够连接到服务器。在重新安装之后,如果您试图以
根
如果不使用密码,您可能会得到以下错误消息。$> mysql -u root错误1045(28000):拒绝访问用户root @'localhost'(使用密码:NO)
这意味着在安装期间已经分配了一个根密码,必须提供它。看到第2.10.4节“MySQL初始帐户的安全”密码分配的不同方式,以及在某些情况下,如何找到它。如果需要重置root密码,请参见B.3.3.2节“如何重置Root用户密码”.找到或重置密码后,再次以
根
使用——密码
(或- p
)选项:mysql -u root -p Enter password:
但是,服务器将允许您以
根
如果你已经初始化MySQL使用mysqld——initialize-insecure(见第2.10.1节“初始化数据目录”详情)。这是一个安全风险,所以您应该设置密码根
账户;看到第2.10.4节“MySQL初始帐户的安全”的指令。如果您已经将一个现有的MySQL安装升级到一个新版本,您是否执行了MySQL升级过程?如果没有,就照做。当添加新功能时,授权表的结构偶尔会发生变化,因此在升级之后,您应该始终确保表具有当前的结构。有关说明,请参见第2.11节“升级MySQL”.
如果客户端程序在尝试连接时接收到以下错误消息,这意味着服务器希望使用比客户端能够生成的新格式的密码:
mysql客户端不支持服务器请求的认证协议考虑升级MySQL客户端
请记住,客户端程序使用选项文件或环境变量中指定的连接参数。如果您没有在命令行上指定默认连接参数,但客户端程序似乎正在发送错误的默认连接参数,请检查任何适用的选项文件和您的环境。例如,如果你得到
拒绝访问
当您运行一个没有任何选项的客户端时,请确保您没有在任何选项文件中指定旧密码!方法调用选项文件,可以禁止客户端程序使用选项文件
——已
选择。例如:$> mysqladmin——no-defaults -u root版本
中列出了客户端使用的选项文件第4.2.2.2节“使用选项文件”.中列出了环境变量第4.9节,“环境变量”.
如果您得到以下错误,这意味着您正在使用不正确的
根
密码:$> mysqladmin -u root -pxxxxuser 'root'@'localhost'的访问被拒绝(使用的密码:YES)
如果在没有指定密码的情况下出现上述错误,则意味着您在某些选项文件中列出了错误的密码。试
——已
选项,如前一项所述。有关修改密码的信息,请参见第6.2.14节“分配帐户密码”.
如果你已经丢失或忘记了
根
密码,看到B.3.3.2节“如何重置Root用户密码”.本地主机
是本地主机名的同义词,如果您没有显式指定主机,它也是客户端试图连接到的默认主机。你可以使用
——主机= 127.0.0.1
选项显式命名服务器主机。这将导致到本地的TCP/IP连接mysqld服务器。也可以使用TCP/IP协议——主机
选项,该选项使用本地主机的实际主机名。在这种情况下,主机名必须在用户
表上的行,即使您在与服务器相同的主机上运行客户机程序。的
拒绝访问
错误消息告诉您您试图以谁的身份登录,您试图连接的客户机主机,以及您是否使用了密码。通常,你应该有一行在用户
表,它与错误消息中给出的主机名和用户名完全匹配。例如,如果您得到一个包含使用密码:NO
,这意味着您试图在没有密码的情况下登录。如果你得到一个
拒绝访问
连接数据库时发生错误mysql - u
,您可能有问题user_name
用户
表格执行Mysql -u root Mysql
并发出以下SQL语句:SELECT * FROM user;
的结果应该包括一行
宿主
而且用户
列匹配您的客户端主机名和MySQL用户名。如果在尝试从运行MySQL服务器的主机以外的主机进行连接时出现以下错误,则意味着
用户
有扶手的桌子宿主
与客户端主机匹配的值:宿主不允许连接到这个MySQL服务器
您可以通过为连接时使用的客户端主机名和用户名的组合设置一个帐户来解决这个问题。
如果您不知道要连接的机器的IP地址或主机名,则应该与
'%'
随着宿主
中的列值用户
表格尝试从客户机进行连接后,使用选择用户()
查询以查看您实际是如何连接的。然后更改'%'
在用户
表行与日志中显示的实际主机名对应。否则,您的系统将不安全,因为它允许来自任何主机的给定用户名的连接。在Linux上,可能发生此错误的另一个原因是您使用的二进制MySQL版本是用不同版本的
glibc
与您正在使用的库相比。在这种情况下,您应该升级您的操作系统或glibc
,或下载MySQL版本的源代码发行版并自己编译。编译和安装源RPM通常很简单,所以这不是大问题。如果你在尝试连接时指定了主机名,但得到了一个错误消息,其中主机名没有显示或是一个IP地址,这意味着MySQL服务器在试图将客户端主机的IP地址解析为一个名称时出错了:
$> mysqladmin -u root -pxxxx- hsome_hostnameuser 'root'@ "(使用的密码是YES)
如果你试图连接
根
并得到以下错误,这意味着在用户
有扶手的桌子用户
的列值“根”
这mysqld无法为客户端解析主机名:用户" @'未知'被拒绝访问
这些错误表明存在DNS问题。要修复它,请执行mysqladmin flush hosts重置内部DNS主机缓存。看到第5.1.12.3节“DNS查找和主机缓存”.
一些永久的解决办法是:
确定您的DNS服务器出了什么问题并修复它。
在MySQL授权表中指定IP地址而不是主机名。
在其中放入一个客户端机器名称的条目
设置
在Unix或\ windows \主机
在Windows上。开始mysqld与
skip_name_resolve
已启用系统变量。开始mysqld与
——skip-host-cache
选择。在Unix上,如果您在同一台机器上运行服务器和客户机,请连接到
本地主机
.连接到本地主机
例如,MySQL程序尝试使用Unix套接字文件连接到本地服务器,除非指定了连接参数以确保客户端进行TCP/IP连接。有关更多信息,请参见第4.2.4节“使用命令选项连接MySQL服务器”.在Windows上,如果您在同一台机器上运行服务器和客户机,并且服务器支持命名管道连接,则连接到主机名
.
(时期)。连接.
使用命名管道而不是TCP/IP。
如果
Mysql -u root
但工作mysql - h
结果your_hostname
- u根拒绝访问
(your_hostname
是本地主机的实际主机名),您可能没有正确的主机名在用户
表格这里的一个常见问题是宿主
的价值用户
表行指定一个不限定的主机名,但是系统的名称解析例程返回一个完全限定的域名(反之亦然)。例如,如果您与host有一个行“冥王星”
在用户
但是你的DNS告诉MySQL你的主机名是“pluto.example.com”
,行不工作。对象中添加一行用户
表,其中包含主机的IP地址作为宿主
列值。(或者,您也可以向用户
有扶手的桌子宿主
值,其中包含通配符(例如,“pluto. %”
).然而,使用宿主
值以%
是不安全的,是不推荐!)如果
mysql - u
但工作user_name
mysql - u
您没有授予指定用户对数据库的访问权吗user_name
some_db
some_db
.如果
mysql - u
在服务器主机上执行时工作,但是user_name
mysql - h
在远程客户端主机上执行时无法工作,因为您没有启用从远程主机对给定用户名的服务器的访问。host_name
- uuser_name
如果你不知道为什么你会
拒绝访问
,取出用户
表具有的所有行宿主
包含通配符的值(包含'%'
或“_”
字符)。一个非常常见的错误是插入新行宿主
='%'
而且用户
='
,认为这样可以使您指定some_user
'本地主机
从同一台机器连接。这不起作用的原因是默认特权包含一行宿主
=“localhost”
而且用户
=”
.因为这一行有a宿主
价值“localhost”
这比'%'
时,它优先于连接时的新行本地主机
!正确的过程是插入第二行宿主
=“localhost”
而且用户
='
,或删除与的行some_user
'宿主
=“localhost”
而且用户
=”
.删除行之后,记得发出一个冲洗的特权
语句来重新加载授权表。另请参阅第6.2.6节,“访问控制,第一阶段:连接验证”.如果你能够连接到MySQL服务器,但得到一个
拒绝访问
消息选择……到输出文件
或加载数据
语句,你的行用户
表中没有文件
特权启用。如果您直接更改授权表(例如,使用
插入
,更新
,或删除
语句),您的更改似乎会被忽略,请记住,您必须执行冲洗的特权
语句或mysqladmin flush-privileges命令使服务器重新加载特权表。否则,您的更改在下次重新启动服务器之前都不会生效。记住,当你改变根
密码带有更新
语句,则在刷新特权之后才需要指定新密码,因为直到此时服务器才知道您已经更改了密码。如果您的特权似乎在会话过程中发生了更改,那么可能是MySQL管理员更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有的连接第6.2.13节,“当特权更改生效时”.
如果您在使用Perl、PHP、Python或ODBC程序时遇到访问问题,请尝试使用
mysql - u
或user_name
db_name
mysql - u
.如果您能够使用mysql客户端,问题出在您的程序上,而不是访问权限。(两者之间没有空隙user_name
- p密码
db_name
- p
和密码;你也可以使用——密码=
指定密码的语法。如果您使用密码
- p
或——密码
选项没有密码值,MySQL会提示您输入密码。)对于测试目的,请启动mysqld的服务器
——skip-grant-tables
选择。然后您可以更改MySQL授权表并使用秀奖助金
语句来检查您的修改是否达到了预期的效果。当您对更改感到满意时,执行mysqladmin flush-privileges告诉mysqld服务器重新加载权限。这使您可以开始使用新的授权表内容,而无需停止和重新启动服务器。如果其他方法都失败了,启动mysqld服务器带有调试选项(例如,
debug = d,一般情况下,查询
).这将打印关于尝试连接的主机和用户信息,以及关于发出的每个命令的信息。看到第5.9.4节“DBUG包”.如果您对MySQL授权表有任何其他问题,请询问MySQL社区Slack,总是提供MySQL授权表的转储。你可以用, mysqldump mysql命令。要提交错误报告,请参见第1.6节“如何报告错误或问题”.在某些情况下,您可能需要重新启动mysqld与
——skip-grant-tables
运行, mysqldump.