Mysql isam數據庫恢復實戰

情況:

一臺服務器,mysql 的數庫裏面跑了很多網站的數據,其中一個myisam引擎的gbk編碼數據庫,誤刪了一張表。最近的完整備份只有一個月前的,要保證當前各數據庫正常運轉情況下對那張表恢復,由於服務器託管在機房,也不可能將相關文件導入其它服務器恢復。

方案:

1.在數據庫中新建一新的空白數據庫loupanbbs,導入之前備份的數據庫;不知道那邊那位朋友是不是沒有聽懂我意思,結果數據是與現在跑的loupanjiaju一樣,我們要恢復的表bbs_posts存在,爲7.23日當天備份時的數據,但其它表已經是最新的8.23號的數據了。不管那麼多了,現在只有將binlog完全恢復,再單獨導出那張需要的表即可

2. 恢復時發現mysqlbinlog導出時只能指定數據庫,不能指定到具體的某個表;在得到的mysql語句裏有些語句指定了插入到原來的loupanjiaju數據庫中,需要全部改成將要導入的測試數據庫名

具體操作;

1.       使用mysqlbinlog命令,確定恢復的起始點,和結束點。

Mysqlbinlog –start-datetime=”2011-07-23 04:50:00” –d loupanjiaju mysql-bin.000245 | sed ‘s/loupanjiaju/loupanbbs/g’ > /tmp/restore/mysql-bin.000245

Mysqlbinlog –stop-position=” 862820986” –d loupanjiaju mysql-bin.000346 | sed ‘s/loupanjiaju/loupanbbs/g’> /tmp/restore/mysql-bin.000346

這樣得到了開頭,和結尾兩個binlog的sql語句。中間的binlog使用腳本完成

2.       創建如下腳本,與mysql-bin.log放在同一目錄內

#!/bin/sh

for i in $(cat binlog.index)

do

mysqlbinlog -d loupanjiaju $i | sed 's/loupanjiaju/loupanbbs/g' > /tmp/restore/$i

done

binlog.index爲你要恢復的binlog文件名稱,可用如下命令得到

ls –l mysql-bin.000* | awk ‘{print $9}’ > binlog.index 再手工去掉多餘的即可,注意要保證順序,因爲恢復時數據插入順序不對可能會產生很大問題。

3.       恢復,創建如下腳本,在/tmp/restore目錄內

#!/bin/sh

for i in $(cat binlog.index)

do

echo “now process $i” >> /var/log/binlog.log

#       mysqlbinlog -d loupanjiaju $i | sed 's/loupanjiaju/loupanbbs/g' > /tmp/restore/$i

cat $i | mysql -f -u restore --password=taoxin loupanbbs 2>/dev/null

done

這樣,將此腳本放在後臺運行,防止連線中斷造成恢復前功盡棄。。保存爲binlog.sh

nohup  ./binlog.sh &

4.       連接數據庫的用戶只給你要操作的數據庫權限,防止binlog中語句出錯時可能對其它數據庫造成傷害;實際運行時先測試跑一個日記,看有沒有問題,再運行腳本。實際在運行時就有報字符集不同問題,數據庫用的是gbk,但我的終端連接用的是lanting1,這裏只要讓他們保持一樣即可。可以修改數據庫配置文件,或者指定連接使用字符集。。

Vi /etc/my.cnf 在[mysql] 增加: default_character_set = gbk 就可以了。其它數據重複這類問題,我加了參數-f 全部忽略直接運行了。

5.       進入數據庫,查看恢復數據

Mysql> select count(*) from bbs_posts;

或者看日記 tail /var/log/binlog.log 看當前在跑哪一個日記。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章