第九章·DBA-MySQL的备份和恢复

备份的原因

运维工作的核心简单概况就两件事:

1) 第一个是保护公司的数据
2) 第二个是让网站7*24小时提供服务(用户体验)

file

1) 备份就是为了恢复
2) 尽量减少数据的丢失(公司的损失)

备份的类型

冷备份:
需要停机维护,停止服务,备份数据。
这些备份在用户不能访问数据时进行,因此无法读取或修改数据。这些脱机备份会阻止执行任何使用数据 的活动。这些类型的备份不会干扰正常运行的系统的性能。但是,对于某些应用程序,会无法接受必须在 一段较长的时间里锁定或完全阻止用户访问数据。

温备份:
不需要停机,也不需要停服务,但是备份数据的时候,会锁表。
这些备份在读取数据时进行,但在多数情况下,在进行备份时不能修改数据本身。这种中途备份类型的优点是不必完全锁定最终用户。但是,其不足之处在于无法在进行备份时修改数据集,这可能使这种类型的备份不适用于某些应用程序。在备份过程中无法修改数据可能产生性能问题。

热备份:

不需要停机,也不需要停服务,备份数据的时候也不会锁表。
这些动态备份在读取或修改数据的过程中进行,很少中断或者不中断传输或处理数据的功能。使用热备份 时,系统仍可供读取和修改数据的操作访问。

备份的方式

逻辑备份

基于SQL语句的备份

1) binlog
2) into outfile

# 只是导出库里内容
mysql> select * from world.city into outfile '/tmp/world_city.data';

3) mysqldump
4) replication

物理备份

基于数据文件的备份

1) Xtrabackup (percona公司)

备份策略

1) 全量备份 full
2) 增量备份 increamental
3) 差异备份

备份工具

1) mysqldump (逻辑)
mysql原生自带很好用的逻辑备份工具

2) mysqlbinlog (逻辑)
实现binlog备份的原生态命令

3) xtrabackup (物理)
precona公司开发的性能很高的物理备份工具

备份工具的使用

mysqldump的备份

mysqldump常用参数

1) 连接服务端参数(基本参数): -u -p -h -P -S

2) -A,--all-databases: 全库备份

[root@db01 ~]# mysqldump -uroot -p123 -A > /backup/fill.sql

3)不加参数

# 只备份表,不备份库
[root@db01 data]# mysqldump -uroot -p123 world > /tmp/world.sql

# 恢复时,要指定一个数据库
[root@db01 data]# mysql -uroot -p123 lw_world < /tmp/world.sql

## 备份单表world库下的city表
[root@db01 tmp]# mysqldump -uroot -p123 world city > /tmp/city.sql

4)-B:指定库备份

[root@db01 ~]# mysqldump -uroot -p123 -B db1 > /backup/db1.sql

# 备份多个库
[root@db01 ~]# mysqldump -uroot -p123 -B db1 db2 > /backup/db1_db2.sql

5)-F:flush logs在备份时自动刷新binlog(不怎么常用)

[root@db01 backup]# mysqldump -uroot -p123 -A -R –triggers -F > /backup/full_2.sql

6) -d: 仅备份表结构

[root@db01 tmp]# mysqldump -A -d > /tmp/full.sql

7) -t:仅备份表数据

[root@db01 tmp]# mysqldump -A -t > /tmp/full.sql

8) --master-data=[0|1|2]:打点备份

--master-data=[0|1|2]
[root@db01 tmp]# mysqldump -A --master-data=0 > /tmp/full.sql // 关闭打点备份
[root@db01 tmp]# mysqldump -A --master-data=1 > /tmp/full.sql // 可以用来将数据恢复到准
备做该库的从库上
[root@db01 tmp]# mysqldump -A --master-data=2 > /tmp/full.sql // 单纯只为了打点备份

mysqldump备份额外扩展项

1) -R,--routines: 备份存储过程和删除数据

2) --triggers: 备份触发器数据

[root@db01 backup]# mysqldump -uroot -p123 -A -R --triggers > /backup/full_2.sql

mysqldump特殊参数

1) -x: 锁表备份(myisam温备份)

2) --single-transaction: 快照备份

[root@db01 backup]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 –single-transaction>/backup/full.sql

3) gzip: 压缩备份

