Percona XtraBackup数据备份方案
一、简介
官方文档:https://docs.percona.com/percona-xtrabackup/innovation-release/index.html
Percona XtraBackup 是一款适用于基于 MySQL 的服务器的开源热备份实用程序,可让您的数据库在计划的维护时段内保持完全可用。无论是 24x7 高负载服务器还是低交易量服务器,Percona XtraBackup 都旨在实现无缝备份,而不会影响生产环境中服务器的性能。
支持的引擎: InnoDB、XtraDB、MyISAM、MyRocks
限制:8.0版本限制于不支持备份MySQL、Percona Server for MySQL 或 Percona XtraDB Cluster 8.0s之前的版本中创建的数据库。
优点:免费、热备份、增量备份、高效恢复、支持多种引擎、备份压缩
缺点:只支持对应版本备份、资源消耗、恢复过程复杂
二、环境
三、安装(dnf)
3.1 安装存储库
dnf install \
https://repo.percona.com/yum/percona-release-latest.\
noarch.rpm
3.2 启动存储库
sudo percona-release enable-only tools release
#如果之前已安装release,则只需启用“tools”:
sudo percona-release enable-only tools
3.3 运行安装percona-xtrabackup-80
sudo dnf install percona-xtrabackup-80
四、备份
4.1 完整备份
#创建完整备份
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --target-dir=/data/backups
#准备备份
xtrabackup --prepare --target-dir=/data/backups
#如果需要增量备份需加参数--apply-log-only
输出结果:
4.2 增量备份
#创建完整备份
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --target-dir=/data/backup
#查看
cat /data/backups/xtrabackup_checkpoints
#创建增量备份
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --target-dir=/data/inc01 --incremental-basedir=/data/backups
#创建多个增量备份
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --target-dir=/data/inc02 --incremental-basedir=/data/inc01
#准备完整备份
xtrabackup --prepare --apply-log-only --target-dir=/data/backups
#准备第一个增量备份
xtrabackup --prepare --apply-log-only --target-dir=/data/backups \
--incremental-dir=/data/inc01
4.3 压缩备份
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --compress --target-dir=/data/backups/base01
#指定压缩级别--compress-zstd-level=1
#1 (默认): 最快的压缩速度,最低的压缩率。
#2-5: 较快的压缩速度,适中的压缩率。
#6-9: 平衡压缩速度和压缩率。
#10-15: 较慢的压缩速度,更高的压缩率。
#16-22: 最慢的压缩速度,最高的压缩率。
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --compress compress-zstd-level=1 --target-dir=/data/backups/base01
#加快压缩速度,使用并行压缩:--compress-threads
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --compress --compress-threads=4 --target-dir=/data/backups/base01
#更换压缩算法:-compress=lz4
xtrabackup --backup -H x.x.x.x -u [user] -p[password] --compress=lz4 --compress-threads=4 --target-dir=/data/backups/base01
#准备备份前需解压备份文件
xtrabackup --decompress --target-dir=/data/compressed/
#准备备份
xtrabackup --prepare --apply-log-only --target-dir=/data/backups
4.4 部分备份
#备份表
#匹配表名(正则表达式)
xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ --tables="^test[.].*"
#提供表名列表
echo "mydatabase.mytable" > /tmp/tables.txt
xtrabackup --backup --tables-file=/tmp/tables.txt
#备份数据库
xtrabackup --databases='mysql sys performance_schema test ...'
#准备备份
xtrabackup --prepare --export --target-dir=/path/to/partial/backup
#找不到表时忽略
xtrabackup --prepare -–innodb-force-recovery=1 --export --target-dir=/path/to/partial/backup
五、恢复
xtrabackup --copy-back --target-dir=/data/backups/
chown -R mysql:mysql /var/lib/mysql
chmod 751 /var/lib/mysql
六、备份脚本
全量备份
#!/bin/bash
date=`date +%F`
backupDir=/data/backups
target_dir=/data/backups/$date
mysqlDir=/home/mysql/mysql8/bin/mysql
backupLog=$backupDir/backuplog
mysql_password=xxxxxxxxx
if [[ `ls $backupDir | grep $date | wc -l` -ne '0' ]]
then
echo "$target_dir exists!!!"
else
mkdir $target_dir
fi
if [[ `ls $backupDir | grep backuplog | wc -l` -ne '0' ]]
then
echo "$backupLog exists!!!"
else
mkdir $backupLog
fi
xtrabackup --backup --host=localhost --user=root --password=$mysql_password --target-dir=$target_dir
xtrabackup --prepare --apply-log-only --target-dir=$target_dir >> $backupLog/prepare_full_success.log 2>&1
find $backupDir -maxdepth 1 -type d -mtime +30 -exec rm -Rf {} \; >> $backupLog/deleted_record.log 2>&1 ##删除30天前的备份文件
增量备份
#!/bin/bash
date=`date +"%F"`
datenum=`date -d "1 days ago" +%F`
backupall_time=`date -d "last Sunday" +%F`
backupDir=/data/backups
target_dir=/data/backups/$date
backupLog=$backupDir/backuplog
mysql_password=xxxxxxx
if [[ `ls $backupDir | grep $date | wc -l` -ne '0' ]]
then
echo "$target_dir exists!!!"
else
mkdir $target_dir
fi
if [[ `ls $backupDir | grep backuplog | wc -l` -ne '0' ]]
then
echo "$backupLog exists!!!"
else
mkdir $backupLog
fi
xtrabackup --backup --host=localhost --user=root --password=$mysql_password --target-dir=$target_dir --incremental-basedir=$backupDir/$datenum
xtrabackup --prepare --apply-log-only --target-dir=$backupDir/$backupall_time --incremental-dir=$target_dir >> $backupLog/prepare_incr_success.log 2>&1
find $backupDir -maxdepth 1 -type d -mtime +30 -exec rm -Rf {} \; >> $backupLog/deleted_record.log 2>&1
备份策略
0 1 * * 7 /bin/bash /data/shell/backup_all.sh
0 1 * * 1-6 /bin/bash /data/shell/backup_add.sh