Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ";
是你的mysql.sock 文件不存在了,
可能是被你不小心刪除了,
連接localhost通常通過一個Unix域套接字文件進行,一般是/tmp/mysql.sock。如果套接字文件被刪除了,本地客戶就不能連接。這可能發生在你的系統運行一個cron任務刪除了/tmp下的臨時文件。
如果你因為丟失套接字文件而不能連接,你可以簡單地通過重啟服務器重新創建得到它。因為服務器在啟動時重新創建它。
另一個解決辦法是你現在不能用套接字建立連接因為它不見了,你可以建立一個TCP/IP連接,例如,如果服務器主機是192.168.0.1,你可以這樣連接:
%mysql -u root -h 192.168.0.1 -p
%mysqladmin -u root -h 192.168.0.1 -p shutdown
如果套接字文件被一個cron任務刪除,問題將重復出現,除非你修改cron任務或使用一個或使用一個不同的套接字文件,你可以使用全局選項文件指定一個 不同的套接字,例如,如果數據目錄是/usr/local/var,你可以通過將下列行加入/etc/my.cnf中,將套接字文件移到那里:
[mysqld]
socket=/usr/local/var/mysql.sock
[client]
socket=/usr/local/var/mysql.sock
對服務器和客戶均指定路徑名,使得它們都使用同一個套接字文件。如果你只為服務器設置路徑,客戶程序將仍然期望在原位置執行套接字,在修改后重啟服務器,使它在新位置創建套接字
=============================================
怎樣保護“/tmp/mysql.sock ”不被刪除
如果你有這個問題,事實上任何人可以刪除MySQL通訊套接字“/tmp/mysql.sock”,在Unix的大多數版本上,你能通過為其設置sticky(t)位來保護你的“/tmp”文件系統。作為root登錄並且做下列事情:
shell> chmod +t /tmp
這將保護你的“/tmp”文件系統使得文件僅能由他們的所有者或超級用戶(root)刪除。
你能執行ls -ld /tmp檢查sticky位是否被設置,如果最后一位許可位是t,該位被設置了。
=============================================
一個MySQL客戶可以兩種不同的方式連接mysqld服務器:Unix套接字,它通過在文件系統中的一個文件(缺省“/tmp /mysqld.sock”)進行連接;或TCP/IP,它通過一個端口號連接。Unix套接字比TCP/IP更快,但是只有用在連接同一台計算機上的服 務器。如果你不指定主機名或如果你指定特殊的主機名localhost,使用Unix套接字。
錯誤(2002)Can 't connect to ...通常意味着沒有一個MySQL服務器運行在系統上或當試圖連接mysqld服務器時,你正在使用一個錯誤的套接字文件或TCP/IP端口。
由檢查(使用ps)在你的服務器上有一個名為mysqld的進程啟動!如果沒有任何mysqld過程,你應該啟動一個。
如果一個mysqld過程正在運行,你可以通過嘗試這些不同的連接來檢查服務器(當然,端口號和套接字路徑名可能在你的安裝中是不同的):
shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host ' version
shell> mysqladmin --socket=/tmp/mysql.sock version
注意hostname命令使用反引號“`”而非正引號“ '”;這些導致hostname輸出(即,當前主機名)被代替進mysqladmin命令中。
這是可能造成Can 't connect to local MySQL server錯誤的一些原因:
mysqld不在運行。
你正在使用MIT-pthreads的一個系統上運行。如果正在運行在一個沒有原生線程的系統上,mysqld使用 MIT-pthreads 軟件包。然而,MIT-pthreads不支持Unix套接字,因此當與服務器連接時,在這樣一個系統上,你總是必須明確地指定主機名。試試使用這個命令 檢查到服務器的連接:
shell> mysqladmin -h `hostname` version
某人刪除了mysqld使用的Unix套接字(缺省“/tmp/mysqld.sock”)。你可能有一個cron任務刪除了MySQL套接字(例如,一 個把舊文件從“/tmp”目錄中刪除的任務)。你總是可以運行mysqladmin version並且檢查mysqladmin正在試圖使用的套接字確實存在。在這種情況下,修復方法是刪除cron任務而不刪除“mysqld.sock 或將套接字放在其他地方。你能用這個命令在MySQL配置時指定一個不同的套接字地點:
shell> ./configure --with-unix-socket-path=/path/to/socket
你也可以使用--socket=/path/to/socket選項啟動safe_mysqld和在啟動你的MySQL客戶前設置環境變量 MYSQL_UNIX_PORT為套接字路徑名。你可用--socket=/path/to/socket選項啟動mysqld服務器。如果你改變了服務 器的套接字路徑名,你也必須通知MySQL客戶關於新路徑的情況。你可以通過設置環境變量MYSQL_UNIX_PORT為套接字路徑名或由提供套接字路 徑名作為客戶的參數做到。你可用這個命令測試套接字:
shell> mysqladmin --socket=/path/to/socket version
你正在使用 Linux和線程已經死了(核心傾倒了)。在這種情況中,你必須殺死其它mysqld線程(例如在啟動一個新的MySQL服務器之前,可以用mysql_zap腳本)。見18.1 如果MySQL總是崩潰怎么辦。
如果你得到錯誤Can 't connect to MySQL server on some_hostname,你可以嘗試下列步驟找出問題是什么:
通過執行telnet your-host-name tcp-ip-port-number並且按幾次回車來檢查服務器是否正常運行。如果有一個MySQL運行在這個端口上,你應該得到一個包含正在運行的 MySQL服務器的版本號的應答。如果你得到類似於telnet: Unable to connect to remote host: Connection refused的一個錯誤,那么沒有服務器在使用的端口上運行。
嘗試連接本地機器上的mysqld守護進程,並用mysqladmin variables檢查mysqld被配置使用的TCP/IP端口(變量port)。
檢查你的mysqld服務器沒有用--skip-networking選項啟動。
不要使用 mysql -h 'localhost '來連接mysql服務器,這樣的語句只能在同一台機子上運行,用mysql -h 127.0.0.1 這樣的語句來連接服務器。