[root@db01 ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 –single-transaction|gzip>/backup/full.sql.gz

完整备份的语句

mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction >
/tmp/full.sql

## 优化:压缩备份
[root@db01 data]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/lw.sql.gz

## 恢复数据:
[root@db01 data]# zcat /tmp/lw.sql.gz|mysql -uroot -p123
[root@db01 data]# mysql -uroot -p123 < /tmp/full.sql

## 优化:加上日期
# 精确到天
[root@db01 data]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/lw_$(date +%F).sql.gz

# 精确到小时
[root@db01 data]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/lw_$(date +%F-%H).sql.gz

# 精确到分钟
[root@db01 data]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/lw_$(date +%F-%H-%m).sql.gz

# 精确到秒
[root@db01 data]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/lw_$(date +%F-%T).sql.gz

mysqldump的恢复

#先不记录二进制日志
mysql> set sql_log_bin=0;
#库内恢复操作
mysql> source /backup/full.sql
#库外恢复操作
[root@db01 ~]# mysql -uroot -p123 < /backup/full.sql

注意

1)mysqldump在备份和恢复时都需要MySQL实例启动为前提
2)一般数据量级100G以内,大约15-30分钟可以恢复(PB、EB就需要考虑别的方式)
3)mysqldump是以覆盖的形式恢复数据的

企业故障恢复案例

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

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

故障时间点
上午10点开发人员误删除一个核心业务表,如何恢复?

思路

1) 停掉业务避免数据的二次伤害
2) 找一个临时的库,恢复前一天的全备
3)截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库
4)测试可用性和完整性
5)开启业务前的两种方式
a.直接使用临时库顶替原生产库,前端应用割接到新库
b.将误删除的表单独导出,然后导入到原生产环境
6) 开启业务

故障模拟演练:

准备数据

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

全备

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

模拟数据变化

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

模拟故障:

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

恢复过程:

1) 准备临时数据库

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

2) 拷贝数据到新库上

[root@db02 ~]# scp /backup/full_2018-08-16.sql.gz root@10.0.0.52:/tmp

3) 解压全备数据文件

#进入tmp目录
[root@db02 ~]# cd /tmp/

#解压全备数据文件
[root@db02 tmp]# gzip -d full_2018-08-16.sql.gz
截取二进制

#查看全备的位置点(起始位置点)
[root@db02 tmp]# head -50 full_2018-08-16.sql |grep -i 'change master to'

#找到drop语句执行的位置点(结束位置点)
mysql> show binlog events in 'mysql-bin.000017';

#截取二进制
[root@db01 tmp]#mysqlbinlog -uroot -p123 --start-position=268002 --stop-position=671148 /application/mysql/data/mysql-bin.000017 > /tmp/inc.sql

#发送增量数据到新库
[root@db01 tmp]# scp /tmp/inc.sql root@10.0.0.52:/tmp
在新库内恢复数据

#不记录二进制日志
mysql> set sql_log_bin=0;

#恢复全备数据
mysql> source /tmp/full_2018-08-16.sql

#进入backup库
mysql> use backup

# 查看表
mysql> show tables;

#恢复增量数据
mysql> source /tmp/inc.sql

#查看表
mysql> show tables;

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

#导出new表
[root@db02 ~]# mysqldump -uroot -p123 -S /data/3307/mysql.sock backup new > /tmp/new.sql

#发送到生产库
[root@db02 ~]# scp /tmp/new.sql root@10.0.0.51:/tmp/

#进入backup库
mysql> use backup

#在生产库恢复数据
mysql> source /tmp/new.sql

#查看表
mysql> show tables;

物理备份(Xtrabackup)

Xtrabackup安装

#下载epel源
wget -O /etc/yum.repos.d/epel.repo  https://mirrors.aliyun.com/repo/epel-6.repo
#安装依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
#下载Xtrabackup
wget httpss://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

备份方式(物理备份)

1)对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。
2)对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。
3)备份时读取配置文件/etc/my.cnf
4) 老版本使用Xtrabackup会锁表属于温备新版本,针对innodb有单独的备份命令innobackupex

全量备份

# 全备命令
--user:指定用户
--password:指定密码
--socket:指定socket文件位置
--apply-log:模拟CSR
--copy-back:恢复数据
--no-timestamp:备份时,自定义目录名,不使用时间戳

#全备
[root@db01 data]# innobackupex --user=root --password=123 /backup

#避免时间戳,自定义路径名
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full

#查看备份路径中的内容
[root@db01 backup]# ll /backup/full

