MySQL的安全/访问控制和帐户管理连接到MySQL /故障诊断问题

连接到MySQL 4.21故障诊断问题

如果你遇到问题,当你试图连接到MySQL服务器,以下物品描述一些课程的行动可以纠正这个问题。

  • 确保服务器正在运行。如果不是,客户端无法连接到它。例如,如果试图连接到服务器失败的消息后等其中的一个,一个原因可能是服务器没有运行:

    壳> mysql错误2003:不能连接到mysql服务器的host_name”(111)壳> mysql错误2002:不能通过套接字连接到本地mysql服务器/ 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防火墙不会阻止MySQL端口。

  • 格兰特表必须正确设置,服务器可以使用它们访问控制。对于某些分布类型(如二进制发行版在Windows上,或RPM和DEB分布在Linux上),安装过程初始化MySQL数据目录,包括mysql系统数据库包含授权表。分布,不这样做,您必须手动初始化数据目录。有关详细信息,请参见第三章,Postinstallation设置和测试

    以确定是否需要初始化授权表,找一个mysql目录下的数据目录。(数据目录通常被命名为数据var和位于您的MySQL安装目录下)。确保你有一个文件命名user.MYDmysql数据库目录。如果不是,初始化数据目录。这样做和启动服务器之后,您应该能够连接到服务器。

  • 重新安装后,如果您试图登录到服务器不使用一个密码,您可能会得到以下错误消息。

    壳> mysql - u根错误1045(28000):拒绝访问的用户“根”@“localhost”(使用密码:没有)

    这意味着一个根密码已经被分配在安装过程中,必须提供。看到3.4节,“获得最初的MySQL账户”在不同的密码可能被分配,在某些情况下,如何找到它。如果您需要重置根密码,参见如何重置根密码。发现或重置您的密码后,再次登录使用——密码(或- p)选项:

    壳> mysql - u root - p输入密码:

    然而,服务器会让你连接不使用密码如果你有MySQL使用初始化mysqld——initialize-insecure(见3.1节,“初始化数据目录”详情)。这是一个安全风险,所以你应该设置一个密码账户;看到3.4节,“获得最初的MySQL账户”的指令。

  • 如果你有更新现有的MySQL安装新版本,你执行MySQL升级程序了吗?如果不是,这样做。格兰特表的结构变化偶尔当添加新功能,升级之后你应该确保你的表有当前的结构。说明,请参阅升级MySQL

  • 如果一个客户端程序收到以下错误消息,当它试图连接,这意味着服务器预计密码比客户端能够生成新格式:

    壳> mysql客户端不支持身份验证协议要求服务器;考虑升级MySQL客户端
  • 记住,客户程序使用连接参数中指定选项文件或环境变量。如果一个客户端程序似乎是发送错误的默认连接参数,当你在命令行上没有指定,检查任何适用的选项文件和您的环境。例如,如果你得到的拒绝访问当您运行一个客户端没有任何选择,确保你没有指定一个旧密码在任何你选择的文件!

    您可以抑制使用选项文件通过一个客户端程序通过调用它——已选择。例如:

    壳> mysqladmin——已- u根版本

    客户使用的选项文件中列出使用选项文件。环境变量中列出环境变量

  • 如果你得到以下错误,这意味着你正在使用一个不正确的密码:

    壳> mysqladmin - u root - pxxxx版本拒绝访问的用户“根”@“localhost”(使用密码:是的)

    如果前面的错误发生,即使你没有指定一个密码,它意味着你有一个不正确的密码文件中列出一些选项。试——已选择在前面所述项目。

    更改密码的信息,请参阅4.14节,“分配账户密码”

    如果你有丢失或忘记了密码,看到如何重置根密码

  • 本地主机是一个本地主机名的同义词,也默认主机客户尝试连接如果你显式地指定没有主机。

    您可以使用一个——主机= 127.0.0.1选项来显式命名服务器主机。这将导致一个TCP / IP连接到本地mysqld服务器。您还可以使用TCP / IP通过指定一个——主机选项,使用本地主机的实际主机名。在这种情况下,主机名称必须被指定用户服务器主机上的表行,即使你在同一个主机上运行客户端程序,服务器。

  • 拒绝访问错误消息告诉你你是谁试图登录,客户端主机,你想连接,以及是否使用一个密码。通常情况下,你应该有一个行用户表,完全匹配给定的主机名和用户名的错误消息。例如,如果你得到一个错误消息,其中包含使用密码:没有,这意味着你试图登录密码。

  • 如果你得到一个拒绝访问错误当试图连接到数据库mysql - uuser_name,你可能会有问题用户表。检查这个通过执行mysql - u root mysql并发出SQL语句:

    从用户选择*;

    结果应该包括一行主机用户列匹配客户的主机名和你的MySQL用户名。

  • 如果发生以下错误当你试图从另一个主机连接MySQL服务器正在运行,这意味着没有行用户表一个主机客户端主机相匹配的值:

    主机…这是不允许连接到MySQL服务器吗

    你可以解决这个问题通过设置一个帐户的结合客户端主机名和用户名,您使用的是当试图连接。

    如果你不知道机器的IP地址或主机名,你连接,你应该把一行“%”随着主机列值的用户表。试图从客户端机器连接后,使用一个选择用户()查询,看看你真的连接。然后改变“%”用户表行到实际的主机名显示在日志中。否则,系统是不安全的,因为它允许从任何主机给定用户名连接。

    在Linux上,这种错误可能发生的另一个原因是,您使用的是二进制MySQL版本编译的不同版本glibc库比你使用。在这种情况下,您应该或升级您的操作系统glibc或下载MySQL版本的源分布和自己编译它。源RPM通常是微不足道的编译和安装,所以这不是一个大问题。

  • 如果你指定一个主机名在尝试连接,但是得到一个错误信息没有显示主机名或IP地址,这意味着MySQL服务器有一个错误当试图解决客户端主机的IP地址的名字:

    壳> mysqladmin - u root - pxxxx- hsome_hostname版本拒绝访问用户root @”(使用密码:是的)

    如果你尝试连接并得到以下错误,这意味着你没有中的一行用户表一个用户列值的“根”mysqld你的客户不能解决主机名:

    访问被拒绝用户”@“未知”

    这些错误表明DNS问题。要修复它,执行mysqladmin flush hosts重置内部DNS主机缓存。看到和主机缓存DNS查找

    一些永久性的解决方案是:

    • 确定什么是错误的和你的DNS服务器并修复它。

    • 在MySQL中指定IP地址而不是主机名称授权表。

    • 把客户端机器的名字的条目设置在Unix或\ windows \主机在Windows上。

    • 开始mysqldskip_name_resolve系统变量启用。

    • 开始mysqld——skip-host-cache选择。

    • 在Unix上,如果您正在运行的服务器和客户端在同一台机器上,连接本地主机。为连接本地主机MySQL程序尝试连接到本地服务器通过使用Unix套接字文件,除非有指定连接参数,以确保客户端TCP / IP连接。有关更多信息,请参见连接到MySQL服务器使用命令选项

    • 在Windows上,如果你是在同一台机器上运行服务器和客户端和服务器支持命名管道连接,连接到主机名(时期)。连接使用命名管道而不是TCP / IP。

  • 如果mysql - u根但工作mysql - hyour_hostname- u根结果拒绝访问(your_hostname是实际的本地主机的主机名),你可能没有正确的主机的名称吗用户表。这是一个常见问题主机的价值用户表行指定一个不合格的主机名,但是你的系统的名称解析例程返回一个完全限定域名(反之亦然)。例如,如果您有一行与主机“冥王星”用户表,但你的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”用户=some_user或删除行主机=“localhost”用户=。删除行后,记得发出冲洗的特权声明重载授权表。另请参阅4.6节,“访问控制、阶段1:连接验证”

  • 如果你能连接到MySQL服务器,但得到一个拒绝访问当你发出消息选择……到输出文件加载数据的声明,你行用户表没有文件特权启用。

  • 如果你改变直接授权表(例如,通过使用插入,更新,或删除语句)和您的更改似乎被忽略,记住,你必须执行冲洗的特权语句或一个mysqladmin flush-privileges命令导致服务器重新加载权限表。否则,你的改变没有影响到下次重新启动服务器。记住,在你改变密码的更新声明,您不需要指定新密码之前,你冲洗的特权,因为服务器不知道在那之前,你已经改变了密码。

  • 如果你的特权似乎改变了在一个会话,这可能是因为MySQL管理员已经改变了他们。重载格兰特表影响新客户端连接,但它也会影响现有连接,表示4.13节,“当特权变化生效”

  • 如果你有访问问题与Perl、PHP、Python或ODBC程序,尝试连接到服务器mysql - uuser_namedb_namemysql - uuser_name- p密码db_name。如果你能连接使用mysql客户,问题不在于你的程序,访问权限。(之间没有空间- p和密码;您还可以使用——密码=密码语法指定密码。如果你使用- p——密码选项没有密码值,MySQL提示输入密码。)

  • 出于测试目的,开始的mysqld服务器与——skip-grant-tables选择。然后你可以改变MySQL表和使用秀奖助金语句来检查你的修改是否有预期的效果。当你满意你的更改,执行mysqladmin flush-privileges告诉mysqld服务器重新加载的特权。这使您可以开始使用新的授权表内容没有停止和重新启动服务器。

  • 如果一切都失败了,开始mysqld服务器调试选项(例如,debug = d,一般情况下,查询)。这个打印主机和用户尝试连接的信息,以及每个命令的信息。看到DBUG包

  • 如果你有任何其他问题与MySQL表和问格兰特MySQL社区松弛格兰特,总是提供一个转储的MySQL表。你可以转储的表,mysqldump mysql命令。文件错误报告,看说明书如何报告错误或问题。在某些情况下,您可能需要重新启动mysqld——skip-grant-tables运行,mysqldump