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 伺服器正在執行、是否已啟用網路連線,以及您指定的網路連接埠是否為伺服器上設定的連接埠。伺服器
' 上的 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 檔案名稱,該檔案位於伺服器可以建立它且客戶端程式可以存取的目錄中。
如果您收到錯誤訊息 Can't connect to MySQL server on some_host
,您可以嘗試以下方法來找出問題所在
執行
telnet some_host 3306
並按幾次 Enter 鍵,以檢查伺服器是否正在該主機上執行。(3306 是預設的 MySQL 連接埠號碼。如果您的伺服器正在監聽不同的連接埠,請變更該值。)如果有一個 MySQL 伺服器正在執行並監聽該連接埠,您應該會收到一個包含伺服器版本號碼的回應。如果您收到類似telnet: Unable to connect to remote host: Connection refused
的錯誤,則表示在指定的連接埠上沒有伺服器正在執行。如果伺服器正在本機主機上執行,請嘗試使用 mysqladmin -h localhost variables,使用 Unix socket 檔案進行連線。確認伺服器設定為監聽的 TCP/IP 連接埠號碼 (它是
port
變數的值)。如果您在 Linux 下執行並且啟用了 Security-Enhanced Linux (SELinux),請參閱 第 8.7 節,「SELinux」。
當您在 Windows 上執行 MySQL 伺服器,並且有許多 TCP/IP 連線連到它時,而且您經常遇到客戶端收到 Can't connect to MySQL server
錯誤,原因可能是 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)。結束登錄編輯程式。
重新啟動電腦。
注意:還原上述操作應該像刪除您建立的登錄檔項目一樣簡單。