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备份