MySQL資料庫常見錯誤及解決方案

lhrbest發表於2017-03-08

MySQL資料庫常見錯誤及解決方案


1

MySQL無法重啟問題解決Warning: World-writable config file ‘/etc/my.cnf’ is ignored

原因

今天幫朋友維護伺服器,在關閉資料庫的命令發現mysql關不了,提示Warning: World-writable config file '/etc/my.cnf' is ignored ,大概意思是許可權全域性可寫,任何一個使用者都可以寫。mysql擔心這種檔案被其他使用者惡意修改,所以忽略掉這個配置檔案。這樣mysql無法關閉。

1

2

3
4
[root@ttlsa ~]# service mysqld stop
Warning: World-writable config file '/etc/my.cnf' is ignored
Warning: World-writable config file '/etc/my.cnf' is ignored
MySQL manager or server PID file could not be found![FAILED]


檢視my.cnf的許可權

1
2
[root@ttlsa ~]# ls -l /etc/my.cnf
-rwxrwxrwx 1 root root 4878 Jul 30 11:31 /etc/my.cnf


許可權777,任何一個使用者都可以改my.cnf,存在很大的安全隱患.


解決方案:

修復MySQL問題

1 [root@ttlsa ~]# chmod 644 /etc/my.cnf


my.cnf設定為使用者可讀寫,其他使用者不可寫.



2

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當前的程式。



3

Unknown MySQL Server Host 'localhosadst' (11001)

原因

未知的MySQL伺服器 localhosadst,伺服器 localhosasdst 不存在。或者根本無法連線。


解決方案:

仔細檢查自己論壇下面的 ./config.inc.php 找到$dbhost重新設定為正確的mysql 伺服器地址。




4

Access denied for user: 'roota@localhost' (Using password: YES)

原因

使用者 roota 訪問 localhost 被拒絕(沒有允許通過),造成這個錯誤一般資料庫使用者名稱和密碼相對mysql伺服器不正確


解決方案:

仔細檢查自己論壇下面的 ./config.inc.php 找到$dbuser、$dbpw核實後重新設定儲存即可。



5

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伺服器才能使更新生效



6

No Database Selected

原因

產生的原因有兩種。


config.inc.php 裡面$dbname設定的不對。致使資料庫根本不存在,所以在 $db->select_db($dbname); 時返回了false


和上面問題四是一樣的,資料庫使用者沒有select許可權,同樣會導致這樣的錯誤。當你發現config.inc.php的設定沒有任何問題,但還是提示這個錯誤,那一定就是這種情況了。


解決方案:

對症下藥

開啟config.inc.php 找到$dbname核實重新配置並儲存

同問題四的解決方法



7

Can't open file: 'xxx_forums.MYI'. (errno: 145)

原因

這種情況是不能開啟 cdb_forums.MYI 造成的,引起這種情況可能的原因有:


1、伺服器非正常關機,資料庫所在空間已滿,或一些其它未知的原因,對資料庫表造成了損壞。


2、類 unix 作業系統下直接將資料庫檔案拷貝移動會因為檔案的屬組問題而產生這個錯誤。


解決方案:

1、修復資料表

可以使用下面的兩種方式修復資料表:(第一種方法僅適合獨立主機使用者)


1)使用 myisamchk ,MySQL 自帶了專門使用者資料表檢查和修復的工具 —— myisamchk 。更改當前目錄到 MySQL/bin 下面,一般情況下只有在這個下面才能執行 myisamchk 命令。常用的修復命令為:myisamchk -r 資料檔案目錄/資料表名.MYI;


2)通過 phpMyAdmin 修復, phpMyAdmin 帶有修復資料表的功能,進入到某一個表中後,點選“操作”,在下方的“表維護”中點選“修復表”即可。


注意:以上兩種修復方式在執行前一定要備份資料庫。


2、修改檔案的屬組(僅適合獨立主機使用者)

複製資料庫檔案的過程中沒有將資料庫檔案設定為 MySQL 執行的帳號可讀寫(一般適用於 Linux 和 FreeBSD 使用者)。



8

Table 'test.xxx_sessions' doesn't exist

翻譯:xxxxx表不存在

原因

在執行sql語句時沒有找到表,比如:SELECT * FROM xxx_members WHERE uid=’XX’ 這裡如果表xxx_members不存在於$dbname庫裡,那麼就會提示這個錯誤。具體可分為以下三種情況來討論:


