MySQL社区

标题: 拒绝访问错误的原因 [打印本页]

作者: jeff    时间: 2007-10-29 22:22
标题: 拒绝访问错误的原因
导致拒绝访问错误的原因很多。该错误常与连接时服务器允许客户端使用的MySQL账户有关。 拒绝访问错误的原因:

当你试着联接MySQL服务器时,如果碰到问题,下面各项可以帮助你纠正问题:

●  确保服务器在运行。如果服务器没有运行,则你不能连接服务器。如果你视图连接服务器并看到下述消息,可能是服务器没有运行:
shell> mysql

ERROR 2003: Can't connect to MySQL server on 'host_name' (111)

shell> mysql

ERROR 2002: Can't connect to local MySQL server through socket

'/tmp/mysql.sock' (111)


也可能服务器正在运行,但你可能使用与服务器上侦听的不一样的TCP/IP端口、命名管道或Unix套接字文件。你可以调用客户端程序,指定端口选项来指示正确的端口或套接字选项来指示正确的命名管道或Unix套接字文件。要找出套接字文件的地点,应:

shell> netstat -ln | grep mysql


确定是否要初始化授权表的一个方法是寻找数据目录下的mysql目录(数据目录名通常为data或var,位于MySQL安装目录下)。应保证MySQL数据库目录有文件“user.MYD”。否则,执行mysql_install_db脚本。运行并重启服务器后,执行该命令来测试初始权限:

shell> mysql -u root test

服务器应该让你无误地连接。


                  shell> mysql -u root mysql
        服务器应该让你连接,因为MySQL root用户初始时没有密码。那也是安全风险,当你正在设置其他MySQL用户时,也应设定root密码是一件重要的事请。


●  如果客户端程序试图连接时收到以下错误信息,说明服务器需要新格式的密码,而客户端不能生成:
shell> mysql

Client does not support authentication protocol requested

by server; consider upgrading MySQL client


在这种情况下,你必须用--skip-grant-tables选项重启服务器并且编辑“/etc/hosts”或“\windows\hosts”文件为你的主机增加行。



●  记住客户端程序使用选项文件或环境变量中指定的连接参数。如果客户端程序发送不正确的默认连接参数,而你没有在命令行中指定,检查环境变量和适用的选项文件。例如,当你不用任何选项运行客户端程序,得到Access denied错误,确保你没有在选项文件中指定旧密码!

你可以通过使用--no-defaults选项调用客户端程序来禁用选项文件。例如:

shell> mysqladmin --no-defaults -u root version

●  如果遇到下述错误,说明root密码错误:
shell> mysqladmin -u root -pxxxx ver·

Access denied for user 'root'@'localhost' (using password: YES)
如果你未指定密码时出现前面的错误,说明某个选项文件中的密码不正确。试试前面所说的--no-defaults选项。

如果你丢失或忘记root密码,你可以用--skip-grant-tables重启 mysqld来更改密码。

●  如果你使用SET PASSWORD、INSERT或UPDATE更改密码,你必须使用PASSWORD()函数加密密码。如果你不使用PASSWORD()函数,密码不工作。例如,下面的语句设置密码,但没能加密,因此用户后面不能连接:

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

相反,应这样设置密码:

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

当你使用GRANT或CREATE USER语句或mysqladmin password命令指定密码时,不需要PASSWORD()函数,它们会自动使用PASSWORD()来加密密码。

●  localhost是你本地主机名的一个同义词,并且也是如果你不明确地指定主机而客户端尝试连接的默认主机。

要想在这种系统上避免该问题,你可以使用--host=127.0.0.1选项来明确命名服务器主机。这样将通过TCP/IP协议来连接本地mysqld服务器。你还可以指定--host选项使用TCP/IP,使用实际的本机主机名。在这种情况下,主机名必须指定为服务器主机上的user表行,即使你在服务器上运行客户端程序。

●  当尝试用mysql -u user_name与数据库连接时,如果你得到一个Access denied错误,可能会遇到与user表有关的问题,通过执行mysql -u root mysql并且执行下面的SQL语句进行检查:

mysql> SELECT * FROM user;

结果应该包含一个有Host和User列的行匹配你的计算机主机名和你的MySQL用户名。


●  如果当你试着从一个不是MySQL服务器正在运行的主机上连接时,遇到下列错误,那么在user表中没有匹配那台主机的行:

Host ... is not allowed to connect to this MySQL server

