top
Loading...
5.7.8.拒絕訪問錯誤的原因
5.7.8. 拒絕訪問錯誤的原因

當你試著聯接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
  • 必須正確設置授權表,以便服務器可以使用它們進行訪問控制。對于某些分發版類型(例如Windows中的二進制分發版或Linux中的RPM分發版),安裝過程初始化包含 授權表的mysql數據庫。如果分發版沒有這樣做,你必須運行mysql_install_db腳本來手動初始化授權表。詳細內容參見2.9.2節,“Unix下安裝后的過程”。

確定是否要初始化授權表的一個方法是尋找數據目錄下的mysql目錄數據目錄名通常為datavar,位于MySQL安裝目錄下。應保證MySQL數據庫目錄有文件user.MYD。否則,執行mysql_install_db腳本。運行并重啟服務器后,執行該命令來測試初始權限:

shell> mysql -u root test

服務器應該讓你無誤地連接。

  • 在新的安裝以后,你應該連接服務器并且設置你的用戶及其訪問許可:
·                shell> mysql -u root mysql

服務器應該讓你連接,因為MySQL root用戶初始時沒有密碼。那也是安全風險,當你正在設置其他MySQL用戶時,也應設定root密碼是一件重要的事請。關于設置初始密碼的說明,參見2.9.3節,“使初始MySQL賬戶安全”。

  • 如果你將一個現存的MySQL安裝升級到較新的版本,運行了mysql_fix_privilege_tables腳本嗎?如果沒有,運行它。增加新功能后,授權表的結構可能會改變,因此更新后應確保表的結構隨之更新。相關說明參見2.10.2節,“升級授權表”。

·         如果客戶端程序試圖連接時收到以下錯誤信息,說明服務器需要新格式的密碼,而客戶端不能生成:

·                shell> mysql
·                Client does not support authentication protocol requested
·                by server; consider upgrading MySQL client

關于如何處理的詳細信息,參見5.7.9節,“MySQL 4.1中的密碼哈希處理”和A.2.3節,“客戶端不支持鑒定協議”。

  • 如果你作為root試試連接并且得到這個錯誤,這意味著,你沒有行在user表中的User列值為'root'并且mysqld不能為你的客戶端解析主機名:
  • Access denied for user ''@'unknown' to database mysql

在這種情況下,你必須用--skip-grant-tables選項重啟服務器并且編輯/etc/hostswindowshosts文件為你的主機增加行。

  • 如果你從3.22.11以前的版本更新現存的MySQL安裝到3.22.11版或以后版本,你運行了mysql_fix_privilege_tables腳本嗎?如果沒有,運行它。在GRANT語句變得能工作時,授權表的結構用MySQL 3.22.11修改 。

·         記住客戶端程序使用選項文件或環境變量中指定的連接參數。如果客戶端程序發送不正確的默認連接參數,而你沒有在命令行中指定,檢查環境變量和適用的選項文件。例如,當你不用任何選項運行客戶端程序,得到Access denied錯誤,確保你沒有在選項文件中指定舊密碼!

你可以通過使用--no-defaults選項調用客戶端程序來禁用選項文件。例如:

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

客戶端使用的選項文件見4.3.2節,“使用選項文件”。環境變量列于附錄F:環境變量

·         如果遇到下述錯誤,說明root密碼錯誤:

·                shell> mysqladmin -u root -pxxxx ver
·                Access denied for user 'root'@'localhost' (using password: YES)

如果你未指定密碼時出現前面的錯誤,說明某個選項文件中的密碼不正確。試試前面所說的--no-defaults選項。

關于密碼更改的信息參見5.8.5節,“設置賬戶密碼”。

如果你丟失或忘記root密碼,你可以用--skip-grant-tables重啟 mysqld來更改密碼。參見A.4.1節,“如何復位根用戶密碼”.

·         如果你使用SET PASSWORDINSERTUPDATE更改密碼,你必須使用  PASSWORD()函數加密密碼。如果你不使用PASSWORD()函數,密碼不工作。例如,下面的語句設置密碼,但沒能加密,因此用戶后面不能連接:

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

相反,應這樣設置密碼:

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

當你使用GRANTCREATE USER語句或mysqladmin password命令指定密碼時,不需要PASSWORD()函數,它們會自動使用PASSWORD()來加密密碼。參見5.8.5節,“設置賬戶密碼”和13.5.1.1節,“CREATE USER語法”。

