Unix 上的 MySQL 用戶端可以使用兩種不同的方式連線到 mysqld 伺服器:透過使用 Unix Socket 檔案,經由檔案系統中的檔案連線(預設為 /tmp/mysql.sock
),或使用 TCP/IP,經由連接埠號碼連線。Unix Socket 檔案連線比 TCP/IP 快,但只能在連線到同一部電腦上的伺服器時使用。如果您未指定主機名稱,或指定特殊的主機名稱 localhost
,則會使用 Unix Socket 檔案。
如果 MySQL 伺服器在 Windows 上執行,您可以使用 TCP/IP 連線。如果伺服器啟動時啟用了 named_pipe
系統變數,如果您在伺服器執行的主機上執行用戶端,也可以使用具名管道連線。具名管道的名稱預設為 MySQL
。如果您在連線到 mysqld 時未提供主機名稱,MySQL 用戶端會先嘗試連線到具名管道。如果無法運作,則會連線到 TCP/IP 連接埠。您可以在 Windows 上使用 .
作為主機名稱,強制使用具名管道。
錯誤 (2002) 無法連線到 ...
通常表示系統上沒有執行 MySQL 伺服器,或者您在嘗試連線到伺服器時使用了不正確的 Unix Socket 檔案名稱或 TCP/IP 連接埠號碼。您也應該檢查您使用的 TCP/IP 連接埠是否未被防火牆或連接埠封鎖服務封鎖。
錯誤 (2003) 無法連線到 '
表示網路連線已被拒絕。您應該檢查是否有 MySQL 伺服器正在執行、它是否已啟用網路連線,以及您指定的網路連接埠是否為伺服器上設定的連接埠。server
' 上的 MySQL 伺服器 (10061)
首先檢查您的伺服器主機上是否有一個名為 mysqld 的程序正在執行。(在 Unix 上使用 ps xa | grep mysqld,或在 Windows 上使用工作管理員。)如果沒有此類程序,您應該啟動伺服器。請參閱第 2.9.2 節,「啟動伺服器」。
如果 mysqld 程序正在執行,您可以嘗試下列命令來檢查它。您的設定中的連接埠號碼或 Unix Socket 檔案名稱可能不同。host_ip
代表執行伺服器的機器的 IP 位址。
$> mysqladmin version
$> mysqladmin variables
$> mysqladmin -h `hostname` version variables
$> mysqladmin -h `hostname` --port=3306 version
$> mysqladmin -h host_ip version
$> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version
請注意,hostname 命令使用的是反引號,而不是前引號;這些會將 hostname 的輸出(即目前的主機名稱)代入 mysqladmin 命令中。如果您沒有 hostname 命令,或在 Windows 上執行,您可以在 -h
選項後面手動輸入您機器的名稱(不帶反引號)。您也可以嘗試使用 -h 127.0.0.1
,透過 TCP/IP 連線到本機主機。
請確定伺服器未設定為忽略網路連線,或者(如果您嘗試遠端連線)未設定為僅在本機的網路介面上進行監聽。如果伺服器啟動時啟用了 skip_networking
系統變數,則完全無法接受 TCP/IP 連線。如果伺服器啟動時將 bind_address
系統變數設定為 127.0.0.1
,則它僅在本機迴路介面上監聽 TCP/IP 連線,且不接受遠端連線。
檢查確定沒有防火牆封鎖對 MySQL 的存取。您的防火牆可能根據執行的應用程式或 MySQL 用於通訊的連接埠號碼(預設為 3306)進行設定。在 Linux 或 Unix 下,檢查您的 IP 表(或類似)設定,確保連接埠未被封鎖。在 Windows 下,可能需要設定 ZoneAlarm 或 Windows 防火牆等應用程式,以避免封鎖 MySQL 連接埠。
以下是一些可能發生 無法連線到本機 MySQL 伺服器
錯誤的原因
您在 Windows 上執行 MySQL 伺服器,且有許多 TCP/IP 連線連線到它。如果您經常遇到用戶端收到該錯誤,您可以在這裡找到解決方法:第 B.3.2.2.1 節,「Windows 上 MySQL 伺服器的連線失敗」。
有人移除了 mysqld 使用的 Unix Socket 檔案(預設為
/tmp/mysql.sock
)。例如,您可能有一個 cron 工作,會從/tmp
目錄中移除舊檔案。您可以隨時執行 mysqladmin version 來檢查 mysqladmin 嘗試使用的 Unix Socket 檔案是否真的存在。在這種情況下,解決方法是變更 cron 工作,使其不移除mysql.sock
,或將 Socket 檔案放置在其他位置。請參閱第 B.3.3.6 節,「如何保護或變更 MySQL Unix Socket 檔案」。您已使用
--socket=/path/to/socket
選項啟動 mysqld 伺服器,但忘記告知用戶端程式新的 Socket 檔案名稱。如果您變更伺服器的 Socket 路徑名稱,您也必須通知 MySQL 用戶端。您可以在執行用戶端程式時提供相同的--socket
選項來達成此目的。您還需要確保用戶端有權限存取mysql.sock
檔案。若要找出 Socket 檔案的位置,您可以執行以下操作$> netstat -ln | grep mysql
您正在使用 Linux,且有一個伺服器執行緒已終止(核心傾印)。在這種情況下,您必須先終止其他的 mysqld 執行緒(例如使用 kill),才能重新啟動 MySQL 伺服器。請參閱第 B.3.3.3 節,「如果 MySQL 持續當機該如何處理」。
伺服器或用戶端程式可能沒有存取 Unix socket 檔案所在的目錄或 socket 檔案本身的適當權限。在這種情況下,您必須變更目錄或 socket 檔案的存取權限,讓伺服器和用戶端可以存取它們,或者使用
--socket
選項重新啟動 mysqld,該選項指定一個 socket 檔案名稱,使其位於伺服器可以建立該檔案且用戶端程式可以存取的目錄中。
如果您收到錯誤訊息 無法連線到某主機上的 MySQL 伺服器
,您可以嘗試以下方法來找出問題所在
請檢查伺服器是否在該主機上執行,方法是執行
telnet some_host 3306
並按下 Enter 鍵數次。(3306 是預設的 MySQL 連接埠號碼。如果您的伺服器正在監聽不同的連接埠,請變更該值。)如果有一個 MySQL 伺服器正在執行並監聽該連接埠,您應該會收到包含伺服器版本號碼的回應。如果您收到類似telnet: 無法連線到遠端主機:連線被拒絕
的錯誤,則表示指定的連接埠上沒有伺服器正在執行。如果伺服器在本機主機上執行,請嘗試使用 mysqladmin -h localhost variables,利用 Unix socket 檔案進行連線。確認伺服器設定為監聽的 TCP/IP 連接埠號碼(它是
port
變數的值)。如果您在 Linux 下執行且已啟用 Security-Enhanced Linux (SELinux),請參閱第 8.7 節,「SELinux」。
當您在 Windows 上執行 MySQL 伺服器,並與它建立許多 TCP/IP 連線時,且您經常遇到用戶端收到 無法連線到 MySQL 伺服器
的錯誤,原因可能是 Windows 不允許足夠的臨時(短暫)連接埠來服務這些連線。
TIME_WAIT
的目的是即使在連線關閉後,仍保持連線接受封包。這是因為網際網路路由可能會導致封包以較慢的路徑傳送到其目的地,並且可能在雙方都同意關閉後才到達。如果該連接埠正在用於新的連線,則來自舊連線的封包可能會破壞協定或洩露原始連線中的個人資訊。TIME_WAIT
延遲可確保在允許那些延遲的封包到達一段時間後,該連接埠才能重複使用,從而防止這種情況發生。
在 LAN 連線上大幅縮短 TIME_WAIT
是安全的,因為封包延遲很長時間到達的可能性很小,因為它們可能會透過具有相對較大距離和延遲的網際網路到達。
Windows 允許使用者使用臨時(短暫)的 TCP 連接埠。在關閉任何連接埠後,它會保持在 TIME_WAIT
狀態 120 秒。直到此時間到期,該連接埠才能再次使用。預設的連接埠號碼範圍取決於 Windows 的版本,較舊的版本中連接埠的數量較為有限
Windows Server 2003 及更早版本:連接埠範圍為 1025–5000
Windows Vista、Server 2008 及更新版本:連接埠範圍為 49152–65535
由於可用的 TCP 連接埠堆疊較小 (5000),並且在短時間內開啟和關閉的 TCP 連接埠數量很多,再加上 TIME_WAIT
狀態,您很有可能耗盡連接埠。有兩種方法可以解決這個問題
盡可能透過調查連線池或持續連線來減少快速消耗的 TCP 連接埠數量
調整 Windows 登錄中的一些設定(請參閱下方)
以下程序涉及修改 Windows 登錄。在修改登錄之前,請務必先備份,並確保您了解如何在發生問題時還原登錄。如需了解如何備份、還原和編輯登錄的資訊,請檢視 Microsoft 知識庫中的下列文章:http://support.microsoft.com/kb/256986/EN-US/。
啟動「登錄編輯程式」(
Regedt32.exe
)。在登錄中找出下列機碼
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在
編輯
功能表上,按一下新增數值
,然後新增下列登錄值Value Name: MaxUserPort Data Type: REG_DWORD Value: 65534
這會設定任何使用者可用的臨時連接埠數量。有效範圍介於 5000 和 65534(十進位)。預設值為 0x1388(十進位 5000)。
在
編輯
功能表上,按一下新增數值
,然後新增下列登錄值Value Name: TcpTimedWaitDelay Data Type: REG_DWORD Value: 30
這會設定在關閉 TCP 連接埠連線之前,將其保持在
TIME_WAIT
狀態的秒數。有效範圍介於 30 和 300(十進位),但您可能需要向 Microsoft 查詢最新的允許值。預設值為 0x78(十進位 120)。結束「登錄編輯程式」。
重新啟動電腦。
注意:還原上述變更應該就像刪除您建立的登錄項目一樣簡單。