安裝外掛或者hack時修改了程式檔案,而忘記了對資料庫作相應的升級。


後臺使用了不完全備份,匯入資料時沒有匯入到已經安裝了相應版本的論壇的資料庫中。


解決方案:

同樣對症下藥,不同的原因不同的處理方法。


仔細對照外掛作者提供的安裝說明,把遺漏的對資料庫的操作補上,如果仍然不能解決問題,那麼應該懷疑該外掛的可用性了。去諮詢一下外掛作者,或者將其解除安裝。


不要張冠李戴,多大的腳就穿多大的鞋。總之使得程式檔案和資料庫配套即可.



9

Unknown column 'column_name' in 'field list'

原因

在執行sql語句是出現了指定表中沒有的欄位名稱,就會出現這個錯誤。具體導致的原因可分為以下兩種安裝外掛或者hack時修改了程式檔案,而忘記了對資料庫作相應的升級。


程式檔案和資料庫不配套,比如d2.5的資料庫配置給d4.1的程式來用肯定會出現這個錯誤。


解決方案:

 導致的原因和問題八的1和 3是相同的,所以解決方法也一樣。



10

You have an error in your SQL syntax

原因

論壇標準的程式是沒有sql語法錯誤的。所以造成這個錯誤的原因一般就兩類:安裝外掛或擅自修改程式。


不同的資料庫版本資料庫匯出匯入,比如MySQL4.1的資料在匯出的語句包含了MySQL4.0沒有的功能,像字符集的設定,這時如果將這些sql匯入到MySQL4.0的時候就會產生sql語法錯誤。


解決方案:

仔細檢檢視到底是哪裡的錯誤,將其修正,實在不行就用標準程式把出錯的程式替換。


在資料庫備份的時候要留意,如果不打算倒入到其他版本的mysql中則不用特殊考慮,反之要特殊的設定。使用DZ4.1的後臺資料備份,可以按照提示去設定想要的格式。獨立主機的也可以在到處的時候將其匯出為mysql4.0的格式。


mysqldump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > test.sql



11

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 "表名“,可以暫時解決問題。



12

Duplicate key name 'xxx'

翻譯:索引名重複

原因

要建立的索引已經存在了,就會引發這個錯誤,這個錯誤多發生在升級的時候。可能是已經升級過的,重複升級引起的錯誤。也有可能是之前使用者擅自加的索引,剛好與升級檔案中的所以相同了。


解決方案:

 看看已經存在的索引和要新增的索引是否一樣,一樣的話可以跳過這條sql語句,如果不一樣那麼現刪除已存在的所以,之後再執行。



13

Duplicate column name 'xxx'

翻譯:欄位名xxx重複

原因

新增的欄位xxx已經存在,多發生在升級過程中,與問題十二的產生是一樣的。


解決方案:

看一下已經存在的欄位是否和將要新增的欄位屬性完全相同,如果相同則可以跳過不執行這句sql,如果不一樣則刪除掉這個欄位。之後繼續執行升級程式。



14

Table 'xxx' already exists

翻譯:資料表xxx已經存在

原因

xxx表已經存在於庫中,再次試圖建立這個名字的表就會引發這個錯誤。同樣多發生在論壇的升級中。類似於問題十二。


解決方案:

看看已經存在的表是否和將要建立的表完全一樣,一樣的話可以跳過不執行這個sql,否則請將存在的表先刪除,之後繼續執行升級檔案。



15

Can't create database 'xxx'. Database exists

不能建立資料庫xxx,資料庫已經存在

原因

一個mysql下面的資料庫名稱必須保證唯一性,否則就會有這個錯誤。


解決方案:

把已經存在的資料庫改名或者把將要建立的資料庫改名,總之不讓他們的名稱衝突。



16

 小結(針對問題 11\12\13\14\15)

此類問題錯誤提示中都暗藏一個關鍵詞duplicate(重複)


那麼對於mysql資料庫來說什麼東西是不能重複的呢?


資料庫 database

同一個資料庫下資料表 table

同一個資料表下欄位 column

同一個資料表下索引 key

同一個資料表在索引唯一(UNIQUE PRIMARY)的情況下記錄中的這些欄位不可以重複



17

Unknown system variable 'NAMES'

翻譯:未知的系統變數NAMES

