今天一來公司,開發人員就對我說mysql無法啟動起來了,一問才知道他對測試服務器上的服務都執行了重啟,當時心裡那個氣啊,想給他124,你說你要重啟服務也要問問我啊,現在整出問題來了,就知道來找我了.氣歸氣,問題還是要解決.先檢查了下服務器的磁盤空間,發現沒有滿,再檢查了下mysql配置,也沒有問題,最後看了下mysql日志,才終於找到問題,如圖
原來是有個表有問題,找到開發問了下,這個表是他才備份的,還不能刪,服務器上的數據是今天最新的,還沒有備份,真是日個狗了,好吧,那只能根據日志裡的提示先修改innodb_force_recovery了.
ps:
innodb_force_recovery影響整個InnoDB存儲引擎的恢復狀況.默認為0,表示當需要恢復時執行所有的恢復操作.當不能進行有效的恢復操作時,mysql有可能無法啟動,並記錄下錯誤日志.innodb_force_recovery可以設置為1-6,大的數字包含前面所有數字的影響.當設置參數值大於0後,可以對表進行select,create,drop操作,但insert,update或者delete這類操作是不允許的.
1(SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁.
2(SRV_FORCE_NO_BACKGROUND):阻止主線程的運行,如主線程需要執行full purge操作,會導致crash.
3(SRV_FORCE_NO_TRX_UNDO):不執行事務回滾操作.
4(SRV_FORCE_NO_IBUF_MERGE):不執行插入緩沖的合並操作.
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存儲引擎會將未提交的事務視為已提交.
6(SRV_FORCE_NO_LOG_REDO):不執行前滾的操作.
操作如下:
在my.cnf中添加了以下兩個參數:
innodb_force_recovery=6
innodb_purge_thread=0
然後重啟mysql
service mysqld restart
重啟好了之後,立即對數據庫做邏輯導出,然後將innodb_force_recovery設置為0,innodb_purge_thread=1,重建數據庫.這樣mysql的問題就解決了,最後把mysql的定時備份也改成早上備一次和晚上備一次了.
問題二,CentOS上不能啟動MySQL的問題解決辦法
1. /etc/my.cnf的默認配置
配置文件的內容如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
由於項目需要需要修改datadir的值,如下
datadir=/usr/local/project/etc/data
在CentOS中啟動MySQL:
[wzhwho@local~]#service mysqld start
Starting mysqld daemon [FAILED]
2. 先看錯誤日志
采用rpm安裝的MySQL日志文件的默認路徑是/var/log/mysqld.log
mysqld started
InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name /usr/local/project/etc/data/ibdata1
InnoDB: File operation call: 'create'.
InnoDB: Cannot continue operation.
mysqld ended
從日志可以知道,mysql的數據文件目錄沒有權限,所以我需要按照/var/lib/mysql目錄的權限給/usr/local/project/etc/data目錄設置權限和屬主。
[wzhwho@local~]#ll /var/lib
drwxr-x-r-x 1 mysql mysql 4 Apr 11 2009 mysql
[wzhwho@local~]#ll /var/lib
[wzhwho@local~]chown -R mysql:mysql /usr/local/project/etc/data
[wzhwho@local~]chmod -R 755 /usr/local/project/etc/data
[wzhwho@local~]#ll /usr/local/project/etc
drwxr-x-r-x 1 mysql mysql 4 Apr 11 2009 data
接著我又啟動了MySQL,但是還是失敗,日志信息還是一樣。
3. 修改配置文件/etc/selinux/config
最後,我在外國友人的郵件來往中查到這樣的回復:
If you are using SE linux, set it to permissive mode by editing /etc/selinux/config
and changing
SELINUX=enforcing to SELINUX=permissive
This solved all of my problems with the
"Operating system error number 13 in a file operation" error
所以,最後確定為selinux的問題,輸入命令ls -Z,你會發現在文件或文件夾上面打的標簽。如果一個文件是在selinux打開的時候創建的,那麼即使你關閉selinux,它的權限控制還是會起作用的。可以通過chcon來改變權限。
4. MySQL成功啟動
[wzhwho@local~]#service mysqld start
Starting mysqld daemon [OK]