MySQL時的一些常見錯誤
添加時間:2014-7-29 4:17:07
添加:
思海網絡
MySQL server has gone away錯誤:
本小節也涉及有關Lost connection to server during query的錯誤。
對MySQL server has gone away錯誤最常見的原因是服務器超時了并且關閉了連接。缺省地,如果沒有事情發生,服務器在 8個小時后關閉連接。你可在啟動mysqld時通過設置wait_timeout變量改變時間限制。
你可以通過執行mysqladmin version并且檢驗正常運行的時間來檢查MySQL還沒死掉。
如果你有一個腳本,你只須再發出查詢讓客護進行一次自動的重新連接。
在這種請下,你通常能獲得下列錯誤代碼(你得到的是OS相關的):
CR_SERVER_GONE_ERROR 客戶不能發送一個問題給服務器。
CR_SERVER_LOST 當寫服務器時,客戶沒有出錯,但是它沒有得到對問題的一個完整的答案(或任何答案)。
如果你向服務器發送不正確的或太大的查詢,你也可能得到這些錯誤。如果mysqld得到一個太大或不正常的包,它認為客戶出錯了并關閉連接。如果你需要較大的查詢(例如,如果你正在處理較大的BLOB列),你可以使用-O max_allowed_packet=#選項(缺省1M)啟動mysqld以增加查詢限制。多余的內存按需分配,這樣mysqld只有在你發出較大差詢時或mysqld必須返回較大的結果行時,才使用更多的內存!
Can't connect to [local] MySQL server錯誤
一個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過程,你應該啟動一個。見4.15.2 啟動MySQL服務器的問題。
如果一個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 軟件包。見4.2 由MySQL支持的操作系統。然而,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選項啟動。
Host '...' is blocked錯誤
如果你得到象這樣的一個錯誤:
Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
這意味著,mysqld已經得到了大量(max_connect_errors)的主機'hostname'的在中途被中斷了的連接請求。在max_connect_errors次失敗請求后,mysqld認定出錯了(象來字一個黑客的攻擊),并且阻止該站點進一步的連接,直到某人執行命令mysqladmin flush-hosts。
缺省地,mysqld在10個連接錯誤后阻塞一臺主機。你可以通過象這樣啟動服務器很容易地調整它:
shell> safe_mysqld -O max_connect_errors=10000 &
注意,對給定的主機,如果得到這條錯誤消息,你應該首先檢查該主機的TCP/IP連接有沒有問題。如果你的TCP/IP連接不在運行,增加max_connect_errors變量的值對你也不會有幫助!
Too many connections錯誤
如果在你試土連接MySQL時,你得到錯誤Too many connections,這意味著已經有max_connections個客戶連接了mysqld服務器。
如果你需要比缺省(100)更多的連接,那么你應該重啟mysqld,用更大的 max_connections 變量值。
注意,mysqld實際上允許(max_connections+1)個客戶連接。最后一個連接是為一個用Process權限的用戶保留的。通過不把這個權限給一般用戶(他們不應該需要它),有這個權限一個管理員可以登錄并且使用SHOW PROCESSLIST找出什么可能出錯。見7.21 SHOW句法(得到表,列的信息)。
Out of memory錯誤
如果你發出查詢并且得到類似于下面的錯誤:
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
注意,錯誤指向了MySQL客戶mysql。這個錯誤的原因很簡單,客戶沒有足夠的內存存儲全部結果。
為了修正這個問題,首先檢查你的查詢是否正確。它應該返回這么多的行,這合理嗎?如果是這樣,你可以使用mysql --quick,它使用mysql_use_result()檢索結果集合。這將較少的負擔放在了客戶端(只是服務器更多)。
Packet too large錯誤
當一個MySQL客戶或mysqld服務器得到一個比max_allowed_packet個字節長的包,它發出一個Packet too large錯誤并終止連接。
如果你正在使用mysql客戶,你可以通過用mysql --set-variable=max_allowed_packet=8M指定一個更大的緩沖區來啟動客戶程序。
如果你正在使用不允許你指定最大包大小的其他客戶(例如 DBI),你需要在你啟動服務器時設置包大小。你可以使用mysqld的命令行選項設置max_allowed_packet為一個更大的尺寸。例如,如果你正期望將一個全長的BLOB存入一張表中,你將需要用--set-variable=max_allowed_packet=24M選項來啟動服務器。
The table is full錯誤
這個錯誤發生在內存臨時表變得比tmp_table_size字節大時。為了避免這個問題,你可以使用mysqld的-O tmp_table_size=#選項來增加臨時表的大小,或在你發出有疑問的查詢之前使用SQL選項SQL_BIG_TABLES。見7.25 SET OPTION句法。
你也可以使用--big-tables選項啟動mysqld。這與為所有查詢使用SQL_BIG_TABLES完全相同。
Commands out of sync in client錯誤
如果你在你的客戶代碼中得到Commands out of sync; You can't run this command now,你正在以錯誤的次序調用客戶函數!
這可能發生,例如,如果你正在使用mysql_use_result()并且在你已經調用了mysql_free_result()之前試圖執行新查詢。如果你在mysql_use_result()或mysql_store_result()之間試圖執行返回數據的2個查詢,它也可能發生。
Ignoring user錯誤
如果你得到下列錯誤:
Found wrong password for user: 'some_user@some_host'; Ignoring user
這意味著在mysqld啟動時或在它再次裝載權限表時,它在user表中找到了一個有一個無效口令的條目。結果,條目簡單地被權限系統忽略。
可能導致這個問題的原因和修正:
你可能正在運行一個有一個老的user表的新版本mysqld。你可以通過執行mysqlshow mysql user看看口令字段是否少于 16個字符來檢查它。如果是這樣,你可以通過運行s/add_long_password腳本改正這種情況。
用戶有一個老式的口令(8個字符長)并且你沒使用--old-protocol選項啟動mysqld。用一個新口令更新在user表中的用戶或用--old-protocol重啟mysqld。
你沒有使用PASSWORD()函數在在user表中指定了一個口令。使用mysql以一個新口令更新在user表中的用戶。確保使用PASSWORD()函數:
mysql> update user set password=PASSWORD('your password')
where user='XXX';
Table 'xxx' doesn't exist錯誤
如果你得到錯誤Table 'xxx' doesn't exist或Can't find file: 'xxx' (errno: 2),這意味著在當前數據庫中沒有名為xxx的表存在。
注意,因為MySQL使用目錄和文件存儲數據庫和表,數據庫和表名件是區分大小寫的!(在Win32上,數據庫和表名不是區分大小寫的,但是在查詢中對所有表的引用必須使用相同的大小寫!)你可以用SHOW TABLES檢查你在當前數據庫中有哪個表。
本小節也涉及有關Lost connection to server during query的錯誤。
對MySQL server has gone away錯誤最常見的原因是服務器超時了并且關閉了連接。缺省地,如果沒有事情發生,服務器在 8個小時后關閉連接。你可在啟動mysqld時通過設置wait_timeout變量改變時間限制。
你可以通過執行mysqladmin version并且檢驗正常運行的時間來檢查MySQL還沒死掉。
如果你有一個腳本,你只須再發出查詢讓客護進行一次自動的重新連接。
在這種請下,你通常能獲得下列錯誤代碼(你得到的是OS相關的):
CR_SERVER_GONE_ERROR 客戶不能發送一個問題給服務器。
CR_SERVER_LOST 當寫服務器時,客戶沒有出錯,但是它沒有得到對問題的一個完整的答案(或任何答案)。
如果你向服務器發送不正確的或太大的查詢,你也可能得到這些錯誤。如果mysqld得到一個太大或不正常的包,它認為客戶出錯了并關閉連接。如果你需要較大的查詢(例如,如果你正在處理較大的BLOB列),你可以使用-O max_allowed_packet=#選項(缺省1M)啟動mysqld以增加查詢限制。多余的內存按需分配,這樣mysqld只有在你發出較大差詢時或mysqld必須返回較大的結果行時,才使用更多的內存!
Can't connect to [local] MySQL server錯誤
一個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過程,你應該啟動一個。見4.15.2 啟動MySQL服務器的問題。
如果一個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 軟件包。見4.2 由MySQL支持的操作系統。然而,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選項啟動。
Host '...' is blocked錯誤
如果你得到象這樣的一個錯誤:
Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
這意味著,mysqld已經得到了大量(max_connect_errors)的主機'hostname'的在中途被中斷了的連接請求。在max_connect_errors次失敗請求后,mysqld認定出錯了(象來字一個黑客的攻擊),并且阻止該站點進一步的連接,直到某人執行命令mysqladmin flush-hosts。
缺省地,mysqld在10個連接錯誤后阻塞一臺主機。你可以通過象這樣啟動服務器很容易地調整它:
shell> safe_mysqld -O max_connect_errors=10000 &
注意,對給定的主機,如果得到這條錯誤消息,你應該首先檢查該主機的TCP/IP連接有沒有問題。如果你的TCP/IP連接不在運行,增加max_connect_errors變量的值對你也不會有幫助!
Too many connections錯誤
如果在你試土連接MySQL時,你得到錯誤Too many connections,這意味著已經有max_connections個客戶連接了mysqld服務器。
如果你需要比缺省(100)更多的連接,那么你應該重啟mysqld,用更大的 max_connections 變量值。
注意,mysqld實際上允許(max_connections+1)個客戶連接。最后一個連接是為一個用Process權限的用戶保留的。通過不把這個權限給一般用戶(他們不應該需要它),有這個權限一個管理員可以登錄并且使用SHOW PROCESSLIST找出什么可能出錯。見7.21 SHOW句法(得到表,列的信息)。
Out of memory錯誤
如果你發出查詢并且得到類似于下面的錯誤:
mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory
注意,錯誤指向了MySQL客戶mysql。這個錯誤的原因很簡單,客戶沒有足夠的內存存儲全部結果。
為了修正這個問題,首先檢查你的查詢是否正確。它應該返回這么多的行,這合理嗎?如果是這樣,你可以使用mysql --quick,它使用mysql_use_result()檢索結果集合。這將較少的負擔放在了客戶端(只是服務器更多)。
Packet too large錯誤
當一個MySQL客戶或mysqld服務器得到一個比max_allowed_packet個字節長的包,它發出一個Packet too large錯誤并終止連接。
如果你正在使用mysql客戶,你可以通過用mysql --set-variable=max_allowed_packet=8M指定一個更大的緩沖區來啟動客戶程序。
如果你正在使用不允許你指定最大包大小的其他客戶(例如 DBI),你需要在你啟動服務器時設置包大小。你可以使用mysqld的命令行選項設置max_allowed_packet為一個更大的尺寸。例如,如果你正期望將一個全長的BLOB存入一張表中,你將需要用--set-variable=max_allowed_packet=24M選項來啟動服務器。
The table is full錯誤
這個錯誤發生在內存臨時表變得比tmp_table_size字節大時。為了避免這個問題,你可以使用mysqld的-O tmp_table_size=#選項來增加臨時表的大小,或在你發出有疑問的查詢之前使用SQL選項SQL_BIG_TABLES。見7.25 SET OPTION句法。
你也可以使用--big-tables選項啟動mysqld。這與為所有查詢使用SQL_BIG_TABLES完全相同。
Commands out of sync in client錯誤
如果你在你的客戶代碼中得到Commands out of sync; You can't run this command now,你正在以錯誤的次序調用客戶函數!
這可能發生,例如,如果你正在使用mysql_use_result()并且在你已經調用了mysql_free_result()之前試圖執行新查詢。如果你在mysql_use_result()或mysql_store_result()之間試圖執行返回數據的2個查詢,它也可能發生。
Ignoring user錯誤
如果你得到下列錯誤:
Found wrong password for user: 'some_user@some_host'; Ignoring user
這意味著在mysqld啟動時或在它再次裝載權限表時,它在user表中找到了一個有一個無效口令的條目。結果,條目簡單地被權限系統忽略。
可能導致這個問題的原因和修正:
你可能正在運行一個有一個老的user表的新版本mysqld。你可以通過執行mysqlshow mysql user看看口令字段是否少于 16個字符來檢查它。如果是這樣,你可以通過運行s/add_long_password腳本改正這種情況。
用戶有一個老式的口令(8個字符長)并且你沒使用--old-protocol選項啟動mysqld。用一個新口令更新在user表中的用戶或用--old-protocol重啟mysqld。
你沒有使用PASSWORD()函數在在user表中指定了一個口令。使用mysql以一個新口令更新在user表中的用戶。確保使用PASSWORD()函數:
mysql> update user set password=PASSWORD('your password')
where user='XXX';
Table 'xxx' doesn't exist錯誤
如果你得到錯誤Table 'xxx' doesn't exist或Can't find file: 'xxx' (errno: 2),這意味著在當前數據庫中沒有名為xxx的表存在。
注意,因為MySQL使用目錄和文件存儲數據庫和表,數據庫和表名件是區分大小寫的!(在Win32上,數據庫和表名不是區分大小寫的,但是在查詢中對所有表的引用必須使用相同的大小寫!)你可以用SHOW TABLES檢查你在當前數據庫中有哪個表。
關鍵字:MySQL、數據庫、服務器
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解