1. 程式人生 > >MySQL 之數據庫增量數據恢復案例

MySQL 之數據庫增量數據恢復案例

rim zip striped binlog 圖片 inf 恢復數據 sed 剔除

MySQL 數據庫增量數據恢復案例

一、場景概述

  1. MySQL數據庫每日零點自動全備
  2. 某天上午10點,小明莫名其妙地drop了一個數據庫
  3. 我們需要通過全備的數據文件,以及增量的binlog文件進行數據恢復

二、主要思想

  1. 利用全備的sql文件中記錄的CHANGE MASTER語句,binlog文件及其位置點信息,找出binlog文件增量的部分
  2. 用mysqlbinlog命令將上述的binlog文件導出為sql文件,並剔除其中的drop語句
  3. 通過全備文件和增量binlog文件的導出sql文件,就可以恢復到完整的數據

三、過程示意圖

技術分享圖片

四、操作過程

1. 模擬數據

MySQL
1 2 3 4 5 6 7 8 9 10 11 CREATETABLE`student`( `id`int(11)NOT NULLAUTO_INCREMENT, `name`char(20)NOT NULL, `age`tinyint(2)NOT NULLDEFAULT‘0‘, PRIMARY KEY(`id`), KEY`index_name`(`name`) )ENGINE=InnoDBAUTO_INCREMENT=8DEFAULTCHARSET=utf8 mysql>insertstudentvalues(1,‘zhangsan‘,20);
mysql>insertstudentvalues(2,‘lisi‘,21); mysql>insertstudentvalues(3,‘wangwu‘,22);

2. 全備命令

MySQL
1 2 3 4 5 6 7 8 # mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip >/server/backup/test_$(date +%F).sql.gz 參數說明: -B指定數據庫 -F刷新日誌 -R備份存儲過程等 -x鎖表 --master-data在備份語句裏添加CHANGEMASTER語句以及binlog文件及位置點信息

3. 繼續插入數據

MySQL
1 2 3 4 5 6 mysql>insertstudentvalues(6,‘xiaoming‘,20); mysql>insertstudentvalues(6,‘xiaohong‘,20); 此時誤操作,刪除了test數據庫 mysql>dropdatabasetest;

此時,全備之後到誤操作時刻之間,用戶寫入的數據在binlog中,需要恢復出來

4.查看全備之後新增的binlog文件

MySQL
1 2 3 4 5 6 # cd /server/backup/ # ls test_2016-08-02.sql.gz # gzip -d test_2016-08-02.sql.gz # grep CHANGE test_2016-08-02.sql -- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000003‘, MASTER_LOG_POS=107;

這是全備時刻的binlog文件位置,即mysql-bin.000003的107行,因此在該文件之前的binlog文件中的數據都已經包含在這個全備的sql文件中了

5. 移動binlog文件,並讀取sql,剔除其中的drop語句

MySQL
1 2 3 # cp /data/3306/mysql-bin.000003 /server/backup/ # mysqlbinlog -d test mysql-bin.000003 >003bin.sql # 用vim編輯文件,剔除drop語句

在恢復全備數據之前必須將該binlog文件移出,否則恢復過程中,會繼續寫入語句到binlog,最終導致增量恢復數據部分變得比較混亂

6. 恢復數據

MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # mysql -uroot -p <test_2016-08-02.sql # mysql -uroot -p -e "select * from test.student;" +----+----------+-----+ |id|name |age| +----+----------+-----+ | 1|zhangsan| 20| | 2|lisi | 21| | 3|wangwu | 22| +----+----------+-----+ //此時恢復了全備時刻的數據 //然後使用003bin.sql文件恢復全備時刻到刪除數據庫之間,新增的數據 # mysql -uroot -p test<003bin.sql <span style="color: #3366ff;" data-mce-style="color: #3366ff;"><-需要指定恢復的數據庫 </span># mysql -uroot -p -e "select * from test.student;" +----+----------+-----+ |id|name |age| +----+----------+-----+ | 1|zhangsan| 20| | 2|lisi | 20| | 3|wangwu | 20| | 4|xiaoming| 20| | 5|xiaohong| 20| +----+----------+-----+ 完成

五、小結

  • 適合人為SQL語句造成的誤操作或者沒有主從復制等的熱備情況宕機時的修復
  • 恢復條件要全備和增量的所有數據
  • 恢復時建議對外停止更新,即禁止更新數據庫
  • 先恢復全量,然後把全備時刻點以後的增量日誌,按順序恢復成SQL文件,然後把文件中有問題的SQL語句刪除(也可通過時間和位置點),再恢復到數據庫

MySQL 之數據庫增量數據恢復案例