zl程序教程

您现在的位置是:首页 >  其他

当前栏目

企业案例(二):增量恢复案例

案例企业 恢复 增量
2023-09-11 14:16:42 时间

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允许用户访问.