背景
1 2 3 4 5 |
1.正在运行的网站系统,MySQL数据库,数据量25G,日业务增量10-15M。 2.备份策略:每天23:00,计划任务调用mysqldump执行全备脚本 3.故障时间点:上午10点开发人员误删除一个核心业务表,如何恢复 |
数据库恢复思路
1 2 3 4 5 6 7 8 |
1.停止业务,避免数据的二次伤害 2.找一个临时的库,恢复前一天的全备 3.截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库 4.测试可用性和完整性 5.开启业务前的两种方式 1)直接使用临时库顶替原生产库,前端应用割接到新库(核心业务表数据量多的时候) 2)将误删除的表单独导出,然后导入到原生产环境(核心业务表数据量少的时候) 6.开启业务 |
故障模拟
1)准备数据
1 2 3 4 5 6 7 8 |
#建库 mysql> create database backup; #切换库 mysql> use backup; #建表 mysql> create table back111(id int); #建表 mysql> create table back222 select * from world.city; |
2)进行23:00全备
1 2 |
#定时任务备份 [root@db01 ~]# mysqldump -uroot -p -A -R --triggers --master-data=2 --single-transaction > /tmp/backup$(date +%F).sql |
3)模拟23:00备份后到早上10点的操作
1 2 3 4 5 6 |
#切换库 mysql> use backup #建表 mysql> create table back333 select * from world.city; #修改数据 mysql> update back222 set countrycode='CHN' where 1=1; |
4)模拟10:00开发人员删除核心表
1 2 |
#删除核心表 mysql> drop table back111; |
恢复数据
停止业务
1 |
[root@db01 ~]# systemctl stop mysqld |
准备新的数据库
找出binlog对应23:00到10点的位置点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
1.找到起始位置点 [root@db01 ~]# less /tmp/backup2020-11-04.sql #第22行 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=959935; 2.找到结束位置点 [root@db01 ~]# mysqlbinlog --base64-output=decode-rows -vvv --start-position=959935 /usr/local/mysql/data/mysql-bin.000013 > 1.txt [root@db01 ~]# vim 1.txt # at 1339403 ... ... DROP TABLE `back111` /* generated by server */ 3.截取binlog [root@db01 ~]# mysqlbinlog --start-position=959935 --stop-position=1339403 /usr/local/mysql/data/mysql-bin.000013 > /tmp/huifu.sql |
将全备和恢复的sql推送到新库
1 2 |
[root@db01 ~]# scp /tmp/backup2020-11-04.sql 172.16.1.52:/tmp [root@db01 ~]# scp /tmp/huifu.sql 172.16.1.52:/tmp |
将sql导入新的数据库
1 2 3 |
[root@db02 ~]# mysql < /tmp/backup2020-11-04.sql [root@db02 ~]# mysql < /tmp/huifu.sql #尽量使用source的方式恢复 |
确认数据
1 2 |
mysql> use backup mysql> select * from back333; |