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