原因

Mysql版本不支援字符集設定,此時強行設定字符集就會出現這個錯誤。


解決方案:

 將sql語句中的SET NAMES ‘xxx’ 語句去掉



18

Lost connection to MySQL server during query

翻譯:MySQL伺服器失去連線在查詢期間

原因

遠端連線資料庫是有時會有這個問題。MySQL伺服器在執行一條sql語句的時候失去了連線造成的。


解決方案:

一般不需要怎麼去處理,如果頻繁的出現那麼考慮改善硬體環境。



19

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;


記得後面要有分號’;’


虛擬主機的使用者如果總是出現這個問題可找空間商協商解決。



20

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 ,如果經常性的報此錯誤,請做一下伺服器的整體優化。




21

There is no such grant defined for user '%s' on host '%s'

錯誤編號:1141

原因

MySQL 當前使用者無權訪問資料庫。


解決方案:

1、虛擬主機使用者請聯絡空間商,確認給你提供的帳號是否有授權資料庫的許可權。

2、獨立主機使用者請聯絡伺服器管理員,確認給您提供的資料庫帳號是否有管理此資料庫的許可權。



22

Error on rename of '%s' to '%s' (errno: %d)

error.:1025

原因

請檢查一下您的程式是否有修改資料庫表名的語句。


解決方案:

1.請檢查您的程式中哪些地方需要修改資料庫表名;

2.如果您的實際應用確實需要修改到資料庫表名的話,請聯絡空間商或者伺服器管理員給您開放修改庫名的許可權和伺服器本身是否正常。



23

Error reading file '%s' (errno: %d)

error.:1023

原因

資料庫檔案不能被讀取。


解決方案:

1.虛擬主機使用者請聯絡空間商檢視資料庫是否完好。

2.獨立主機使用者請聯絡伺服器管理員檢查一下 MySQL 本身是否正常, MySQL 是否可以讀取檔案,Linux 使用者可以檢查一下 MySQL 的資料庫檔案的屬主是否正確以及本身的檔案是否損壞。



24

Host '*****' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

error.:1129

原因

資料庫出現異常,請重啟資料庫。


解決方案:

由於存在很多連線錯誤,主機'****'被遮蔽,虛擬主機使用者請聯絡空間商處理,獨立主機使用者請聯絡伺服器管理員,在 MySQL 的命令控制檯下執行'mysqladmin flush-hosts'解除遮蔽即可,或者重啟 MySQL 資料庫。



25

dropping database (can't delete '%s', errno: %d)

error.:1009

原因

不能刪除資料庫檔案,導致刪除資料庫失敗。


解決方案:

1.檢查您使用的資料庫管理帳號是否有許可權刪除資料。

2.檢查資料庫是否存在。



26

Got error 28 from table handler

error.:1030

原因

資料庫所在磁碟空間已滿。


解決方案:

1.虛擬主機使用者請聯絡空間商增加 MySQL 所在的磁碟空間或者清理一些無用檔案;


2.獨立主機使用者請聯絡伺服器管理員增加 MySQL 所在的磁碟空間或者清理一些無用檔案



27

Can't create a new thread; if you are not out of available memory, you can consult the manual for a possible OS-dependent bug。

error.:11/35

原因

資料庫伺服器問題,資料庫操作無法建立新執行緒。一般是兩個原因

1.伺服器系統記憶體溢位。

2.環境軟體損壞或系統損壞。


解決方案:

1.虛擬主機使用者請聯絡下空間商資料庫伺服器的記憶體和系統是否正常。


2.獨立主機使用者請聯絡伺服器管理員檢查伺服器的記憶體和系統是否正常,如果伺服器記憶體緊張,請檢查一下哪些程式消耗了伺服器的記憶體,同時考慮是否增加伺服器的記憶體來提高整個的負載能力。



28

Error: Client does not support authentication protocol requested by server; consider upgrading MySQL client

error.:1251

原因

如果你升級 MySQL 到 4.1 以上版本後遇到以上問題,請先確定你的 MySQL Client 是 4.1 或者更高版本( Windows 下有問題你就直接跳到下面看解決方法了,因為 MySQL 在 Windows 是 client 和 server 一起裝上了的)。


解決方案:

1. Windows 平臺

主要是改變連線 MySQL 的帳戶的加密方式,MySQL 4.1/5.0 是通過 PASSWORD 這種方式加密的。可以通過以下兩種方法得到解決:

1) mysql->SET PASSWORD FOR 'some_user'@'some_host'=OLD_PASSWORD('new_password');


