要使用mysqlbinlog 恢復數據首先必須啓用過binglog
/etc/my.cnf
log-bin=mysql-bin
當然不是等到數據損壞的時候再啓用binglog,那時候已經爲時已晚!
mysqlbinlog恢復命令:
/mysql/bin/mysqlbinlog --database=bbs --start-date="2013-01-22 05:00:00" --stop-date="2013-01-22 09:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f
註釋:
--database=bbs // 需要恢復的數據庫
--start-date="2013-01-22 05:00:00" // 恢復數據起始時間
--stop-date="2013-01-22 09:00:00" // 恢復數據截至時間
/mysql/data/mysql-bin.000001 // 引用的日誌文件,多個日誌就多增加幾條
/mysql/bin/mysql -u root -p123456 // 登錄Mysql帳號密碼
-f // 忽略錯誤,否則遇到相同條目恢復就會終止
需要注意的問題:
mysqlbinlog命令只能恢復binglog日誌裏有的數據
一般我們都使用expire-logs-days來限制日誌保存的天數,以防止日誌文件不斷增大撐爆硬盤。
假設 expire-logs-days = 7
那麼7天之前的數據如果被誤刪除將無法通過此命令恢復,比如discuz論壇,你要是誤刪除了某個版塊,而這個版塊創建已經有半年,顯然版塊以及版塊內的所有帖子,無法使用近期的binglog日誌恢復。
遇到這種情況,要想恢復數據,必須配合每天定時備份的數據來進行
假設數據是每天早上5點定時打包備份,早上9點誤刪了某個版塊
首先恢復打包備份的數據
service mysql stop
cd /mysql/data
tar zxvf /mysql/dbbackup/bbs20130122.tar.gz
service mysql start
/mysql/bin/mysqlbinlog --database=bbs --start-date="2013-01-22 5:00:00" --stop-date="2013-01-22 9:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f
恢復的時候最好是斷開網站與數據庫的連接
假如9點以後有產生的數據,再取個9點後的時間段恢復下應該沒問題
用一個從數據庫做上述恢復測試,使用測試論壇連接該數據庫,去測試論壇後臺刪了個版塊,沒料到把正在使用的該版塊附件都給刪除了,明明去後臺修改了遠程附件連接地址,幸虧,附件我也有備份,所以說,數據備份多麼重要!
假設幾種需要恢復數據的狀況出現:
1.誤刪數據,這些數據在日誌能夠恢復的期限內創建,直接使用命令就行了
2.誤刪的數據不包含在日誌內,使用日誌配合定期打包的數據按上述方法恢復
3.系統因種種原因被破壞,比如******、硬盤損壞等等情況,日誌也沒了,以防萬一,我們只要事先做好主從同步,只需要把數據庫切換到從庫上就解決了
4.從庫也同時被***搗毀了,我們還有定時備份到網盤的數據,損失幾個小時的數據吧
5.網盤也被******癱瘓了,不怕,數據已經由網盤實時同步到本地硬盤,揣上移動硬盤奔機房去吧