MYSQL无法被连接问题

如果您在尝试连接到MySQL服务器时遇到问题,以下描述了您可以采取的一些措施来纠正该问题。

  • 确保服务器正在运行。如果没有,则客户端无法连接到它。例如,如果尝试连接到服务器失败并出现以下消息之一,则可能是服务器未运行:

    sql 复制代码
    $> mysql
    ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
    $> mysql
    ERROR 2002: Can't connect to local MySQL server through socket
    '/tmp/mysql.sock' (111)
  • 可能是服务器正在运行,但您尝试使用与服务器侦听的端口不同的TCP/IP端口、命名管道或Unix套接字文件进行连接。要在调起客户端程序时更正此问题,请指定--port选项来指示正确的端口号,或指定--socket选项来指示正确的命名管道或Unix套接字文件。要查找套接字文件的位置,可以使用以下命令:

    bash 复制代码
    $> netstat -ln | grep mysql
  • 确保服务器未配置为忽略网络连接,或者(如果您尝试远程连接)未配置为仅在其网络接口本地侦听。如果服务器在启用skip_networking系统变量的情况下启动,则不接受TCP/IP连接。如果服务器在bind_address系统变量设置为127.0.0.1的情况下启动,则仅在环回接口本地侦听TCP/IP连接,并且不接受远程连接。

  • 检查以确保没有防火墙阻止对MySQL的访问。您的防火墙可能会根据正在执行的应用程序或MySQL用于通信的端口号进行配置(3306默认)。在Linux或Unix下,检查您的IP表(或类似)配置,以确保端口没有被阻止。在Windows下,可能需要将Zone警报或Windows防火墙等应用程序配置为不屏蔽MySQL端口。

  • 必须正确设置授权表,以便服务器使用它们进行权限控制。对于某些版本类型(如Windows上的二进制版,或Linux上的RPM和DEB版本),安装过程初始化MySQL数据目录,包括包含授权表的mysql系统数据库。对于不这样做的版本,必须手动初始化数据目录。要确定是否需要初始化授权表,请在data目录下查找mysql目录。(data目录通常命名为datavar,位于MySQL安装目录下。)确保mysql数据库目录中有名为user.MYD的文件。如果没有,请初始化data目录。这样做并启动服务器后,您应该能够连接到服务器。

  • 重新安装后,如果您尝试以root身份登录服务器而不使用密码,您可能会收到以下错误消息。

    sql 复制代码
    $> mysql -u root 
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    这意味着在安装过程中已经分配了root密码,并且必须提供。请参阅"保护初始MySQL帐户"关于分配密码的不同方式,以及在某些情况下如何找到它。如果您需要重置root密码,请参阅"如何重置root密码"。找到或重置密码后,使用--password(或-p)选项再次以root身份登录:

    sql 复制代码
    $> mysql -u root -p
    Enter password:

    但是,如果您使用mysqld--initialize-insecure初始化MySQL,服务器将允许您以root身份连接(请参阅"初始化数据目录"了解详细信息)。这是一个安全风险,因此您应该为root帐户设置密码;请参阅"保护初始MySQL帐户"了解说明。

  • 如果您已将现有MySQL安装更新到更高版本,是否执行了MySQL升级过程?如果没有,请执行。添加新功能时,授权表的结构偶尔会发生变化,因此升级后,您应始终确保您的表具有当前结构。有关说明,请参阅升级MySQL。

  • 如果客户端程序在尝试连接时收到以下错误消息,这意味着服务器需要比客户端能够生成的格式更新的密码:

    sql 复制代码
    $> mysql
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
  • 请记住,客户端程序使用选项文件或环境变量中指定的连接参数。如果客户端程序似乎发送了错误的默认连接参数,而您没有在命令行中指定它们,请检查任何适用的选项文件和您的环境。例如,如果您在没有任何选项的情况下运行客户端时Access denied,请确保您没有在任何选项文件中指定旧密码!您可以通过使用--no-defaults选项调用客户端程序来禁止使用选项文件。例如:

    sql 复制代码
    $> mysqladmin --no-defaults -u root version
  • 如果出现以下错误,则表示您使用的root密码不正确:

    sql 复制代码
    $> mysqladmin -u root -pxxxx ver
    Access denied for user 'root'@'localhost' (using password: YES)

    如果在您没有指定密码的情况下也发生上述错误,则表示您在某个选项文件中列出的密码不正确。请尝试上一项中描述的--no-defaults选项。有关更改密码的信息,请参阅"分配帐户密码"。如果您丢失或忘记了root密码,请参阅"如何重置root密码"。

  • localhost是本地主机名的同义词,如果您没有明确指定主机,也是客户端尝试连接的默认主机。您可以使用--host=127.0.0.1选项显式命名服务器主机。这会导致TCP/IP连接到本地mysqld服务器。您也可以通过指定使用本地主机实际主机名的--host选项来使用TCP/IP。在这种情况下,主机名必须在服务器主机上的user表行中指定,即使您在与服务器相同的主机上运行客户端程序。

  • 拒绝Access denied错误消息会告诉您尝试以谁的身份登录、尝试连接的客户端主机以及是否使用密码。通常,user表中应该有一行与错误消息中给出的主机名和用户名完全匹配。例如,如果您收到包含using password: NO的错误消息,则表示您尝试在没有密码的情况下登录。

  • 如果您在尝试使用mysql -u *user_name*连接到数据库时遇到Access denied错误,则可能是user表出现问题。通过执行mysql -u root mysql并发出以下SQL语句来检查这一点,结果应包括HostUser列匹配客户端主机名和MySQL用户名的行。

    sql 复制代码
    SELECT * FROM user;
  • 如果尝试从运行MySQL服务器的主机以外的主机连接时发生以下错误,则表示user表中没有与客户端主机匹配的Host值的行:

    sql 复制代码
    Host ... is not allowed to connect to this MySQL server

    您可以通过为尝试连接时使用客户端主机名和用户名的组合设置一个帐户来解决此问题。

    如果您不知道要连接的计算机的IP地址或主机名,您应该在user表中放置'%'作为Host列值的行。尝试从客户端计算机连接后,使用SELECT USER()查询查看您实际上是如何连接的。然后将user表行中的'%'更改为日志中显示的实际主机名。否则,您的系统将不安全,因为它允许从任何主机为给定用户名进行连接。Linux,可能发生此错误的另一个原因是您使用的二进制MySQL版本与您使用的glibc库版本不同。在这种情况下,您应该升级您的操作系统或glibc,或者下载MySQL版本的源代码并自行编译。一个RPM源通常对编译和安装来说是微不足道的,所以这不是什么大问题。

  • 如果您在尝试连接时指定了主机名,但得到一个错误消息,其中主机名未显示或为IP地址,则表示MySQL服务器在尝试将客户端主机的IP地址解析为名称时出现错误:

    sql 复制代码
    $> mysqladmin -u root -pxxxx -h some_hostname ver
    Access denied for user 'root'@'' (using password: YES)

    如果您尝试以root身份连接并获得以下错误,这意味着您在user表中没有User列值为'root'的行,并且mysqld无法为您的客户端解析主机名:

    sql 复制代码
    Access denied for user ''@'unknown'

    这些错误表明域名系统有问题。要修复它,请执行mysqladmin flush-host来重置内部域名系统主机缓存,一些永久的解决方案是:确定您的域名系统服务器有什么问题并修复它、在MySQL授权表中指定IP地址而不是主机名、在Unix上的/etc/hosts或Windows上的\windows\hosts中输入客户端计算机名称、启动mysqld并启用skip_name_resolve系统变量、启动mysqld时--host-cache-size=0、在Unix上,如果您在同一台机器上运行服务器和客户端,请连接到localhost。对于与localhost的连接,MySQL程序尝试使用Unix套接字文件连接到本地服务器,除非指定了连接参数以确保客户端建立TCP/IP连接、在Windows上,如果您在同一台机器上运行服务器和客户端,并且服务器支持命名管道连接,请连接到主机名.(句号)。连接到.使用命名管道而不是TCP/IP。

  • 如果mysql-u root有效,但mysql-hyour_hostname-u root导致访问被拒绝(其中your_hostname是本地主机的实际主机名),则用户表中可能没有正确的主机名。这里的一个常见问题是用户表行中的主机值指定了一个不合格的主机名,但系统的名称解析例程返回一个完全限定域名(反之亦然)。例如,如果您在用户表中有一行主机为"pluto",但您的DNS告诉MySQL您的主机名是"pluto.example.com",则该行不起作用。

    尝试在用户表中添加一行,其中包含主机的IP地址作为主机列值。(或者,您可以在用户表中添加一行包含通配符的主机值(例如,'pluto. %'). 但是,使用以%结尾的主机值是不安全的,不推荐!)

  • 如果mysql-uuser_name有效,但mysql-uuser_namesome_db无效,则未授予给定用户访问名为some_db的数据库的权限。

  • 如果mysql-uuser_name在服务器主机上执行时工作,但mysql-hhost_name-uuser_name在远程客户端主机上执行时不工作,则您没有启用从远程主机访问给定用户名的服务器。

  • 如果您不知道访问被拒绝的原因,请从用户表中删除所有主机值包含通配符的行(包含"%"或"_"字符的行)。一个非常常见的错误是插入一个主机="%"和用户="some_user"的新行,认为这使您能够指定localhost从同一台机器连接。这不起作用的原因是默认权限包括主机="localhost"和用户="的行。因为该行的主机值"localhost"比"%"更具体,所以从localhost连接时,它优先用于新行!

    正确的步骤是插入Host='localhost'和User='some_user'的第二行,或者删除Host='localhost'和User="的行。删除该行后,请记住发出FLUSH PRIVILEGES语句以重新加载授权表。另请参阅"MYSQL访问控制,第1阶段:连接验证"。

  • 如果您能够连接到MySQL服务器,但在发出SELECT... INTO OUTFILE或LOAD DATA语句时收到拒绝访问消息,则用户表中的行未启用FILE权限。

  • 如果您直接更改授权表(例如,通过使用INSERT、UPDATE或DELETE语句)并且您的更改似乎被忽略,请记住,您必须执行FLUSH PRIVILEGES语句或mysqladmin flush-权限命令以使服务器重新加载权限表。否则,您的更改在下次重新启动服务器之前无效。请记住,在使用UPDATE语句更改root

  • 如果您的权限似乎在会话中间发生了变化,则可能是MySQL管理员更改了它们。重新加载授权表会影响新的客户端连接,但也会影响现有连接

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

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

  • 如果其他方法都失败,则使用调试选项(例如--debug=d,general,query)启动mysqld服务器。这将打印有关尝试连接的主机和用户信息,以及有关发出的每个命令的信息

  • 如果您对MySQL授权表有任何其他问题,并在MySQL社区Slack上询问,请始终提供MySQL授权表的转储。您可以使用mysqldump mysql命令转储表。要提交bug报告。在某些情况下,您可能需要使用--skip-grant-tables重新启动mysqld来运行mysqldump

相关推荐
大气层煮月亮27 分钟前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang37 分钟前
达梦数据库的命名空间
数据库·oracle
三三木木七1 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔1 小时前
sql数据库语法
数据库·sql
唐古乌梁海1 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强1 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL1 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王1 小时前
NoSQL介绍
数据库·nosql
꒰ঌ 安卓开发໒꒱1 小时前
Mysql 坏表修复
android·mysql·adb
猫林老师2 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos