MySQL單表恢復(fù)的步驟
正休息的時候一個電話將我的睡意完全打散,“開發(fā)童鞋寫update SQL的時候忘了加where條件了”,相信每一個DBA同學(xué)聽到這個消息的時候都有罵街的沖動吧。萬幸只是單表寫花了,而不是哪位大神在DB里面drop table玩。雖然已經(jīng)很久沒進(jìn)行單表恢復(fù)了,但是還好步驟都印在腦海中,沒有出問題的就恢復(fù)完了。
言歸正傳,記錄一下單表恢復(fù)的步驟和關(guān)鍵點,提醒自己也提醒大家。
第一步:
找一臺性能比較高的服務(wù)器作為還原機,從備份池中將最近的一次備份恢復(fù)到這臺還原機上。當(dāng)然這個前提是你有備份,且備份是可用的。(什么? 你告訴我沒有做備份,那么同學(xué)你可以洗洗睡了,準(zhǔn)備享受自由的空氣吧。)
注意:這個時候不要啟動同步,務(wù)必保持不同步狀態(tài)。
ps:多說一嘴,對于DBA來說,備份是最重要的一個環(huán)節(jié),不但要有,還要定期檢查備份是否是可用的,這是DBA的必要素質(zhì)之一。
第二步:
聯(lián)系那個犯錯的開發(fā)同學(xué)要錯誤的SQL語句和時間點,然后從主庫的binlog中找到這條SQL的執(zhí)行點。具體操作舉例如下
### 使用mysqlbinlog將二進(jìn)制日志轉(zhuǎn)化為明文SQL日志mysqlbinlog mysql-bin.000123 > /data1/000123.sql### 使用linux的grep命令根據(jù)“key word”找到那個引發(fā)數(shù)據(jù)寫花的SQL所在的位置cat 000123.sql |grep -C 10 ’key word’ --color### 標(biāo)紅色的是問題SQL,及這條SQL開始的時間點,及下一條SQL的開始時間點,這2個pos位置非常重要# at 20393709#131205 20:55:08 server id 18984603 end_log_pos 20393779 Query thread_id=16296016 exec_time=0 error_code=0SET TIMESTAMP=1386248108/*!*/;BEGIN/*!*/;# at 20393779#131205 20:55:08 server id 18984603 end_log_pos 20394211 Query thread_id=16296016 exec_time=0 error_code=0SET TIMESTAMP=1386248108/*!*/;update table tablename set names=’xxxx’;# at 20394211#131205 20:55:08 server id 18984603 end_log_pos 20394238 Xid = 92465981COMMIT/*!*/;# at 20394238#131205 20:55:10 server id 18984603 end_log_pos 20394308 Query thread_id=16296017 exec_time=0 error_code=0SET TIMESTAMP=1386248110/*!*/;BEGIN
第三步:
根據(jù)第二步得到的pos位置,啟動同步關(guān)系,但是需要停止到問題SQL之前的pos位置上,具體使用如下命令
### pos位置等于問題SQL begin的pos位置slave start until master_log_file=’mysql-bin.000123’,master_log_pos=20393709;
然后跳過這個問題SQL,將同步change到下一個pos位置上,具體使用如下命令
### pos位置等于問題SQL commit之后的pos位置change master to master_log_file=’mysql-bin.000123’,master_log_pos=20394238;
從上面兩條命令我們看出,第二步得到的兩個pos位置很關(guān)鍵。
第四步:
在主庫上將寫花的表改名,其目的有二個,其一,停止對這個表的寫入(當(dāng)然這對業(yè)務(wù)會有一定的影響,會出現(xiàn)一段時間內(nèi)的寫入失敗報警,需要提前和業(yè)務(wù)部門聯(lián)系好),其二,一旦恢復(fù)失敗,至少還有一個寫花的表存在,可以很快的恢復(fù)成我們恢復(fù)操作之前的狀態(tài)。
### 在主庫上執(zhí)行rename table tablename to tablename_bak;
然后在還原機上執(zhí)行dump操作,執(zhí)行這個操作的使用需要注意,如果表中有中文字符,一定記得需要添加--default-chararter-set參數(shù)
mysqldump -uusername -ppassword -S/tmp/mysql.sock dbname tablename --opt> tablename.sql
最后將這個文件傳輸?shù)街鲙旆?wù)器上,完成最后的恢復(fù)操作
### 可以選擇登陸mysql之后source tablename.sql;### 也可以在cmd界面mysql -uusername -ppassword -S/tmp/mysql.sock < tablename.sql
當(dāng)然也可以不這么麻煩,直接執(zhí)行如下命令,但是個人習(xí)慣處于保存歷史操作記錄和中間結(jié)果的需要,我都是按照以上步驟完成,這樣可以保存一個隨時可以恢復(fù)的文本文件,心理更踏實一點。
### 快速的方法可以按照如下操作,在還原機上的命令mysql -uusername -ppassword -S /tmp/mysql.sock dbname tablename | mysql -uusername -ppassowrd -hhost -Pport
通過以上命令就可以直接完成dump并導(dǎo)入的操作了,缺點就是不會有一份備份文件生成。
第五步:
基本DBA的事情就沒有了,這時候就需要告訴開發(fā)同學(xué)恢復(fù)完畢,進(jìn)行應(yīng)用測試及數(shù)據(jù)正確性效驗了。如果一切都沒有問題之后,我們需要將剛才rename的表drop掉,整個恢復(fù)操作就算大功告成了。
drop table if exists tablename_bak;
數(shù)據(jù)庫恢復(fù)是每個DBA必備的技能,需要熟練掌握,希望度過這篇文章的同學(xué)們都可以輕車熟路的進(jìn)行恢復(fù)操作。
ps:這個操作,最好一萬年都不要用一次就最好了。
以上就是MySQL單表恢復(fù)的步驟的詳細(xì)內(nèi)容,更多關(guān)于mysql單表恢復(fù)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. DB2的高可用性和災(zāi)難恢復(fù)概述2. Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例3. 如何用mysqldump進(jìn)行全量和時間點備份4. 詳解MySQL InnoDB存儲引擎的內(nèi)存管理5. sql server 災(zāi)難恢復(fù)6. MSSQL跨服務(wù)器連接的幾種方法7. MySQL/MariaDB 如何實現(xiàn)數(shù)據(jù)透視表的示例代碼8. 通過幾個步驟有效關(guān)閉Oracle死鎖進(jìn)程9. 淺談SELECT?*會導(dǎo)致查詢效率低的原因10. 如何在SQL Server 2005中為安裝程序增加計數(shù)器注冊表項值
