1. 程式人生 > >企業案例(二):增量恢復案例

企業案例(二):增量恢復案例

new img master 技術 2.3 分鐘 cti binlog日誌 誤刪數據

1、環境準備

條件:

1.具備全量備份(mysqldump)。

2.除全量備份以外,還有全量備份之後產生的的所有binlog增量日誌。

1.1、建立數據庫和表

CREATE DATABASE dadong;
USE `dadong`;
CREATE TABLE `test` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (
1,dadong),(2,he),(3,inca),(4,zuma),(5,kaka);

1.2、建立備份目錄

準備環境:
mkdir /data/backup -p
date -s "2017/06/22"

1.3、備份數據庫

mysqldump -B --master-data=2 --single-transaction dadong|gzip>/data/backup/dadong_$(date +%F).sql.gz
備份數據庫後插入幾行數據。模擬沒有備份全備,但是binlog存在記錄時,恢復數據。
mysql -e "use dadong;insert into test values(6,‘bingbing‘);
" mysql -e "use dadong;insert into test values(7,‘xiaoting‘);" mysql -e "select * from dadong.test;"

1.4、 模擬誤刪數據

date -s "2017/06/22 11:40"
mysql  -e "drop database dadong;show databases;"

出現問題10分鐘後,發現問題,刪除了數據庫了.

2、開始恢復準備

2.1、采用iptables防火墻屏蔽所有應用程序的寫入

[root@dadong ~]# iptables -I INPUT -p tcp --dport 3306
! -s 172.16.1.51 -j DROP #<==非172.16.1.51禁止訪問數據庫3306端口。

:此步操作目的是停止客戶數據的寫入,而並不是停止數據庫

2.2、 操作前備份

cp -a /application/mysql/logs/dadong-bin.* /data/backup/

2.3、準備全量和增量備份文件

1.dadong_2017-06-22.sql(全量)
2.bin.sql(增量)

3、恢復過程

3.1、 恢復全備

[root@db02 backup]#zcat dadong_2017-06-22.sql.gz >dadong_2017-06-22.sql    ###解壓全備文件
[root@db02 backup]# mysql <dadong_2017-06-22.sql
[root@db02 backup]# mysql -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| dadong             |
| he            |
| performance_schema |
+--------------------+

[root@db02 backup]# mysql -e "use dadong;select * from test;"
+----+---------+
| id | name    |
+----+---------+
|  1 | dadong  |
|  2 | he |
|  3 | inca    |
|  4 | zuma    |
|  5 | kaka    |
+----+---------+

3.2、恢復增量

———————————以下正式恢復操作——————————————             
[root@db02 backup]#sed -n 22p  dadong_2017-06-22.sql   ###獲取binlog日誌的起始地址339
[root@db02 backup]#mysqlbinlog -d dadong --start-position=339 dadong-bin.0000012 -r bin.sql   ##”-d” 指定查看哪個庫;”-r” 指定binlog日誌存放在哪個文件中。
[root@db02 backup]#grep -i drop bin.sql 
[root@db02 backup]#sed -i /^drop.*/d bin.sql   ###刪除刪庫語句,防止恢復後又執行drop語句。
[root@db02 backup]# mysql dadong <bin.sql 
[root@db02 backup]# mysql -e "use dadong;select * from test;"
+----+----------+
| id | name     |
+----+----------+
|  1 | dadong   |
|  2 | he  |
|  3 | inca     |
|  4 | zuma     |
|  5 | kaka     |
|  6 | bingbing |
|  7 | xiaoting |
+----+----------+

####註釋:mysqlbinlog -d dadong dadong-bin.0000012 -r bin.sql   ###其中“dadong-bin.0000012”要根據最後相關操作時間(刪庫時間)來確定drop語句放在哪個binlog文件中,
並且binlog文件是二進制文件,必須使用mysqlbinlog進行操作後才能使用cat查看。

:此時如果沒有執行sed -i ‘/^drop.*/d‘ bin.sql就會出現下面錯誤

技術分享圖片

3.3、 恢復完畢

最後一步特別重要,恢復完畢後,一定要調整iptables允許用戶訪問.

企業案例(二):增量恢復案例