可以通过组合你正在试图连接的用户/主机名设置一个账户来修正它。如果你不知道正连接的机器的IP号或主机名,应该把一个'%'行作为Host列值放在user表中。在试图从客户端器连接以后,通过SELECT USER()查询显示你如何真正进行连接。(然后用在日志文件上面显示出的实际的主机名代替user表中的'%'行。否则,你将得到一个不安全的系统,因为它允许从任何主机上以任何用户名连接。)

在Linux中,发生该错误的另一个原因可能是你正使用于你所使用版本的glibc库不同版本的库编译的二进制MySQL版本。在这种情况下,你应升级操作系统或glibc,或下载MySQL版本的源码分发版并自己编译。源码RPM一般很容易编译并安装,因此不是大问题。

●  如果你连接时指定主机名,但得到错误消息主机名未显示或为IP号,表示当MySQL服务器将IP号解析为客户端来名时遇到错误:

shell> mysqladmin -u root -pxxxx -h some-hostname ver·

Access denied for user 'root'@'' (using password: YES)

这表示DNS问题。要想修复,执行mysqladmin flush-hosts来重设内部 DNS主机名缓存。

一些常用的解决方案包括:
o 试试找出DNS服务器的错误并修复。
o 在MySQL授权表中指定IP号而不是主机名。
o 在/etc/hosts中放入客户端名。
o 用--skip-name-resolve选项启动mysqld
o 用--skip-host-cache选项启动mysqld
o 在Unix中,如果你在同一台机器上运行服务器和客户端,连接到localhost。连接到的localhost的Unix连接使用Unix套接字文件而不是TCP/IP。
o 在Windows中,你在同一台机器上运行服务器和客户端并且服务器支持命名管道连接,连接主机名(周期)。连接使用命名管道而不是TCP/IP。





●  如果你得到下列错误,可以与db或host表有关:

Access to database denied

如果从db表中选择了在Host列有空值的条目,保证在host表中有一个或多个相应的条目,指定db表中的条目适用哪些主机。

●  如果你能够连接MySQL服务器,但如果在使用命令SELECT ... INTO OUTFILE或LOAD DATA INFILE语句时,你得到Access denied错误,在user表中的条目可能没有启用FILE权限。

●  如果你直接更改授权表(例如,使用INSERT、UPDATE或DELETE语句)并且你的更改好像被忽略了,记住你必须执行FLUSH PRIVILEGES语句或mysqladmin flush-privileges命令让服务器来重读授权表。否则,直到服务器下次重启,你的更改方有效。记住用UPDATE命令更改root密码后,在清空权限前,你不需要指定新密码,因为服务器还不知道你已经更改了密码!

●  如果你的权限似乎在一个会话过程中改变了,可能是一个超级用户改变了他们。再次装入授权表会影响新客户端连接,但是它也影响现存的连接。

●  如果你有Perl、Python或ODBC程序的存取问题,试着用mysql -u user_name db_name或mysql -u user_name -pyour_pass db_name与服务器连接。如果你能用mysql客户端进行连接,这是程序的一个问题而不是访问权限的问题。(注意在-p和密码之间没有空格;也可以使用--password=your_pass语法指定密码。如果使用-p选项,MySQL提示你输入密码。)

●  为了测试,用--skip-grant-tables选项启动mysqld守护进程,然后你可以改变MySQL授权表并且使用mysqlaccess脚本检查你的修改是否有如期的效果。当你对你的改变满意时,执行mysqladmin flush-privileges告诉mysqld服务器开始使用新的 授权表。(再次装入授权表覆盖了--skip-grant-tables选项。这允许你告诉服务器开始使用授权表,而不用停掉并重启它)。

●  如果任何其它事情失败,用调试选项(例如,--debug=d,general,query)启动mysqld服务器。这将打印有关尝试连接的主机和用户信息,和发出的每个命令的信息。

●  如果你有任何与MySQL授权表的其它问题,而且觉得你必须将这个问题发送到邮件表,一定要提供一个MySQL授权表的倾倒副本(dump)。你可用mysqldump mysql命令复制数据库表。象平时一样,用mysqlbug脚本邮寄你的问题。
在一些情况下可以用--skip-grant-tables重启mysqld以便能运行mysqldump

[ 本帖最后由 jeff 于 2007-10-30 16:27 编辑 ]
作者: mysqlkumao    时间: 2008-4-9 14:37
猛贴
作者: kider    时间: 2008-10-20 21:10
留着查询备用
作者: 骆驼    时间: 2009-2-26 23:17
非常感谢精辟的解释




欢迎光临 MySQL社区 (http://www.mysqlpub.com/) Powered by Discuz! X3.2