背景:

正在运行的网站系统,MySQL数据库,数据量25G,日业务增量10-15M。

备份策略:

每天23:00,计划任务调用mysqldump执行全备脚本

故障时间点:

上午10点开发人员误删除一个核心业务表,需要恢复

思路:

停业务避免数据的二次伤害

找一个临时的库,恢复前一天的全备

截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库

测试可用性和完整性

开启业务前的两种方式——

直接使用临时库顶替原生产库,前端应用割接到新库

将误删除的表单独导出,然后导入到原生产环境

开启业务

mysql> flush logs;
#刷新binlog使内容更清晰
mysql> show master status;
#查看当前使用的binlog
mysql> create database backup;
#创建backup库
mysql> use backup
#进入backup库
mysql> create table full select * from world.city;
#创建full表
mysql> create table full_1 select * from world.city;
#创建full_1表
mysql> show tables;
#查看表

全备

[root@servera ~]# mysqldump -uroot -p123456 -A -R --triggers --master-data=2 --
single-transaction|gzip > /tmp/full_$(date +%F).sql.gz

模拟数据变化

mysql> use backup
#进入backup库
mysql> create table new select * from mysql.user;
#创建new表
mysql> create table new_1 select * from world.country;
#创建new_1表
mysql> show tables;
#查看表
mysql> select * from full;
#查看full表中所有数据
mysql> update full set countrycode='CHN' where 1=1;
#把full表中所有的countrycode都改成CHN
mysql> commit;
#提交
mysql> delete from full where id>200;
#删除id大于200的数据
mysql> commit;
#提交

模拟故障

mysql> drop table new;
#删除new表
mysql> show tables;
#查看表

恢复过程

准备临时数据库

[root@servera ~]# mysqld_safe --defaults-file=/data/3307/my.cnf &

拷贝数据到新库上

[root@servera ~]# scp /tmp/full_2023-07-28.sql.gz root@192.168.106.10:/tmp 1

解压全备数据文件

[root@servera ~]# cd /tmp/
#进入tmp目录
[root@servera ~]# gzip -d full_2023-07-28.sql.gz
#解压全备数据文件

截取二进制

[root@servera ~]# head -50 full_2023-07-28.sql |grep -i 'change master to'
#查看全备的位置点(起始位置点)
mysql> show binlog events in 'mysql-bin.000017';
#找到drop语句执行的位置点(结束位置点)
[root@servera ~]# mysqlbinlog -uroot -p123456 --start-position=268002 --stopposition=671148 /application/mysql/data/mysql-bin.000017 > /tmp/inc.sql
#截取二进制
[root@db01 tmp]# scp /tmp/inc.sql root@192.168.106.10:/tmp
#发送增量数据到新库

在新库内恢复数据

[root@servera ~]# mysql -S /data/3307/mysql.sock
mysql> set sql_log_bin=0;
#不记录二进制日志
mysql> source /tmp/full_2023-07-28.sql
#恢复全备数据
mysql> use backup
#进入backup库
mysql> show tables;
#查看表
mysql> source /tmp/inc.sql
#恢复增量数据
mysql> show tables;
#查看表

将故障表导出并恢复到生产

[root@servera ~]# mysqldump -uroot -p123456 -S /data/3307/mysql.sock backup new
> /tmp/new.sql
#导出new表
[root@servera ~]#scp /tmp/new.sql root@192.168.106.10:/tmp/
#发送到生产库
mysql> use backup
#进入backup库
mysql> source /tmp/new.sql
#在生产库恢复数据
mysql> show tables;
#查看表