文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  疑難排解連線至 MySQL 的問題

8.2.22 疑難排解連線至 MySQL 的問題

如果您在嘗試連線至 MySQL 伺服器時遇到問題,以下項目描述您可以採取的一些行動方針來修正問題。

  • 請確定伺服器正在執行。如果伺服器未執行,用戶端就無法連線至伺服器。例如,如果嘗試連線至伺服器失敗,並顯示類似以下訊息之一,其中一個原因可能是伺服器未執行

    $> mysql
    ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
    $> mysql
    ERROR 2002: Can't connect to local MySQL server through socket
    '/tmp/mysql.sock' (111)
  • 可能是伺服器正在執行,但您嘗試使用與伺服器接聽的 TCP/IP 連接埠、具名管道或 Unix Socket 檔案不同的項目來連線。若要修正此問題,當您叫用用戶端程式時,請指定 --port 選項以指出正確的連接埠號碼,或指定 --socket 選項以指出正確的具名管道或 Unix Socket 檔案。若要找出 Socket 檔案的位置,您可以使用此命令

    $> 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 上的二進位散佈或 Linux 上的 RPM 和 DEB 散佈),安裝程序會初始化 MySQL 資料目錄,包括包含授權表的 mysql 系統資料庫。對於未執行此操作的散佈,您必須手動初始化資料目錄。如需詳細資訊,請參閱第 2.9 節「安裝後設定和測試」

    若要判斷是否需要初始化授權表,請在資料目錄下尋找 mysql 目錄。(資料目錄通常命名為 datavar,並且位於 MySQL 安裝目錄下。) 請確定 mysql 資料庫目錄中有一個名為 user.MYD 的檔案。如果沒有,請初始化資料目錄。完成此操作並啟動伺服器後,您應該就能夠連線至伺服器。

  • 全新安裝後,如果您嘗試在不使用密碼的情況下以 root 身分登入伺服器,您可能會收到以下錯誤訊息。

    $> mysql -u root 
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    這表示在安裝過程中已設定 root 密碼,並且必須提供該密碼。請參閱第 2.9.4 節「保護初始 MySQL 帳戶」,了解密碼可能被設定的不同方式,以及在某些情況下如何找到它。如果您需要重設 root 密碼,請參閱第 B.3.3.2 節「如何重設 Root 密碼」中的說明。找到或重設密碼後,請再次以 root 身分使用 --password (或 -p) 選項登入。

    $> mysql -u root -p
    Enter password:

    但是,如果您使用 mysqld --initialize-insecure 初始化 MySQL (詳細資訊請參閱第 2.9.1 節「初始化資料目錄」),伺服器會允許您在不使用密碼的情況下以 root 身分連線。這存在安全風險,因此您應該為 root 帳戶設定密碼;請參閱第 2.9.4 節「保護初始 MySQL 帳戶」以取得相關說明。

  • 如果您已將現有的 MySQL 安裝更新至較新版本,您是否執行了 MySQL 升級程序?如果沒有,請執行。當新增功能時,授權表的結構偶爾會變更,因此在升級後,您應始終確保您的資料表具有目前的結構。如需相關說明,請參閱第 3 章《升級 MySQL

  • 如果用戶端程式在嘗試連線時收到以下錯誤訊息,表示伺服器預期的密碼格式比用戶端能夠產生的格式更新。

    $> mysql
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
  • 請記住,用戶端程式會使用選項檔案或環境變數中指定的連線參數。如果當您未在命令列上指定連線參數時,用戶端程式似乎正在傳送不正確的預設連線參數,請檢查任何適用的選項檔案和您的環境。例如,如果您在執行沒有任何選項的用戶端時收到 Access denied,請確保您未在任何選項檔案中指定舊密碼!

    您可以使用 --no-defaults 選項來叫用用戶端程式,以抑制用戶端程式使用選項檔案。例如:

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

    用戶端使用的選項檔案列在第 6.2.2.2 節「使用選項檔案」。環境變數列在第 6.9 節「環境變數」

  • 如果您收到以下錯誤,表示您正在使用不正確的 root 密碼:

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

    即使您沒有指定密碼,但仍發生上述錯誤,表示您在某些選項檔案中列出了不正確的密碼。請嘗試使用上一個項目中描述的 --no-defaults 選項。

    如需有關變更密碼的資訊,請參閱第 8.2.14 節「指派帳戶密碼」

    如果您遺失或忘記了 root 密碼,請參閱第 B.3.3.2 節「如何重設 Root 密碼」

  • localhost 是您本機主機名稱的同義詞,也是當您未明確指定主機時,用戶端嘗試連線的預設主機。

    您可以使用 --host=127.0.0.1 選項來明確命名伺服器主機。這會導致與本機 mysqld 伺服器建立 TCP/IP 連線。您也可以使用 TCP/IP,方法是指定一個使用本機主機實際主機名稱的 --host 選項。在這種情況下,即使您在與伺服器相同的主機上執行用戶端程式,也必須在伺服器主機上的 user 資料表中指定主機名稱。

  • Access denied 錯誤訊息會告訴您您嘗試以哪個身分登入、您嘗試從哪個用戶端主機連線,以及您是否正在使用密碼。一般而言,您應該在 user 資料表中有一列,其完全符合錯誤訊息中提供的主機名稱和使用者名稱。例如,如果您收到包含 using password: NO 的錯誤訊息,表示您嘗試在不使用密碼的情況下登入。

  • 如果您在嘗試使用 mysql -u user_name 連線至資料庫時收到 Access denied 錯誤,您可能在 user 資料表中遇到問題。請透過執行 mysql -u root mysql 並發出以下 SQL 陳述式來檢查此問題:

    SELECT * FROM user;

    結果應包含一列,其中 HostUser 資料行符合您用戶端的主機名稱和 MySQL 使用者名稱。

  • 如果您嘗試從執行 MySQL 伺服器以外的主機連線時發生以下錯誤,表示 user 資料表中沒有 Host 值符合用戶端主機的列:

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

    您可以透過為嘗試連線時使用的用戶端主機名稱和使用者名稱組合設定帳戶來修正此問題。

    如果您不知道您正在連線的電腦的 IP 位址或主機名稱,您應該在 user 資料表中放入一列,其中 Host 資料行值為 '%'。在嘗試從用戶端電腦連線後,請使用 SELECT USER() 查詢來查看您實際上是如何連線的。然後將 user 資料表列中的 '%' 變更為記錄中顯示的實際主機名稱。否則,您的系統會變得不安全,因為它允許來自任何主機的特定使用者名稱的連線。

    在 Linux 上,發生此錯誤的另一個原因可能是您正在使用的二進位 MySQL 版本是使用與您使用的 glibc 程式庫版本不同的版本編譯的。在這種情況下,您應該升級作業系統或 glibc,或下載 MySQL 版本的原始程式碼發行版並自行編譯。原始程式碼 RPM 通常很容易編譯和安裝,因此這不是大問題。

  • 如果您在嘗試連線時指定主機名稱,但收到未顯示主機名稱或顯示為 IP 位址的錯誤訊息,表示 MySQL 伺服器在嘗試將用戶端主機的 IP 位址解析為名稱時發生錯誤。

    $> mysqladmin -u root -pxxxx -h some_hostname ver
    Access denied for user 'root'@'' (using password: YES)

    如果您嘗試以 root 身分連線並收到以下錯誤,表示您的 user 資料表中沒有 User 資料行值為 'root' 的列,並且 mysqld 無法解析用戶端的主機名稱:

    Access denied for user ''@'unknown'

    這些錯誤表示 DNS 問題。若要修正此問題,請執行 mysqladmin flush-hosts 以重設內部 DNS 主機快取。請參閱第 7.1.12.3 節「DNS 查詢和主機快取」

    一些永久的解決方案如下:

    • 判斷您的 DNS 伺服器發生什麼問題並加以修正。

    • 在 MySQL 授權表中指定 IP 位址而不是主機名稱。

    • 在 Unix 上,將用戶端電腦名稱的項目放入 /etc/hosts 中;在 Windows 上,放入 \windows\hosts 中。

    • 啟動 mysqld 時啟用 skip_name_resolve 系統變數。

    • 啟動 mysqld 時啟用 --host-cache-size=0

    • 在 Unix 上,如果您在同一部電腦上執行伺服器和用戶端,請連線至 localhost。對於與 localhost 的連線,MySQL 程式會嘗試使用 Unix socket 檔案連線至本機伺服器,除非指定了連線參數以確保用戶端建立 TCP/IP 連線。如需詳細資訊,請參閱第 6.2.4 節「使用命令選項連線至 MySQL 伺服器」

    • 在 Windows 上,如果您在同一部電腦上執行伺服器和用戶端,且伺服器支援具名管道連線,請連線至主機名稱 . (句點)。與 . 的連線會使用具名管道而非 TCP/IP。

  • 如果 mysql -u root 有效,但 mysql -h your_hostname -u root 導致 Access denied (其中 your_hostname 是本機主機的實際主機名稱),您可能在 user 資料表中沒有主機的正確名稱。這裡的常見問題是,user 資料表列中的 Host 值指定了未完全限定的主機名稱,但您系統的名稱解析常式會傳回完全限定的網域名稱 (反之亦然)。例如,如果您的 user 資料表中有主機 'pluto' 的列,但您的 DNS 告知 MySQL 您的主機名稱為 'pluto.example.com',則該列無法運作。嘗試在 user 資料表中新增一列,其中包含您主機的 IP 位址作為 Host 資料行值。(或者,您可以在 user 資料表中新增一列,其中 Host 值包含萬用字元 (例如 'pluto.%')。但是,使用以 % 結尾的 Host 值是不安全的,且建議使用!)

  • 如果 mysql -u user_name 有效,但 mysql -u user_name some_db 無效,表示您尚未授予特定使用者存取名稱為 some_db 的資料庫的權限。

  • 如果 mysql -u 使用者名稱 在伺服器主機上執行時可以正常運作,但 mysql -h 主機名稱 -u 使用者名稱 在遠端用戶端主機上執行時無法運作,表示您尚未啟用該使用者名稱從遠端主機存取伺服器的權限。

  • 如果您無法找出為何會收到 Access denied 錯誤訊息,請從 user 表格中移除所有 Host 值包含萬用字元(包含 '%''_' 字元的列)。一個很常見的錯誤是插入新的列,其中 Host='%'User='某使用者',以為這樣就可以指定 localhost 從同一台機器連線。之所以無法運作的原因是,預設權限包含一列,其中 Host='localhost'User=''。由於該列的 Host'localhost''%' 更為明確,因此當從 localhost 連線時,會優先使用該列,而不是新的列!正確的步驟是插入第二列,其中 Host='localhost'User='某使用者',或是刪除 Host='localhost'User='' 的列。刪除該列後,請記得執行 FLUSH PRIVILEGES 陳述式,重新載入授權表格。另請參閱 第 8.2.6 節,「存取控制,階段 1:連線驗證」

  • 如果您可以連線到 MySQL 伺服器,但在您執行 SELECT ... INTO OUTFILELOAD DATA 陳述式時,總是收到 Access denied 訊息,表示您在 user 表格中的列未啟用 FILE 權限。

  • 如果您直接變更授權表格(例如,使用 INSERTUPDATEDELETE 陳述式),而且您的變更似乎被忽略,請記得您必須執行 FLUSH PRIVILEGES 陳述式或 mysqladmin flush-privileges 指令,以讓伺服器重新載入權限表格。否則,您的變更在下次伺服器重新啟動之前不會生效。請記得,當您使用 UPDATE 陳述式變更 root 密碼後,在您重新整理權限之前,不需要指定新密碼,因為伺服器在那之前並不知道您已變更密碼。

  • 如果您的權限似乎在工作階段中途變更,可能是 MySQL 管理員變更了它們。重新載入授權表格會影響新的用戶端連線,也會影響現有的連線,如 第 8.2.13 節,「權限變更生效的時間」 中所述。

  • 如果您的 Perl、PHP、Python 或 ODBC 程式出現存取問題,請嘗試使用 mysql -u 使用者名稱 資料庫名稱mysql -u 使用者名稱 -p密碼 資料庫名稱 連線到伺服器。如果您可以使用 mysql 用戶端連線,則問題出在您的程式,而不是存取權限。(-p 和密碼之間沒有空格;您也可以使用 --password=密碼 語法來指定密碼。如果您使用 -p--password 選項而沒有密碼值,MySQL 會提示您輸入密碼。)

  • 為了測試目的,請使用 --skip-grant-tables 選項啟動 mysqld 伺服器。然後,您可以變更 MySQL 授權表格,並使用 SHOW GRANTS 陳述式檢查您的修改是否產生預期的效果。當您對變更感到滿意時,請執行 mysqladmin flush-privileges 以告知 mysqld 伺服器重新載入權限。這樣您就可以開始使用新的授權表格內容,而無需停止並重新啟動伺服器。

  • 如果其他所有方法都失敗,請使用除錯選項(例如,--debug=d,general,query)啟動 mysqld 伺服器。這會印出嘗試連線的主機和使用者資訊,以及每個發出指令的相關資訊。請參閱 第 7.9.4 節,「DBUG 套件」

  • 如果您在 MySQL 授權表格方面有任何其他問題,並在 MySQL 社群 Slack 上提問,請務必提供 MySQL 授權表格的傾印。您可以使用 mysqldump mysql 指令傾印表格。若要提交錯誤報告,請參閱 第 1.6 節,「如何回報錯誤或問題」 中的指示。在某些情況下,您可能需要使用 --skip-grant-tables 重新啟動 mysqld,才能執行 mysqldump