#记录binlog文件名和binlog的位置点
-rw-r-----  1 root root       21 Aug 16 06:23 xtrabackup_binlog_info 

#备份时刻,立即将已经commit过的内存中的数据页刷新到磁盘
#备份时刻有可能会有其他数据写入,已备走的数据文件就不会再发生变化了

#在备份过程中,备份软件会一直监控着redo和undo,一旦有变化会将日志一并备走
-rw-r-----  1 root root      117 Aug 16 06:23 xtrabackup_checkpoints

#备份汇总信息
-rw-r-----  1 root root      485 Aug 16 06:23 xtrabackup_info

#备份的redo文件
-rw-r-----  1 root root     2560 Aug 16 06:23 xtrabackup_logfile

全备的恢复

准备备份

将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚,模拟CSR的过程

[root@db01 full]# innobackupex --user=root --password=123 --apply-log /backup/full

恢复备份

提前1: 被恢复的目录是空的
提前2: 被恢复的数据的实例是关闭的

#停库
[root@db01 full]# /etc/init.d/mysqld stop
#进入mysql目录
[root@db01 full]# cd /application/mysql
#删除data目录(在生产中可以备份一下)
[root@db01 mysql]# rm -fr data/
#拷贝数据
[root@db01 mysql]# innobackupex --copy-back /backup/ful
#授权
[root@db01 mysql]# chown -R mysql.mysql /application/mysql/data/
#启动MySQL
[root@db01 mysql]# /etc/init.d/mysqld start

增量备份及恢复

备份方式

1)基于上一次备份进行增量
2)增量备份无法单独恢复,必须基于全备进行恢复
3)所有增量必须要按顺序合并到全备当中

#不使用之前的全备,执行一次全备
[root@mysql-db01 ~]#  innobackupex --user=root --password=123 --no-timestamp /backup/full

模拟数据变化

mysql> create database inc1;
mysql> use inc1
mysql> create table inc1_tab(id int);
mysql> insert into inc1_tab values(1),(2),(3);
mysql> commit;
mysql> select * from inc1_tab;

第一次增量备份

[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full/ /backup/inc1
参数说明:
--incremental:开启增量备份功能
--incremental-basedir:上一次备份的路径

再次模拟数据变化

mysql> create database inc2;
mysql> use inc2
mysql> create table inc2_tab(id int);
mysql> insert into inc2_tab values(1),(2),(3);
mysql> commit;

第二次增量备份

[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1/ /backup/inc2

增量恢复

#破坏数据
[root@db01 ~]# rm -fr /application/mysql/data/

准备备份

1)full+inc1+inc2
2)需要将inc1和inc2按顺序合并到full中
3)分步骤进行--apply-log

第一步:在全备中apply-log时,只应用redo,不应用undo

[root@db01 ~]# innobackupex --apply-log --redo-only /backup/full/

第二步:合并inc1合并到full中,并且apply-log,只应用redo,不应用undo

[root@db01 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1/ /backup/full/

第三步:合并inc2合并到full中,redo和undo都应用

[root@db01 ~]# innobackupex --apply-log --incremental-dir=/backup/inc2/ /backup/full/

第四步:整体full执行apply-log,redo和undo都应用

[root@db01 mysql]# innobackupex --apply-log /backup/full/
copy-back
[root@db01 ~]# innobackupex --copy-back /backup/full/
[root@db01 ~]# chown -R mysql.mysql /application/mysql/data/
[root@db01 ~]# /etc/init.d/mysqld start

三次增备

# 注意:
1)基于上一次备份进行增量
2)增量备份无法单独恢复,必须基于全备进行恢复
3)所有增量必须要按顺序合并到全备当中

--incremental:开启增量备份
--incremental-basedir:指定基于上一次备份的目录

## 全备
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full
[root@db02 mysql]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2335482456
last_lsn = 2335482456
compact = 0

## 第一次增备
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/full/ /backup/inc1
[root@db02 mysql]# cat /backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335482456
to_lsn = 2335488029
last_lsn = 2335488029
compact = 0
recover_binlog_info = 0

## 第二次增备
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/inc1/ /backup/inc2
[root@db02 mysql]# cat /backup/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335488029
to_lsn = 2335489768
last_lsn = 2335489768
compact = 0
recover_binlog_info = 0

