Access denied错误的原因 - starspace

时间:2024-01-31 10:38:14

Access denied错误的原因

       当你试着联接MySQL服务器时,如果你碰到Access denied错误,显示在下面的表指出一些你能用来更正这个问题的动作:

  你是在安装MySQL以后运行mysql_install_db的脚本,来设置初始授权表内容吗?如果不是,这样做。见6.10 设置初始MySQL权限。通过执行这个命令测试初始权限:
shell> mysql -u root test

  服务器应该让你无误地连接。你也应该保证你在MySQL数据库目录有一个文件“user.MYD”。通常,它是“PATH/var/mysql/user.MYD”,在此PATH是MySQL安装根目录的路径。

  在一个新的安装以后,你应该连接服务器并且设置你的用户及其存取许可:
shell> mysql -u root mysql

  服务器应该让你连接,因为MySQL root用户初始时没有口令。既然那也是一个安全风险,当你正在设置其他MySQL用户时,设定root口令是一件重要的事请。如果你作为root尝试连接并且得到这个错误:

Access denied for user: \'@unknown\' to database mysql

  这意味着,你没有一个条目在user表中的一个User列值为\'root\'并且mysqld不能为你的客库解析主机名。在这种情况下,你必须用--skip-grant-tables选项重启服务器并且编辑你的“/etc/hosts”或“\windows\hosts”文件为你的主机增加一个条目。

  如果你从一个3.22.11以前的版本更新一个现存的MySQL安装到3.22.11版或以后版本,你运行了mysql_fix_privilege_tables脚本吗?如果没有,运行它。在GRANT语句变得能工作时,授权表的结构用MySQL 3.22.11修改 。

  如果你直接对授权表做修改(使用INSERT或UPDATE语句)并且你的改变似乎被忽略,记住,你必须发出一个FLUSH PRIVILEGES语句或执行一个mysqladmin flush-privileges命令导致服务器再次读入表,否则你的改变要道下一次服务器被重启时再生效。记住在你设定root口令以后,你将不需要指定它,直到在你清洗(flush)权限以后,因为服务器仍然不会知道你改变了口令!

  如果你的权限似乎在一个会话(session)当中改变了,可能是一个超级用户改变了他们。再次装入授权表作用于新客户连接,但是它也影响现存的连接,如6.9 权限改变何时生效小节所述。

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

  如果你有一个Perl、Python或ODBC程序的存取问题,试着用mysql -u user_name db_name或mysql -u user_name -pyour_pass db_name与服务器连接。如果你能用mysql客户连接,这是你程序的一个问题而不是存取权限的问题。(注意在-p和口令之间没有空格;你也能使用--password=your_pass句法指定口令。)

  如果你不能让口令工作,记得如果你用INSERT, UPDATE或SET PASSWORD语句设置口令,你必须使用PASSWORD()函数。如果你用GRANT ... INDENTIFIED BY语句或mysqladmin password命令指定口令,PASSWORD()函数是不需要的。见6.12 怎样设置口令。

  localhost是你本地主机名的一个同义词,并且也是如果你不明确地指定主机而客户尝试连接的缺省主机。然而,如果你正在运行于一个使用MIT-pthreads的系统上,连接localhost是不行的(localhost连接使用Unix套接字进行,它没被 MIT-pthreads支持),为了在这样的系统上避免这个问题,你应该使用--host选项明确地命名服务器主机,这将做一个 TCP/IP连接到mysqld服务器。在这种情况下,你必须有在服务器主机上的user表中条目的你真实的主机名。(即使你在服务器同一台的主机上运行一个客户程序,这也是真的。)

  当尝试用mysql -u user_name db_name与数据库连接时,如果你得到一个Access denied错误,你可能有与user桌有关的问题,通过执行mysql -u root mysql并且发出下面的SQL语句检查:
mysql> SELECT * FROM user;

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

  Access denied错误消息将告诉你,你正在用哪个用户尝试登录,你正在试图用连接哪个主机,并且你是否正在使用一个口令。通常,你应该在user表中有一个条目,正确地匹配在错误消息给出的主机名和用户名。

  如果当你试着从一个不是MySQL服务器正在运行的主机上连接时,你得到下列错误,那么在user表中没有匹配那台主机行:
Host ... is not allowed to connect to this MySQL server

  你可以通过使用mysql命令行工具(在服务器主机上!)修正它,把你正在试图连接的用户/主机名组合新加一行到user表中。如果你不在运行MySQL 3.22并且你不知道你正在从它连接的机器的IP数字或主机名,你应该把一个\'%\'条目作为Host列值放在user表中并且在服务器机器上使用--log选项重启mysqld。在试图从客户机器连接以后,在MySQL记录文件中的信息将显示你如何真正进行连接。(然后用在记录文件上面显示出的实际的主机名代替user表中的\'%\'条目。否则,你将有一个不安全的系统。)

  如果mysql -u root test工作但是mysql -h your_hostname -u root test导致Access denied,那么在user表中你可能没有你的主机的正确名字。这里的一个普遍的问题是在user表条目中的Host值指定一个唯一的主机名,但是你系统的名字解析例程返回一个完全正规的域名(或相反)。例如,如果你在user表中有一个主机是\'tcx\'的条目,但是你的 DNS告诉MySQL你的主机名是\'tcx.subnet.se\',条目将不工作。尝试把一个条目加到user表中,它包含你主机的IP数字作为Host列的值。(另外,你可以把一个条目加到user表中,它有包含一个通配符如\'tcx.%\'的Host值。然而,使用以“%”结尾的主机名是不安全的并且不推荐!)
  如果mysql -u user_name test工作但是mysql -u user_name other_db_name不工作,对other_db_name,你在db表中没有没有一个条目列出。
当在服务器机器上执行mysql -u user_name db_name时,它工作,但是在其它客户机器上执行mysql -h host_name -u user_name db_name时,它却不工作,你没有把客户机器列在user表或db表中。

  如果你不能弄明白你为什么得到Access denied,从user表中删除所有Host包含通配符值的条目(包含“%”或“_”的条目)。一个很普遍的错误是插入用Host=\'%\'和User=\'some user\'插入一个新条目,认为这将允许你指定localhost从同一台机器进行连接。它不工作的原因是缺省权限包括一个有Host=\'localhost\'和User=\'\'的条目,因为那个条目一个比\'%\'更具体的Host值\'localhost\',当从localhost连接时,它用于指向新条目!正确的步骤是插入Host=\'localhost\'和User=\'some_user\'的第2个条目,或删除Host=\'localhost\'和User=\'\'条目。
如果你得到下列错误,你可以有一个与db或host表有关的问题:
Access to database denied

  如果从db表中选择了在Host列有空值的条目,保证在host表中有一个或多个相应的条目,指定运用db表中的哪些主机。如果在使用SQL命令SELECT ... INTO OUTFILE或LOAD DATA INFILE时,你得到错误,在user表中的你的条目可能启用file权限。

  记住,客户程序将使用在配置文件或环境变量被指定了的连接参数。如果当你不在命令行上指定他们时,一个客户似乎正在发送错误的缺省连接参数,检查你的环境和在你的主目录下的“.my.cnf”文件。你也可以检查系统范围的MySQL配置文件,尽管更不可能将在那里指定那个客户的连接参数。见4.15.4 选项文件。如果当你没有任何选项运行一个客户时,你得到Access denied,确认你没在任何选项文件里指定一个旧的口令!见4.15.4 选项文件。

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

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