MySQL连接时出现问题的疑难解答

来源:互联网 发布:苹果8没网络 编辑:程序博客网 时间:2024/05/22 00:54

如果在尝试连接到MySQL服务器时遇到问题,以下内容将描述您可以采取的一些纠正问题的方法。

  • 确保服务器正在运行。如果不是,客户端无法连接到它。例如,如果连接到服务器的尝试失败,并显示以下信息之一的消息,则原因可能是服务器未运行:

    shell> mysqlERROR 2003: Can't connect to MySQL server on 'host_name' (111)shell> mysqlERROR 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数据目录下的目录。(数据目录通常被命名 datavar位于您的MySQL安装目录下)。确保您有一个user.MYDmysql数据库目录中命名的文件如果没有,请初始化数据目录。执行此操作并启动服务器后,通过执行此命令测试初始权限:

    shell> mysql -u root

    服务器应该让你连接没有错误。

  • 全新安装后,您应该连接到服务器并设置用户及其访问权限:

    shell> mysql -u root mysql

    如果您使用mysqld --initialize-secureMySQL初始化为不为初始root帐户创建密码(请参见 第2.10.1.1节“使用mysqld手动初始化数据目录”,服务器应允许您连接无密码这是一个安全风险,因此设置root帐户的密码 是您设置其他MySQL帐户时应该执行的操作。有关设置初始密码的说明,请参见 第2.10.4节“保护初始MySQL帐户”

  • 如果您将现有的MySQL安装更新到较新版本,是否运行mysql_upgrade 脚本?如果没有,请这样做。添加新功能时,授权表的结构会发生更改,因此升级后应始终确保表具有当前结构。有关说明,请参见 第4.4.7节“ mysql_upgrade - 检查和升级MySQL表”

  • 如果客户端程序在尝试连接时收到以下错误消息,则表示服务器希望以比客户机能够生成的更新格式的密码:

    shell> mysqlClient does not support authentication protocol requestedby 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 verAccess denied for user 'root'@'localhost' (using password: YES)

    如果即使没有指定密码也会出现上述错误,这意味着您在某些选项文件中列出了错误的密码。尝试--no-defaults上述项目中所述的 选项。

    有关更改密码的信息,请参见 第6.3.6节“分配帐户密码”

    如果丢失或忘记了root 密码,请参见B.5.3.2节“如何重置根密码”

  • 如果通过使用SET PASSWORDINSERT或 更改密码UPDATE,则必须使用该PASSWORD() 功能加密密码如果您不使用 PASSWORD()这些语句,密码将无法正常工作。例如,以下语句分配密码,但无法对其进行加密,因此用户以后无法连接:

    SET PASSWORD FOR 'abe'@'host_name' = 'eagle';

    而是设置密码:

    SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');

    PASSWORD()使用CREATE USERor GRANT语句或 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 -uuser_nameusermysql -u root mysql

    SELECT * FROM user;

    结果应该包含一个有一排 HostUser匹配您的客户端的主机名和你的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 verAccess 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\hostsWindows上。

    • 启动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 deniedyour_hostnameuserHostuser'pluto'user'pluto.example.com'userHostuserHost'pluto.%'Host%

  • 如果工作,但是 没有,您没有授予对给定用户访问名为的数据库。 mysql -u user_namemysql -u user_name some_dbsome_db

  • 如果在服务器主机上执行时工作,但在远程客户端主机上执行时不起作用,则尚未启用从远程主机访问给定用户名的服务器。 mysql -uuser_namemysql -h host_name -u user_name

  • 如果您无法弄清楚原因Access denied,请从user 表中删除Host包含通配符(包含'%' 或'_'字符的)的值的所有行一个非常常见的错误是用Host'%'and User插入一个新行 ,认为这样可以指定 从同一台机器进行连接。这不行的原因是默认权限包括带有和 的行 因为该行的值 比以前更具体 当连接起来时,它优先于新行!正确的步骤是插入一个第二行与 和 ,或删除的行 和 删除该行后,请记住发出一个 语句来重新加载grant表。另见第6.2.4节“访问控制,阶段1:连接验证”删除该行后,请记住发出一个语句来重新加载grant表。另见第6.2.4节“访问控制,阶段1:连接验证”删除该行后,请记住发出一个语句来重新加载grant表。另见第6.2.4节“访问控制,阶段1:连接验证”'some_user'localhostHost'localhost'User''Host'localhost''%'localhostHost'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_namemysql -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

原创粉丝点击