## 第三次增备
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/inc2/ /backup/inc3
[root@db02 mysql]# cat /backup/inc3/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335489768
to_lsn = 2335491513
last_lsn = 2335491513
compact = 0
recover_binlog_info = 0

恢复增备

1.full + inc1 + inc2 + inc3
2.inc1 合并到full中
3.inc2 合并到full中
4.inc3 合并到full中
5.分步骤进行--apply-log

--redo-only:只做redo
--incremental-dir:指定增量数据的目录(要把该目录合并到full中)

6.先把全备模拟CSR,只做redo 不做undo
[root@db02 mysql]# innobackupex --apply-log --redo-only /backup/full/

7.将inc1合并到全备,只做redo 不做undo
[root@db02 mysql]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1
/backup/full

8.将inc2合并到全备,只做redo 不做undo
[root@db02 mysql]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc2
/backup/full

9.将inc3合并到全备,redo和undo都做
[root@db02 mysql]# innobackupex --apply-log --incremental-dir=/backup/inc3
/backup/full

10.将全备目录,整体做一次redo和undo
[root@db02 mysql]# innobackupex --apply-log /backup/full

11.恢复数据
[root@db02 mysql]# /etc/init.d/mysqld stop
[root@db02 mysql]# rm -fr /application/mysql/data
[root@db02 mysql]# innobackupex --copy-back /backup/full/
[root@db02 mysql]# chown -R mysql.mysql /application/mysql/data
[root@db02 mysql]# /etc/init.d/mysqld start

差异备份

## 全备
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp
/backup/full1
[root@db02 mysql]# cat /backup/full1/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2335492165
last_lsn = 2335492165
compact = 0
recover_binlog_info = 0

## 第一次差异备
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/full1 /backup/chayi1
[root@db02 mysql]# cat /backup/chayi1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335492165
to_lsn = 2335497745
last_lsn = 2335497745
compact = 0
recover_binlog_info = 0

## 第二次差异备份
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/full1 /backup/chayi2
[root@db02 mysql]# cat /backup/chayi2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335492165
to_lsn = 2335501775
last_lsn = 2335501775
compact = 0
recover_binlog_info = 0

## 第三次差异备份
[root@db02 mysql]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/full1 /backup/chayi3
[root@db02 mysql]# cat /backup/chayi3/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335492165
to_lsn = 2335505723
last_lsn = 2335505723
compact = 0
recover_binlog_info = 0

差异备份恢复

1.关闭数据库
[root@db02 mysql]# /etc/init.d/mysqld stop

2.清空data目录
[root@db02 mysql]# rm -fr /application/mysql/data

3.先将全备只做redo不做undo
[root@db02 mysql]# innobackupex --apply-log --redo-only /backup/full1

4.合并最后一次差异备份,redo和undo都做
[root@db02 mysql]# innobackupex --apply-log --incremental-dir=/backup/chayi3
/backup/full1

5.将全备,redo和undo都做一次
[root@db02 mysql]# innobackupex --apply-log /backup/full1

6.恢复数据
[root@db02 mysql]# innobackupex --copy-back /backup/full1

7.授权
[root@db02 mysql]# chown -R mysql.mysql /application/mysql/data

8.启动数据库
[root@db02 mysql]# /etc/init.d/mysqld start

模拟用户写数据

[root@db02 backup]# vim /root/mysql.sh
#!/bin/bash

num=1
while true;do
mysql -uroot -p123 -e "insert into zls.chayi value($num);commit;"
(( num++ ))
sleep 1
done

## 全备
[root@db02 backup]# innobackupex --user=root --password=123 --no-timestamp
/backup/full2
[root@db02 backup]# cat /backup/full2/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2335532269
last_lsn = 2335535141
compact = 0
recover_binlog_info = 0

## 第一次增备
[root@db02 backup]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/full2 /backup/zls_inc1
[root@db02 backup]# cat /backup/zls_inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335532269
to_lsn = 2335575438
last_lsn = 2335575438
compact = 0
recover_binlog_info = 0

## 第二次增备
[root@db02 backup]# innobackupex --user=root --password=123 --no-timestamp --
incremental --incremental-basedir /backup/zls_inc1 /backup/zls_inc2
[root@db02 backup]# cat /backup/zls_inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2335575438
to_lsn = 2335597445
last_lsn = 2335597445
compact = 0
recover_binlog_info = 0

2.企业级增量恢复实战

背景: 某大型网站,mysql数据库,数据量500G,每日更新量100M-200M

