MySQL常見錯誤分析與解決方案總結
1、Can’t connect to MySQL server on ‘localhost’ (10061)
翻譯:不能串連到 localhost 上的mysql
分析:這說明“localhost”電腦是存在的,但在這台機器上卻沒提供MySQL服務。
需要啟動這台機器上的MySQL服務,如果機子負載太高沒空相應請求也會產生這個錯誤。
解決:既然沒有啟動那就去啟動這台機子的mysql。如果啟動不成功,多數是因為你的my.ini配置的有問題。重新設定其即可。
如果覺得mysql負載異常,可以到mysql/bin 的目錄下執行mysqladmin -uroot -p123 processlist來查看mysql當前的進程。
2、Unknown MySQL Server Host ‘localhosadst’ (11001)
翻譯:未知的MySQL伺服器 localhosadst
分析:伺服器 localhosasdst 不存在。或者根本無法串連
解決:仔細檢查自己論壇下面的 ./config.inc.php 找到$dbhost重新設定為正確的mysql 伺服器位址。
3、Access denied for user: ‘roota@localhost’ (Using password: YES)
翻譯:使用者 roota 訪問 localhost 被拒絕(沒有允許通過)
分析:造成這個錯誤一般資料庫使用者名稱和密碼相對mysql伺服器不正確
解決:仔細檢查自己論壇下面的 ./config.inc.php 找到$dbuser、$dbpw核實後重新設定儲存即可。
4、Access denied for user: ‘red@localhost’ to database ‘newbbs’
翻譯:使用者 red 在localhost 伺服器上沒有許可權操作資料庫newbbs
分析:這個提示和問題三是不同的。那個是在串連資料庫的時候就被阻止了,而這個錯誤是在對資料庫進行操作時引起的。比如在select update等等。這個是因為該使用者沒有操作資料庫相應的權力。比如select 這個操作在mysql.user.Select_priv裡記錄 Y 可以操作N 不可以操作。
解決:如果是自己的外掛式主控件那麼更新mysql.user 的相應使用者記錄,比如這裡要更新的使用者為red 。或者直接修改 ./config.inc.php 為其配置一個具有對資料庫操作許可權的使用者
或者通過如下的命令來更新授權grant all privileges on dbname.* to ‘user’@’localhost’ identified by ‘password’
提示:更新了mysql庫中的記錄一定要重啟mysql伺服器才能使更新生效
FLUSH PRIVILEGES;
5、No Database Selected
翻譯:沒有資料庫被選擇上
分析:產生的原因有兩種
config.inc.php 裡面$dbname設定的不對。致使資料庫根本不存在,所以在 $db->select_db($dbname); 時返回了false
和上面問題四是一樣的,資料庫使用者沒有select許可權,同樣會導致這樣的錯誤。當你發現config.inc.php的設定沒有任何問題,但還是提示這個錯誤,那一定就是這種情況了。
解決:對症下藥
開啟config.inc.php 找到$dbname核實重新設定並儲存
同問題四的解決方案
6、Can’t open file: ‘xxx_forums.MYI’. (errno: 145)
翻譯:不能開啟xxx_forums.MYI
問題分析:
這種情況是不能開啟 cdb_forums.MYI 造成的,引起這種情況可能的原因有:
1、伺服器非順利關機,資料庫所在空間已滿,或一些其它未知的原因,對資料庫表造成了損壞。
2、類 unix 作業系統下直接將資料庫檔案拷貝移動會因為檔案的屬組問題而產生這個錯誤。
解決方案:
1、修複資料表
可以使用下面的兩種方式修複資料表:(第一種方法僅適合外掛式主控件使用者)
1)使用 myisamchk ,MySQL 內建了專門使用者資料表檢查和修複的工具 —— myisamchk 。更改目前的目錄到 MySQL/bin 下面,一般情況下只有在這個下面才能運行 myisamchk 命令。常用的修複命令為:myisamchk -r 資料檔案目錄/資料表名.MYI;
2)通過 phpMyAdmin 修複, phpMyAdmin 帶有修複資料表的功能,進入到某一個表中後,點擊“操作”,在下方的“表維護”中點擊“修複表”即可。
注意:以上兩種修複方式在執行前一定要備份資料庫。
2、修改檔案的屬組(僅適合外掛式主控件使用者)
1)複製資料庫檔案的過程中沒有將資料庫檔案設定為 MySQL 啟動並執行帳號可讀寫(一般適用於 Linux 和 FreeBSD 使用者)。
7、Table ‘test.xxx_sessions’ doesn’t exist
翻譯:xxxxx表不存在
分析:在執行sql語句時沒有找到表,比如:SELECT * FROM xxx_members WHERE uid=’XX’ 這裡如果表xxx_members不存在於$dbname庫裡,那麼就會提示這個錯誤。具體可分為以下三種情況來討論:
安裝外掛程式或者hack時修改了程式檔案,而忘記了對資料庫作相應的升級。
後台使用了不完全備份,匯入資料時沒有匯入到已經安裝了相應版本的論壇的資料庫中。
解決: 同樣對症下藥,不同的原因不同的處理方法。
仔細對照外掛程式作者提供的安裝說明,把遺漏的對資料庫的操作補上,如果仍然不能解決問題,那麼應該懷疑該外掛程式的可用性了。去諮詢一下外掛程式作者,或者將其卸載。
不要張冠李戴,多大的腳就穿多大的鞋。總之使得程式檔案和資料庫配套即可.
8、Unknown column ‘column_name’ in ‘field list’
翻譯:未知的欄位名 column_name
分析:在執行sql語句是出現了指定表中沒有的欄位名稱,就會出現這個錯誤。具體導致的原因可分為以下兩種
安裝外掛程式或者hack時修改了程式檔案,而忘記了對資料庫作相應的升級。
程式檔案和資料庫不配套,比如d2.5的資料庫配置給d4.1的程式來用肯定會出現這個錯誤。
解決: 導致的原因和問題八的1和 3是相同的,所以解決方案也一樣。
9、You have an error in your SQL syntax
翻譯:有一個語法錯誤在你的sql中
分析:論壇標準的程式是沒有sql語法錯誤的。所以造成這個錯誤的原因一般就兩類
安裝外掛程式或擅自修改程式。
不同的資料庫版本資料庫匯出匯入,比如MySQL4.1的資料在匯出的語句包含了MySQL4.0沒有的功能,像字元集的設定,這時如果將這些sql匯入到MySQL4.0的時候就會產生sql語法錯誤。
解決:
仔細檢查看到底是哪裡的錯誤,將其修正,實在不行就用標準程式把出錯的程式替換。
在Database Backup的時候要留意,如果不打算倒入到其他版本的mysql中則不用特殊考慮,反之要特殊的設定。使用DZ4.1的後台資料備份,可以按照提示去設定想要的格式。外掛式主控件的也可以在到處的時候將其匯出為mysql4.0的格式。
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt databse > test.sql
10、Duplicate entry ‘xxx’ for key 1
翻譯:插入 xxx 使索引1重複
分析:索引如果是primary unique這兩兩種,那麼資料表的資料對應的這個欄位就必須保證其每條記錄的唯一性。否則就會產生這個錯誤。
一般發生在對資料庫寫操作的時候,例如Discuz!4.1論壇程式要求所有會員的使用者名稱username必須唯一,即username的索引是 unique,這時如果強行往cdb_members表裡插入一個已有的username的記錄就會發上這個錯誤,或者將一條記錄的username更新 為已有的一個username。
改變表結構的時候也有可能導致這個錯誤。例如 Discuz!4.0論壇的資料庫中cdb_members.username 的索引類型是index這個時候是允許有相同username的記錄存在的,在升級到4.1的時候,因為要將username的索引由原來的index變 為unique。如果這時cdb_members裡存在有相同的username的記錄,那麼就會引發這個錯誤。
匯出資料據時有時會因為一些原因(作者目前還不清楚)導致同一條記錄被重複匯出,那麼這個備份資料在匯入的時候出現這個錯誤是在所難免的了。
修改了auto_increment的值,致使“下一個 Autoindex”為一條已經存在的記錄
解決: 兩種思路,一是破壞掉唯一性的索引。二是把重複的資料記錄幹掉,只保留一條。很顯然第一種思路是不可取的。那麼按照二的思路我們得出以下幾種解決方案,對應上面的i ii iii
略
按照錯誤提示裡的資訊到資料庫中將重複的記錄刪除,僅保留一條即可。之後繼續執行升級操作。
這種情況發生的機率很小,可以用文字編輯器開啟備份文檔,尋找重複的資訊。將其多餘的拿掉,僅保留一條即可。
查詢出表中auto_increment最大的一條記錄,設定auto_incerment比其大一即可。
PS:repaire table “表名“,可以暫時解決問題。
11、 Duplicate key name ‘xxx’
翻譯:索引名重複
分析:要建立的索引已經存在了,就會引發這個錯誤,這個錯誤多發生在升級的時候。可能是已經升級過的,重複升級引起的錯誤。也有可能是之前使用者擅自加的索引,剛好與升級檔案中的所以相同了。
解決: 看看已經存在的索引和要添加的索引是否一樣,一樣的話可以跳過這條sql語句,如果不一樣那麼現刪除已存在的所以,之後再執行。
12、 Duplicate column name ‘xxx’
翻譯:欄位名xxx重複
分析:添加的欄位xxx已經存在,多發生在升級過程中,與問題十二的產生是一樣的。
解決: 看一下已經存在的欄位是否和將要添加的欄位屬性完全相同,如果相同則可以跳過不執行這句sql,如果不一樣則刪除掉這個欄位。之後繼續執行升級程式。
13、 Table ‘xxx’ already exists
翻譯:資料表xxx已經存在
分析:xxx表已經存在於庫中,再次試圖建立這個名字的表就會引發這個錯誤。同樣多發生在論壇的升級中。類似於問題十二。
解決: 看看已經存在的表是否和將要建立的表完全一樣,一樣的話可以跳過不執行這個sql,否則請將存在的表先刪除,之後繼續執行升級檔案。
14、 Can’t create database ‘xxx’. Database exists
翻譯:不能建立資料庫xxx,資料庫已經存在
分析:一個mysql下面的資料庫名稱必須保證唯一性,否則就會有這個錯誤。
解決:把已經存在的資料庫改名或者把將要建立的資料庫改名,總之不讓他們的名稱衝突。
15、 小結(針對問題 11\12\13\14\15)
此類問題錯誤提示中都暗藏一個關鍵詞duplicate(���複)
那麼對於mysql資料庫來說什麼東西是不能重複的呢?
資料庫 database
同一個資料庫下資料表 table
同一個資料表下欄位 column
同一個資料表下索引 key
同一個資料表在索引唯一(UNIQUE PRIMARY)的情況下記錄中的這些欄位不可以重複
16、Unknown system variable ‘NAMES’
翻譯:未知的系統變數NAMES
分析:Mysql版本不支援字元集設定,此時強行設定字元集就會出現這個錯誤。
解決: 將sql語句中的SET NAMES ‘xxx’ 語句去掉
17、 Lost connection to MySQL server during query
翻譯:MySQL伺服器失去串連在查詢期間
分析:遠端連線資料庫是有時會有這個問題。MySQL伺服器在執行一條sql語句的時候失去了串連造成的。
解決: 一般不需要怎麼去處理,如果頻繁的出現那麼考慮改善硬體環境。
18、User ‘red’ has exceeded the ‘max_updates’ resource (current value: 500)
翻譯:msql使用者red已經超過了’max_updates’(最大更新次數),’max_questions’(最大查詢次數),’max_connections’(最大串連數),當前設定為500
分析:在mysql資料庫的下有一個庫為mysql,它其中有一個表為user這裡面的紀錄每一條都對應為一個mysql使用者的授權。其中欄位 max_questions max_updates max_connections分別記錄著最大查詢次數 最大更新數 最大串連數,當目前的任何一個參數大於任何一個設定的值就會產生這個錯誤。
解決: 外掛式主控件使用者可以直接修改授權表。修改完之後重啟mysql或者跟新授權表,進入mysql提示符下執行
FLUSH PRIVILEGES;
記得後面要有分號’;’
虛擬機器主機的使用者如果總是出現這個問題可找空間商協商解決。
19、Too many connections (1040)連結過多
翻譯:達到最大串連數
問題分析:
串連數超過了mysql設定的值,與max_connections 和wait_timeout 都有關係。wait_timeout的值越大,串連的空閑等待就越長,這樣就會造成當前串連數越大
解決方案:
1.虛擬機器主機使用者請聯絡空間商最佳化 MySQL 伺服器的配置;
2.外掛式主控件使用者請聯絡伺服器管理員最佳化 MySQL 伺服器的配置,可參考:
修改 MySQL 設定檔 my.ini 或者 my.cnf 中的參數:
max_connections= 1000
wait_timeout = 10
修改後重啟 MySQL ,如果經常性的報此錯誤,請做一下伺服器的整體最佳化。
更多詳情見請繼續閱讀下一頁的精彩內容: