MySQL8备份恢复(四)

本文详细介绍了MySQL的全量备份、增量备份以及差异备份的使用方法,包括如何配置参数文件,选择备份类型,以及如何利用LSN进行增量备份。此外,还提供了备份恢复的步骤,包括破坏数据库实例、拷贝恢复及应用日志。文章最后提到了不同场景下的备份操作,如单文件备份、远程备份等。
摘要由CSDN通过智能技术生成

mysqlbackup备份恢复

参数说明

参数文件

在参数文件中加一节 [mysqlbackup],把每次都要用到且不变化的参数写入到这个文件中

单个目录或带时间戳的子目录

-with-timestamp 会在指定的目录下创建一个带时间戳到子目录, 如果为了更方便的进行备份周期的管理,可以选择这个参数

但进行增量备份时在 -incremental-base 参数需要指定前一次备份的目录, 如果需要前一次备份的目录可以被预测, 请不要使用 -with-timestamp

全量备份或增量备份

如果数据小, 或数据变化量大, 可以考虑进行全量备份, 否则考虑增量备份

压缩或不压缩

LZ4的压缩效率高, 速度快, 通常是推荐选项

Differential 和 Incremental Backup

Differential Backup 是在上次全量备份基础上的增量备份

Incremental Backup 是在上次备份(全量,增量)的增量备份

-incremental 和
–incremental-with-redo-log-only

-incremental 从 datafile 中读取变化的块

-incremental-with-redo-log-only 从 redo logfile 中读取变化的块

从 redo 中读取变化的块通常比从 datafile 中读取要快,但不绝对

从 redo 中读取块的增量备份的备份频率设置要考虑 redo logfile 的大小和 redo log 的产生量

-incremental-base 和 -start-lsn

-incremental-base=history:last_backup 从 mysql.backup_history 表中查找最后的 lsn 号, 作为增量备份的起始点

-incremental-base=dir:directory_path, 从备份文件中查找最后的lsn号, 作为增量备份的起始点

-start-lsn 从输入中接收lsn号, 作为增量备份的起始点

安装

rpm -ivh mysql-commercial-backup-8.0.23-1.1.el*.x86_64.rpm

全量备份

#准备数据
truncate table T1;
insert into T1(c_guid,c_time) value(uuid(),now());

[ -d /data/mysqlbackup ] || mkdir -p /data/mysqlbackup
#备份数据库 backup-dir 目录必须为空,此处使用 $(date +%Y%m%d%H%M%S),保证每次新生成,省的去删了
mysqlbackup --host=localhost --user=root --password=******** --backup-dir=/data/mysqlbackup/full.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/full.mbi --force backup-to-image
#查看LSN
#cat meta/backup_variables.txt 省略部分,也可以查看 meta/MEB***.log
binlog_position=binlog.000029:662
end_lsn=48915799
start_lsn=48888832
#校验
mysqlbackup --backup-image=/data/mysqlbackup/full.mbi validate

#插入1笔数据
insert into T1(c_guid,c_time) value(uuid(),now());

恢复

#破坏掉运行的数据库实例,20210429测试必须保留 mysql 空文件夹,否则恢复后重启失败,对 ./binlog.index 无权限, 原因未查明
systemctl stop mysqld
bak_dir=$(date +%Y%m%d%H%M%S) ; cd /var/lib ; mkdir mysql.${bak_dir} ; mv mysql/* mysql.${bak_dir}/  

mysqlbackup --datadir=/var/lib/mysql --backup-dir=/data/mysqlbackup/restore.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/full.mbi copy-back-and-apply-log
chown -R mysql:mysql /var/lib/mysql ; chmod -R 755 /var/lib/mysql
systemctl start mysqld
#全备之后的数据会丢失, 需要根据二进制日志进行基于时间点的恢复  
mysqlbinlog -j 662 binlog.000029 > /tmp/timepoint.sql
mysql -h localhost --port=3306 -u root -p******** < /tmp/timepoint.sql

增量备份

#说明
Differential Backup 是在上次全量备份的增量备份
Incremental Backup  是在上次备份的增量备份
示例: 分别使用两种方案 --incremental-base 和 --start-lsn 

#准备数据
truncate table T1;
insert into T1(c_guid,c_time) value(uuid(),now());

[ -d /data/mysqlbackup ] || mkdir -p /data/mysqlbackup
#首先全备份 
mysqlbackup --host=localhost --user=root --password=******** --backup-dir=/data/mysqlbackup/full.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/full.mbi --force backup-to-image

#插入1笔数据
insert into T1(c_guid,c_time) value(uuid(),now());

#第1次增量备份, history:last_full_backup 是从最后一次全量备份进行增量备份, history:last_backup 则是最后一次备份
mysqlbackup --host=localhost --user=root --password=******** --incremental=optimistic --incremental-base=history:last_full_backup --backup-dir=/data/mysqlbackup/inc1.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/inc1.mbi --force backup-to-image

#插入1笔数据
insert into T1(c_guid,c_time) value(uuid(),now());

#第2次增量备份, 在前面全备份的基础上 以指定的目录做基准目录进行备份
mysqlbackup --host=localhost --user=root --password=******** --incremental=optimistic --incremental-base=dir:/data/mysqlbackup/inc1.<上一次的时间目录> --backup-dir=/data/mysqlbackup/inc2.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/inc2.mbi --force backup-to-image

#插入1笔数据
insert into T1(c_guid,c_time) value(uuid(),now());

#第3次增量备份, 在前面备份的基础上 用在 backup-dir 目录下的 meta/backup_variables.txt 中 end_lsn +1 作为增量 start_lsn
mysqlbackup --host=localhost --user=root --password=******** --incremental --start-lsn=49144337 --backup-dir=/data/mysqlbackup/inc3.$(date +%Y%m%d%H%M%S) --backup-image=/data/mysqlbackup/inc3.mbi --force backup-to-image

#插入1笔数据
insert into T1(c_guid,c_time) value(uuid(),now());

#恢复
#破坏掉运行的数据库实例,20210429测试必须保留 mysql 空文件夹,否则恢复后重启失败,对 ./binlog.index 无权限, 原因未查明
systemctl stop mysqld
bak_dir=$(date +%Y%m%d%H%M%S) ; cd /var/lib ; mkdir mysql.${bak_dir} ; mv mysql/* mysql.${bak_dir}/  

#全备恢复
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/mysqlbackup/full.mbi --backup-dir=/data/mysqlbackup/restore.$(date +%Y%m%d%H%M%S) copy-back-and-apply-log
#第1次增量备份恢复
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/mysqlbackup/inc1.mbi --backup-dir=/data/mysqlbackup/restore.$(date +%Y%m%d%H%M%S) --incremental copy-back-and-apply-log
#第2次增量备份恢复
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/mysqlbackup/inc2.mbi --backup-dir=/data/mysqlbackup/restore.$(date +%Y%m%d%H%M%S) --incremental copy-back-and-apply-log
#第3次增量备份恢复
mysqlbackup --datadir=/var/lib/mysql --backup-image=/data/mysqlbackup/inc3.mbi --backup-dir=/data/mysqlbackup/restore.$(date +%Y%m%d%H%M%S) --incremental copy-back-and-apply-log

chown -R mysql:mysql /var/lib/mysql ; chmod -R 755 /var/lib/mysql
systemctl start mysqld
#备份之后的数据会丢失,需要根据二进制日志进行基于时间点的恢复  第三次增量查询时间点为: binlog.000030:3671
mysqlbinlog -j 3671 binlog.000030 > /tmp/timepoint.sql
mysql -h localhost --port=3306 -u root -p******** < /tmp/timepoint.sql

其他场景

#1.绝对路径
mysqlbackup --defaults-file=/etc/my.cnf --backup-image=/backups/test.mbi --backup-dir=/backup-tmp backup-to-image
#2.相对路径
mysqlbackup --defaults-file=/etc/my.cnf --backup-image=test.mbi --backup-dir=/backups backup-to-image
#3.单文件备份到标准输出
mysqlbackup --defaults-file=/etc/my.cnf --backup-dir=/backups --backup-image=- backup-to-image > /backup/test.mbi
#4.转换存在的备份目录单文件备份
mysqlbackup --backup-image=/backup/test.mbi --backup-dir=/backup-tmp backup-dir-to-image
#5.转换存在的单文件备份到备份目录
mysqlbackup --backup-dir=/backup-tmp --backup-image=/backup/test.mbi image-to-backup-dir
#6.列举单文件备份内容
mysqlbackup --backup-image=/backup/test.mbi list-image
#7.校验单文件备份
mysqlbackup --backup-image=/backup/test.mbi validate
#8.解压单文件备份到当前目录
mysqlbackup --backup-image=/backup/test.mbi extract
#9.解压单文件备份到备份目录
mysqlbackup --backup-image=/backup/test.mbi --backup-dir=/backup-tmp extract
#10.选择性解压单文件
mysqlbackup --backup-image=/backup/test.mbi --src-entry=meta/comments.txt extract
mysqlbackup --backup-image=/backup/test.mbi --src-entry=meta/comments.txt --dst-entry=/tmp/mycomments.txt extract #指定目录
mysqlbackup --backup-image=/backup/test.mbi --src-entry=meta/comments.txt --dst-entry=- extract #至标准输出
#11.选择性解压单个目录
mysqlbackup --backup-image=/backup/test.mbi --src-entry=meta/ extract
#12.处理绝对路径
mysqlbackup --backup-image=/backup/test.mbi --src-entry=/ --dst-entry=/backup-tmp extract #绝对路径转到到指定目录
mysqlbackup --backup-image=/backup/test.mbi --src-entry=. extract #绝对路径转换到当前目录
#13.单文件备份到远程主机
mysqlbackup --defaults-file=/etc/my.cnf --backup-image=- --backup-dir=/tmp backup-to-image | ssh root@192.168.55.44 'cat > ~/backups/test.img'
#14.单文件备份到远程MySQL服务器
mysqlbackup --backup-dir=/backup-tmp --backup-image=- --compress backup-to-image | \
ssh root@192.168.55.44 'mysqlbackup --backup-dir=/backup-tmp --datadir=/data \
--innodb_log_group_home_dir=. --uncompress --backup-image=- copy-back-and-apply-log'
#15.stream备份目录到远程MySQL服务器
mysqlbackup --backup-image=- --backup-dir=/backup-tmp backup-dir-to-image | \
ssh root@192.168.55.44 'mysqlbackup --backup-dir=/backup_tmp --datadir=/data --backup-image=- copy-back-and-apply-log'

未完待续, 后面还有 mysqlshell备份

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺浦力特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值