2) mysql->UPDATE mysql.user SET Password=OLD_PASSWORD('new_password') WHERE Host='some_host' AND User='some_user';


2. Linux/Unix 平臺

Linux 平臺下首先確定是否安裝過 MySQL 的客戶端,這個用 rpm 安裝很簡單,Linux 程式碼為:

rpm -ivh MySQL-client-4.1.15-0.i386.rpm


然後在編譯 php 的時候要加上:

--with-mysql=/your/path/to/mysql


一般情況下都可以解決。如果還出現這種錯誤,可以按照下面的方法來做:

mysql->SET PASSWORD FOR 'some_user'@'some_host'=OLD_PASSWORD('new_password');


mysql->UPDATE mysql.user SET Password=OLD_PASSWORD('new_password') WHERE Host='some_host' AND User='some_user';



29

Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

error.:2002

原因

出現這個錯誤一般情況下是因為下面兩個原因

1.MySQL 伺服器沒有開啟。

2.MySQL 伺服器開啟了,但不能找到 socket 檔案。


解決方案:

1.虛擬主機使用者,請聯絡空間商確認資料庫是否正常啟動。


2.獨立主機使用者,請檢查一下 MySQL 服務是否已經開啟,沒有開啟,請啟動 MySQL 服務;如果已經開啟,並且是 Linux 系統,請檢查一下 MySQL 的 socket 的路徑,然後開啟 config.inc.php 找到

$dbhost = 'localhost'; 在 hostname 後面加冒號‘:’和 MySQL 的 socket 的路徑。


比如 MySQL 伺服器為 localhost

MySQL 的 socket 的路徑為 /tmp/mysql.sock

那麼就改成如下:

$dbhost = 'localhost:/temp/mysql.sock';



30

Can't connect to MySQL server on 'localhost'

error.:2003

原因

MySQL 服務沒有啟動,一般是在異常的情況下 MySQL 無法啟動導致的,比如無可用的磁碟空間,my.ini 裡 MySQL 的 basedir 路徑設定錯誤等。


解決方案:

1.檢查磁碟空間是否還有剩餘可用空間,儘量保持有足夠的磁碟空間可用。

2.檢查 my.ini 裡的 basedir 等引數設定是否正確,然後重新啟動下 MySQL 服務。



31

Lost connection to MySQL server during query

error.:2013

原因

資料庫查詢過程中丟失了與 MySQL 伺服器的連線。


解決方案:

1.請確認您的程式中是否有效率很低的程式,比如某些外掛,可以解除安裝掉外掛,檢查一下伺服器是否正常;

2.伺服器本身資源緊張,虛擬主機使用者請聯絡空間商確認,獨立主機使用者請聯絡伺服器管理員,檢查一下伺服器是否正常。



32

Got a packet bigger than \'max_allowed_packet\' bytes

錯誤編號:1153

原因

調整了 Mantis 的上傳附件的大小卻沒有調整 MySQL 的配置檔案。


解決方案:

1、獨立主機使用者請按照以下方法調整:

查詢 MySQL 的配置檔案(my.cnf 或者 my.ini)

在 [mysqld] 部分新增一句(如果存在,調整其值就可以):

max_allowed_packet=10M

重啟 MySQL 服務就可以了。這裡設定的是 10MB。


2、虛擬主機使用者請聯絡空間商調整此引數。










About Me

...............................................................................................................................

本文轉載自微信公眾號:開源中國(http://mp.weixin.qq.com/s?__biz=MjM5NzM0MjcyMQ==&mid=2650070340&idx=2&sn=9a1a5a05e6f2311b9855151f6778287a&chksm=bedb062a89ac8f3cac5859cccc301337cc5fc44ff70f5f70264a93b10a3910e7c4a1770dae56&mpshare=1&scene=23&srcid=0307zty0XOJRNjcTpk5rwKIK#rd)

小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● QQ群:230161599     微信群:私聊

聯絡我請加QQ好友(642808185),註明新增緣由

文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

 MySQL資料庫常見錯誤及解決方案  DBA筆試面試講解

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2134960/,如需轉載,請註明出處,否則將追究法律責任。

相關文章