阿裡雲服務器上裝有MySQL 5.6,這幾天MySQL服務經常死掉,啟動MySQL服務(service mysql start),卻報如下錯誤
Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).
簡單的去搜索一下關於此錯誤的解決方法,找到一個說刪除InnoDB表的日志文件即可,於是就嘗試了一下(刪除操作首先別忘了備份)
不知道mysql數據存放位置的可以這樣子查看,找到my.cnf,裡面的datadir=/var/lib/mysql既是了
cat /etc/my.cnf 找到mysql數據存放位置
來到這裡面有三個文件ibdata1,ib_logfile0,ib_logfile1
其中ibdata1是InnoDB表的共享表空間,切忌不可以刪除這個文件,部分InnoDB表的數據就在裡面呢
ib_logfile0,ib_logfile1,這兩個文件不同配置下名字會不同,是InnoDB表的日志文件(別忘記了InnoDB表示事務安全的,當數據庫奔潰時,重啟數據庫服務,會根據這些日志文件重做一些事務)
刪除了這兩個日志文件,然後啟動mysql(service mysql start)這次啟動成功了!
--------------------------------------------------------------------------------------------------------
可是過了不久,真的不久,才十幾分鐘,數據庫又掛了,啟動數據庫(service mysql start),又報下面這個錯誤
Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).
然後再次刪除日志文件,再啟動,可以了,再過了不久……又掛了,所以明白,問題不出於這裡
這些問題,每個人出錯的都不一樣,網上別人的出錯原因也許和你不一樣呢,要不人家可以解決,你怎麼就不可以解決,故去查看msyql錯誤記錄文件自己瞧個明白
msyql錯誤記錄文件不知道在哪裡,可以這樣子來找:同樣查看my.cnf文件,其中mysqld-safe下的log-error就是mysql錯誤日志
[mysqld_safe]
log-error=/var/log/mysqld.log
打開它看看,發現一堆錯誤,用這個命令簡單看一下出錯重點
cat /var/log/mysqld.log | grep 'ERROR' | less
發現了服務啟動時,為何會跑錯了
2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace em/temp uses space ID: 2 at filepath: .\em\temp.ibd. Cannot open tablespace mysql/innodb_index_stats which uses space ID: 2 at filepath: .\mysql\innodb_index_stats.ibd
打開表空間出錯!!出這個錯的原因是以前有次操作把ibdata1給刪除掉了!(ibdata1文件剛才說了,共享表空間!!刪除掉了後mysql雖然會重新生成,但是已經損壞了所有的InnoDB數據庫了。ps:為什麼會刪除掉這個文件,我也不知道是什麼時候刪除了,是通過history看到的)
找到原因了,但是ibdata1這個文件沒有備份,恢復不了,還在我這個服務上的數據庫都是測試數據,可以drop掉重新導入以前備份的版本,故drop掉損壞的數據庫,在mysql命令中是drop不掉的,只能在文件系統裡直接刪除其文件(第一步已經知道了數據存儲位置了,直接刪(ps記得先備份))
然後再重建了數據庫,導入數據,重啟mysql,正常啟動,過了一天還沒有掛掉!修復成功!第二天再去看一下mysql錯誤日志,又有了新發現
--------------------------------------------------------------------------------------------------------------
tail -n 200 /var/log/mysqld.log
文件裡都在報這樣的錯誤
Error: Table "mysql"."innodb_table_stats" not found.
2013-04-02 09:07:35 7fc53f5e4700 InnoDB: Recalculation of persistent statistics requested for table "mydatabase"."mytable" but the required persistent statistics storage is not present or is corrupted. Using transient stats instead.
但是目前有沒察覺到對項目和數據庫使用的明顯影響,但是還要解決的,這篇博客說的很明白,果斷推薦
http://hi.baidu.com/life_to_you/item/d35894c0058a993098b498ee
最後,都沒發現什麼問題了。MySQL遇到什麼問題,第一下還是看下mysql的錯誤日志比較好,裡面記錄的一清二楚,逐個排除就好啦