·         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;

結果應該包含一個有HostUser列的行匹配你的計算機主機名和你的MySQL用戶名。

  • Access denied錯誤消息將告訴你,你正在用哪個用戶嘗試登錄,你正在試圖連接哪個主機,是否使用了密碼。通常,你應該在user表中有一行,正確地匹配在錯誤消息給出的主機名和用戶名。例如,如果遇到包含using password: NO的錯誤信息,說明你登錄時沒有密碼。

·         如果當你試著從一個不是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主機名緩存。參見7.5.6節,“MySQL如何使用DNS”。

一些常用的解決方案包括:

o        試試找出DNS服務器的錯誤并修復。

o        MySQL授權表中指定IP號而不是主機名。

o        /etc/hosts中放入客戶端名。

o        --skip-name-resolve選項啟動mysqld

o        --skip-host-cache選項啟動mysqld

o        Unix中,如果你在同一臺機器上運行服務器和客戶端,連接到localhost。連接到的localhostUnix連接使用Unix套接字文件而不是TCP/IP

o        Windows中,你在同一臺機器上運行服務器和客戶端并且服務器支持命名管道連接,連接主機名(周期)。連接使用命名管道而不是TCP/IP

  • 如果mysql -u root test工作但是mysql -h your_hostname -u root test導致Access deniedyour_hostname是本地機的實際主機名,那么在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數據庫的訪問權限。
  • 當在服務器上執行mysql -u user_name時,它工作,但是在其它遠程客戶端上執mysql -h host_name -u user_name時,它卻不工作,你沒有為給定的用戶授予從遠程主機訪問服務器的權限。
  • 如果你不能弄明白你為什么得到Access denied,從user表中刪除所有Host包含通配符值的行(包含%_的條目)。一個很普遍的錯誤是用Host='%'User='some_user'插入一個新行,認為這將允許你指定localhost從同一臺機器進行連接。它不工作的原因是 默認權限包括一個有Host='localhost'User=''的行,因為那個行的Host'localhost''%'更具體,當從localhost連接時,它用于指向新行!正確的步驟是插入Host='localhost'User='some_user'的第2個行,或刪除Host='localhost'User=''行。刪除條目后,記住用FLUSH PRIVILEGES語句重載授權表。

·         如果你得到下列錯誤,可以與dbhost表有關:

·                Access to database denied

如果從db表中選擇了在Host列有空值的條目,保證在host表中有一個或多個相應的條目,指定db表中的條目適用哪些主機。

·         如果你能夠連接MySQL服務器,但如果在使用命令SELECT ... INTO OUTFILELOAD DATA INFILE語句時,你得到Access denied錯誤,在user表中的條目可能沒有啟用FILE權限。

·         如果你直接更改授權表(例如,使用INSERTUPDATEDELETE語句)并且你的更改好像被忽略了,記住你必須執行FLUSH PRIVILEGES語句或mysqladmin flush-privileges命令讓服務器來重讀授權表。否則,直到服務器下次重啟,你的更改方有效。記住用UPDATE命令更改root密碼后,在清空權限前,你不需要指定新密碼,因為服務器還不知道你已經更改了密碼!

·         如果你的權限似乎在一個會話過程中改變了,可能是一個超級用戶改變了他們。再次裝入授權表會影響新客戶端連接,但是它也影響現存的連接,如5.7.7節,“權限更改何時生效”小節所述。

·         如果你有PerlPythonODBC程序的存取問題,試著用mysql -u user_name db_namemysql -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服務器。這將打印有關嘗試連接的主機和用戶信息,和發出的每個命令的信息。請參見E.1.2節,“創建跟蹤文件”。

·         如果你有任何與MySQL授權表的其它問題,而且覺得你必須將這個問題發送到郵件表,一定要提供一個MySQL授權表的傾倒副本(dump)。你可用mysqldump mysql命令復制數據庫表。象平時一樣,用mysqlbug腳本郵寄你的問題。參見1.7.1.3節,“如何通報缺陷和問題”。在一些情況下可以用--skip-grant-tables重啟mysqld以便能運行mysqldump


 
作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html
北斗有巢氏 有巢氏北斗