1. 程式人生 > >MySQL 基於時間點與位置恢復

MySQL 基於時間點與位置恢復

開始 mark 文本 zhang map bin 完全 slave -o

基於時間點與位置恢復

利用二進制日誌可以實現基於時間與位置的恢復,例如由於誤操作刪除了一張表,這時候完全恢復是沒用的,因為日誌裏面還是存在錯誤語句,我們需要的是恢復到誤操作之前的狀態,然後跳過誤操作數據,再恢復後面操作語句
假定需要往裏數據庫中插入兩條數據,但由於誤操作,兩條插入語句中間刪除了條數據,而這條數據不應該刪除的。

create database cai; //創建新數據了 
創建表 ,並且寫入兩行化
開啟二進制日誌
完全備份一次
mysqladmin -u root -p flush-log  //生成日誌文件,此內容為添加的zhangsan,lisi的信息
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 > /opt/info.txt  //將二進制文件解密後生成生一個新的文本文件.txt

技術分享圖片

當覺得操作有風險的時候可以考錄是用基於時間點恢復日誌 當然還是要開啟二進制日誌

技術分享圖片

解密後生成的文本
mysqlbinlog --no-defaults --bases64-output=decode-rows -v mysql-bin.000002 >/opt/info.txt   //把解密後二進制文件重新生成一個文本文檔
vim /opt/infon.txt  //查看裏面需要的參數
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
........./////省略  
時間點 操作了對info表進行了添加
# at 341  //標記號 也可以居位置標記號恢復 也可也基於時間點恢復
180707 12:05:31 server id 1  end_log_pos 391 CRC32 0x7a99109e  Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `cai`.`info`
### SET
###   @1=‘xiaokeai01‘
###   @2=88.00
# at 391
#180707 12:05:31 server id 1  end_log_pos 422 CRC32 0x8be308f6  Xid = 35
錯誤標記號 時間點
# at 609
#180707 12:06:12 server id 1  end_log_pos 657 CRC32 0xe5821dc6  Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `cai`.`info`
### WHERE
###   @1=‘zhangsan‘
###   @2=88.00
# at 657
正確操作 標記號 時間點
# at 875
#180707 12:06:16 server id 1  end_log_pos 925 CRC32 0x60ef5b40  Write_rows: table id 108 flags: STMT_END_F
### INSERT INTO `cai`.`info`
### SET
###   @1=‘xiaokeai02‘
###   @2=88.00
# at 925

基於時間點進行恢復

mysqlbinlog --no-defaults --stop-datetime=‘2018-07-07 12:06:12‘ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //基於時間恢復 從開頭到指定的時間停止 之前的都會執行操作
mysqlbinlog --no-defaults --start-datetime=‘2018-07-07 12:06:16‘ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //基於正確的時間恢復 從指定的時間點到結尾都會執行操作

技術分享圖片
技術分享圖片

基於行號恢復
mysqlbinlog --no-defaults --stop-position=‘558‘ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //錯誤操作 從開頭的內容一直碰到 指定的錯誤行號便會停下 之前的都會執行
mysqlbinlog --no-defaults --stop-position=‘558‘ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p  //正確操作 從指定的正確的行號到結尾都會執行
# at 558  //標記號  stop--position=‘558‘ 
#180707 12:06:12 server id 1  end_log_pos 609 CRC32 0xcf4ae275  Table_map: `cai`.`info` mapped to number 108
# at 609 ///誤刪標記行開始
#180707 12:06:12 server id 1  end_log_pos 657 CRC32 0xe5821dc6  Delete_rows: table id 108 flags: STMT_END_F
### DELETE FROM `cai`.`info`
### WHERE
###   @1=‘zhangsan‘
###   @2=88.00
# at 657  //正確行開始 start 

技術分享圖片

MySQL 基於時間點與位置恢復