当你试着联接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”或“windowshosts”文件为你的主机增加一个条目。 - 如果你从一个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
。