备份策略: xtrabackup,每周六0:00进行全备,周一到周五及周日00:00进行增量备份。

故障场景: 周三下午2点出现数据库意外删除表操作。

如何恢复???

模拟数据

#!/bin/bash

num=1
while true;do
  mysql -uroot -p123 -e "insert into proc.proc1 value($num);commit;"
  (( num++ ))
  sleep 1
done

备份

## 上周六全备 周六 00点 备周一到周五数据
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full_$(date +%F)
[root@db02 ~]# cat /backup/full_2022-08-19/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 2335986976
last_lsn = 2335986976
compact = 0
recover_binlog_info = 0

## 第一次增备 周日的00点  备的周六增量数据  周六00点之后到周日00点之前
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/full_$(date +%F) /backup/inc_6
[root@db02 ~]# cat /backup/inc_6/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2335986976
to_lsn = 2336208335
last_lsn = 2336223316
compact = 0
recover_binlog_info = 0

## 第二次增备 周一的00点  备的周日增量数据  周日00点之后到周一00点之前
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_6 /backup/inc_7
[root@db02 ~]# cat /backup/inc_7/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2336208335
to_lsn = 2336236884
last_lsn = 2336249656
compact = 0
recover_binlog_info = 0

## 第三次增备 周二的00点  备的周一增量数据  周一00点之后到周二00点之前
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_7 /backup/inc_1
[root@db02 ~]# cat /backup/inc_1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2336236884
to_lsn = 2336264378
last_lsn = 2336264942
compact = 0
recover_binlog_info = 0

## 第四次增备 周三的00点  备的周二增量数据  周二00点之后到周三00点之前
[root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_1 /backup/inc_2
[root@db02 ~]# cat /backup/inc_2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2336264378
to_lsn = 2336273708
last_lsn = 2336273708
compact = 0
recover_binlog_info = 0

## binlog截取 周三00点之后到周三下午14点之间的数据

删除数据

mysql> select * from ts;
+----+------+
| id | A    |
+----+------+
|  1 |  300 |
|  2 |  200 |
+----+------+

mysql> drop table test.ts;

恢复思路

1.停业务,停库
[root@db02 ~]# /etc/init.d/mysqld stop

2.准备新环境

3.清空data目录
[root@db02 ~]# mv /application/mysql/data/ /usr/local/src/

4.重做数据
1)全备只做redo不做undo
[root@db02 ~]# innobackupex --apply-log --redo-only /backup/full_2022-08-19/

2)周六的增量数据合并到full中只做redo不做undo
[root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_6 /backup/full_2022-08-19/

3)周日六的增量数据合并到full中只做redo不做undo
[root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_7 /backup/full_2022-08-19/

4)周一的增量数据合并到full中只做redo不做undo
[root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_1 /backup/full_2022-08-19/

5)周二的增量数据合并到full中redo和undo都做
[root@db02 ~]# innobackupex --apply-log --incremental-dir=/backup/inc_2 /backup/full_2022-08-19/

6)全备整体做一遍redo和undo
[root@db02 ~]# innobackupex --apply-log /backup/full_2022-08-19/

5.恢复数据
[root@db02 ~]# innobackupex --copy-back /backup/full_2022-08-19/

6.授权
[root@db02 ~]# chown -R mysql.mysql /application/mysql/data

7.启动数据库
[root@db02 ~]# /etc/init.d/mysqld start

8.binlog截取 周三00点之后到周三下午14点之间的数据
第一段起始位置点:184023
[root@db02 ~]# cat /backup/full_2022-08-19/xtrabackup_binlog_info 
mysql-bin.000003    184023

[root@db02 ~]# mysqlbinlog -vvv --base64-output=decode-row /usr/local/src/data/mysql-bin.000003 |grep -i drop -C 5
第一段结束位置点:200666

第二段起始位置点:200781

[root@db02 ~]# mysqlbinlog -vvv --base64-output=decode-row /usr/local/src/data/mysql-bin.000003
第二段结束位置点:205830

## 截取
[root@db02 ~]# mysqlbinlog --start-position=184023 --stop-position=200666 /usr/local/src/data/mysql-bin.000003 > /tmp/inc_1.sql
[root@db02 ~]# mysqlbinlog --start-position=200781 --stop-position=205830 /usr/local/src/data/mysql-bin.000003 > /tmp/inc_2.sql

山林不向四季起誓 荣枯随缘