文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  連線至 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 密碼」中的說明。在找到或重設您的密碼後,請使用 --password (或 -p) 選項,再次以 root 身分登入。

    $> 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 連線。您也可以透過指定使用本機主機實際主機名稱的 --host 選項來使用 TCP/IP。在這種情況下,即使您在與伺服器相同的主機上執行用戶端程式,主機名稱也必須在伺服器主機的 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 上,可能發生此錯誤的另一個原因是您正在使用以不同版本的 glibc 程式庫編譯的二進位 MySQL 版本,而不是您正在使用的版本。在這種情況下,您應該升級您的作業系統或 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 中輸入用戶端機器名稱的項目。

    • 啟動已啟用 skip_name_resolve 系統變數的 mysqld

    • 啟動 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 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',或是刪除 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 user_name db_namemysql -u user_name -ppassword db_name 連線到伺服器。如果您可以使用 mysql 用戶端連線,則問題出在您的程式,而不是存取權限。(-p 與密碼之間沒有空格;您也可以使用 --password=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 Community Slack 上提問,請務必提供 MySQL 授權表的傾印檔。您可以使用 mysqldump mysql 命令傾印這些表格。若要提交錯誤報告,請參閱 第 1.6 節「如何報告錯誤或問題」中的指示。在某些情況下,您可能需要使用 --skip-grant-tables 重新啟動 mysqld,才能執行 mysqldump