簡單的數據庫恢復

問題:由於程序員的不小心,在更新操作的時候忘記加limit導致一個70多W條記錄的表的幾個字段全部更新
約定:被更新的表名爲a,所在的數據庫爲A;新建的數據庫爲B,其中和A中a同名的表爲b,(A、B和a、b其實在2個mysql中名字是一樣的,我這樣只是爲了區分)把出事的時間點定爲time
說明:有A數據庫2天前的一個備份,並且A所在的服務器記錄了A的binlog
 
解決流程:
1、新建一個mysql,開啓新的端口,並把這個mysql做爲A所在mysql的一個slave;新建數據庫B,導入備份中的數據
 
2、利用程序把B中b表的內容全部更新到A中a表,並記錄最後一個更新的id(endid)。到這裏還只是恢復了2天前的數據,還有一部分數據沒有恢復
 
3、把B中的b表單獨做個cp備份
 
4、開啓B數據庫同A數據庫的同步,特別注意:只同步到time之前這個時間點(這個可以使用start slave until master_log_file='*' ,master_log_pos=*;語句)

5、用程序把從endid到出事時a中的那個id的之間的b表數據同步到a中
 
在整個過程中出現的問題和沒有注意的地方:
1、由於在做備份的時候使用的是--master-data=2,在同步的時候出現從第一個binlog同步的時候,而這時候沒有去使用CHANGE MASTER TO MASTER_LOG_FILE='*, MASTER_LOG_POS=*;,而是用把binlog中的sql導出再導入數據庫,導致數據出錯

2、在同步的時候應該只同步a這張表(replicate-do-table=A.a)

3、沒有考慮硬件的影響(由於這臺服務器上跑了好幾個mysql,應先關閉其他端口的mysql,這樣同步起來會更快)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章