最近,系統更新出現了問題,比較緊急,需要對三張表進行回檔。由於我們都是采用mysqldump進行每天全備整庫,數據量比較大,一個備份文件大概有70G,需要從這個70G文件中恢復三張表,真是蛋疼至極啊,搞了整整一個下午,下面就介紹下具體操作。
1、采用grep查找:由於mysqldump文件導出的是insert into ...values(),(),()...這種形式,其實多行都是屬於一行文本的。
cat fullbk20151108031001 | grep --ignore-case 'insert into `t_user`' > user.sql
結果:15G大小的文件大概2小時之類能夠搞定,但是對於70G的文件,遲遲沒有結果,干着急啊,於是乎,就想換個命令吧。希望能快點
2、采用sed命令:
sed -n '/INSERT INTO `t_user_pve_ranking`/p' fullbk20151108031001
又等了好久,還是沒有出結果啊,坐不住了,開發開始深深的鄙視我們了,最后,死馬當活馬醫吧,把這個70G大文件切分成多個小文件,然后在小文件中進行sed:
3、采用split切分大文件方法:
split [參數選項] infile [outfile]
split 把輸入的文件拆分為若干體積或長度相等的文件,輸入文件保持不變,只是把結果拆分結果寫到outfileaa、outfileab ... ... 等文件中。如果我們不指定outfile,被拆分后的文件會寫到 xaa、xab ... ...。
常用參數:
-l n 把infile拆分為具有n行的段,默認值為1000
-b n[bkm] 以體積為單位的拆分,約定每拆分后每個文件的大小 ,b代表512B,k代表1KB,m代表1MB。
#按1000行一個文件進行切分,最好在后台運行
split -l 1000 fullbk20151108031001 &
然后在通過sed命令進行一個一個文件查找:
sed -n '/INSERT INTO `t_user_pve_ranking`/p' aaa
sed -n '/INSERT INTO `t_user_pve_ranking`/p' bbb
........
這樣,每個小文件查找很快,這里可以寫個shell腳本,循環遍歷的。
最后通過這種方法找到了表。簡直就是坑爹啊,我不知道還有其他更好的方式了,反正mysqldump備份大庫恢復指定表很慢很慢的,強烈建議使用innobackupex,我測試了也就半個小時就可以搞定了。