如果您在尝试连接MySQL服务器时遇到问题,下面的项目描述了一些您可以采取的纠正问题的操作过程。
确保服务器正在运行。如果不是,客户端无法连接到它。例如,如果尝试连接到服务器失败,出现如下消息之一,其中一个原因可能是服务器未运行:
mysql服务器连接错误host_name' (111) $> mysql ERROR 2002: cannot 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操作系统下,ZoneAlarm或Windows Firewall等应用程序可能需要配置为不阻塞MySQL端口。
必须正确设置授权表,以便服务器可以使用它们进行访问控制。对于某些发行版类型(如Windows上的二进制发行版,Linux上的RPM和DEB发行版),安装过程会初始化MySQL data目录,包括
mysql
包含授权表的系统数据库。对于不这样做的发行版,必须手动初始化数据目录。详细信息请参见第2.10节,“安装后的设置和测试”。要确定是否需要初始化授权表,请查找
mysql
目录下的。(数据目录通常命名为数据
或var
并且位于MySQL安装目录下。)确保您有一个名为用户。MYD
在mysql
数据库目录。如果不是这样,初始化数据目录。在这样做并启动服务器之后,您应该能够连接到服务器。重新安装后,如果您尝试以
根
如果不使用密码,您可能会收到以下错误消息。$> mysql -u root错误1045(28000):访问拒绝用户'root'@'localhost(使用密码:NO)
这意味着在安装过程中已经分配了根密码,必须提供这个密码。看到第2.10.4节“保护MySQL初始帐户”关于密码可能被分配的不同方式,以及在某些情况下如何找到它。如果需要重置root密码,请参见第B.3.3.2节“如何重置Root密码”。找到或重置密码后,请以
根
使用——密码
(或- p
)选项:$> mysql -u root -p输入密码
但是,服务器将允许您以
根
如果你已经初始化MySQL使用mysqld——initialize-insecure(见第2.10.1节“初始化数据目录”详情)。这是一个安全风险,所以您应该为根
账户;看到第2.10.4节“保护MySQL初始帐户”的指令。如果您已将现有的MySQL安装更新到新版本,您是否执行了MySQL升级过程?如果没有,就这样做。当添加新功能时,授权表的结构偶尔会发生变化,因此在升级后,您应该始终确保表具有当前结构。有关说明,请参见第2.11节“升级MySQL”。
如果客户端程序在尝试连接时收到以下错误消息,这意味着服务器希望使用比客户端能够生成的格式更新的密码:
mysql客户端不支持服务器请求的认证协议;考虑升级MySQL客户端
有关如何处理此问题的信息,请参见第6.4.1.3节,“从Pre-4.1版本的密码哈希和mysql_old_password插件迁移”。
请记住,客户机程序使用选项文件或环境变量中指定的连接参数。如果您没有在命令行中指定默认连接参数,而客户机程序似乎正在发送不正确的默认连接参数,请检查任何适用的选项文件和您的环境。例如,如果你得到
拒绝访问
当您运行没有任何选项的客户端时,请确保您没有在任何选项文件中指定旧密码!方法调用选项文件,可以禁止客户端程序使用选项文件
——已
选择。例如:$> mysqladmin——no-defaults -u root version
中列出了客户端使用的选项文件第4.2.2.2节“使用选项文件”。中列出了环境变量第4.9节,“环境变量”。
如果出现以下错误,则表示您使用了不正确的
根
密码:$> mysqladmin -u root -pxxxx用户'root'@'localhost'访问被拒绝(使用密码:YES)
如果在没有指定密码的情况下出现上述错误,则说明在某个选项文件中列出了不正确的密码。试
——已
选项,如前一项所述。有关更改密码的信息,请参见第6.2.10节“分配帐户密码”。
如果你已经丢失或忘记了
根
密码,看到第B.3.3.2节“如何重置Root密码”。本地主机
是本地主机名的同义词,如果未显式指定主机,它也是客户端尝试连接的默认主机。你可以使用
——主机= 127.0.0.1
选项显式地命名服务器主机。这将建立到本地的TCP/IP连接mysqld服务器。也可以通过指定a来使用TCP/IP——主机
选项,使用本地主机的实际主机名。在这种情况下,主机名必须在用户
即使您在与服务器相同的主机上运行客户端程序,也可以在服务器主机上的表行。的
拒绝访问
错误消息告诉您尝试以谁的身份登录、尝试从中连接的客户端主机以及是否使用了密码。通常,你应该有一行用户
表,该表与错误消息中给出的主机名和用户名完全匹配。例如,如果您得到一条错误消息,其中包含使用密码:NO
,这意味着您试图在没有密码的情况下登录。如果你得到
拒绝访问
连接到数据库时出现错误mysql - u
,你可能有问题user_name
用户
表格通过执行以下命令来检查这一点Mysql -u root Mysql
并发出以下SQL语句:SELECT * FROM user;
结果应该包括一行
宿主
和用户
列匹配您的客户端主机名和MySQL用户名。如果当您尝试从运行MySQL服务器的主机以外的主机连接时出现以下错误,则意味着数据库中没有行
用户
带a的桌子宿主
匹配客户端主机的值:宿主不允许连接到这个MySQL服务器
您可以通过为尝试连接时使用的客户端主机名和用户名的组合设置一个帐户来解决这个问题。
如果您不知道正在连接的机器的IP地址或主机名,则应该用
“%”
随着宿主
的列值。用户
表格尝试从客户端机器连接后,使用选择用户()
查询,看看你是如何真正连接的。然后改变“%”
在用户
将表行转换为日志中显示的实际主机名。否则,您的系统将变得不安全,因为它允许使用给定用户名从任何主机进行连接。在Linux上,可能发生此错误的另一个原因是,您使用的是二进制MySQL版本,该版本使用不同版本的
glibc
库比你正在使用的那个。在这种情况下,您应该升级操作系统或glibc
,或下载MySQL版本的源代码发行版并自己编译它。编译和安装源RPM通常很简单,所以这不是一个大问题。如果你在尝试连接时指定了一个主机名,但是得到一个错误消息,其中主机名没有显示或者是一个IP地址,这意味着MySQL服务器在试图将客户端主机的IP地址解析为一个名称时得到了一个错误:
$> mysqladmin -u root -pxxxx- hsome_hostname用户“root”@被拒绝访问(使用密码:YES)
如果你试着连接
根
并得到以下错误,这意味着您在用户
带a的桌子用户
的列值“根”
这mysqld无法解析客户端的主机名:用户“@”未知被拒绝访问
这些错误表明DNS有问题。要修复它,请执行mysqladmin flush hosts重置内部DNS主机缓存。看到第5.1.11.2节,“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地址作为宿主
列值。(或者,您可以向用户
带a的桌子宿主
包含通配符的值(例如,“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.5节,访问控制,阶段1:连接验证。如果您能够连接到MySQL服务器,但得到一个
拒绝访问
消息选择……到输出文件
或加载数据
声明,你的行在用户
表中没有文件
特权启用。如果您直接更改授权表(例如,使用
插入
,更新
,或删除
语句),并且您的更改似乎会被忽略,请记住,您必须执行冲洗的特权
语句或mysqladmin flush-privileges命令,使服务器重新加载特权表。否则,直到下次重新启动服务器时,您的更改才会生效。记住,在你改变后根
带字符的密码更新
语句时,在刷新特权之前不需要指定新密码,因为服务器还不知道您已经更改了密码。如果您的特权似乎在会话中发生了变化,那么可能是MySQL管理员更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有连接,如第6.2.9节“特权变更何时生效”。
如果在使用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.8.3节“DBUG包”。如果您对MySQL授权表有任何其他问题,请在MySQL社区Slack,总是提供MySQL授权表的转储。可以转储表, mysqldump mysql命令。要提交错误报告,请参见第1.6节,“如何报告bug或问题”。在某些情况下,您可能需要重新启动mysqld与
——skip-grant-tables
运行, mysqldump。