背景:
正在运行的网站系统,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;
#查看表
Comments | NOTHING