一、Xtrabackup介绍
xtrabackup是由Percona公司开发的一个用于MySQL数据库物理热备的工具,开源免费,目前官方最新版本是8.0.35,也支持8.0.37版本数据库,本文已经过测试。另外8.1,8.2和8.3也支持。它具有如下优点:
(1)备份速度快,物理备份可靠;
(2)在备份期间不间断地处理事务;
(3)支持备份压缩,节约磁盘空间和网络带宽;
(4)自动校验备份。xtrabackup支持流式输出、压缩、增量备份、加密,是目前各个备份厂商普遍使用的MySQL备份工具。
二、Xtrabackup备份原理
1、xtrabackup开始,记录lsn ,同时启动后台进程监控redo日志的变化,且将变化实时记录到xtrabackup_logfile中;
2、复制ibdata1,.ibd数据文件;
3、全局读锁,执行LOCK INSTANCE FOR BACKUP(8.0取代了 FLUSH TABLES WITH READ LOCK);
4、复制非InnoDB的表和文件;
5、获取binlog位置信息;
6、停止复制redo log,即停止记录xtrabackup_logfile;
7、执行UNLOCK INSTANCE释放锁;
8、复制buffer pool;
9、备份完成。
三、下载软件
官网地址:https://www.percona.com/downloads Percona XtraBackup 8.0 只支持MySQL 8.0的版本 Percona XtraBackup 2.4 支持MySQL 5.11 , 5.5, 5.6 和5.7的版本大家按需下载对应的版本当然,也可以从网盘下载
链接: https://pan.baidu.com/s/1cWZ_Vbf8d-eUaAsawA2lUg
提取码: sfka
四、安装xtrabackup工具
一键安装脚本如下:
#!/bin/bash
cd /etc/yum.repos.d/
rm -rf ./*
cat >> /etc/yum.repos.d/centos.repo <<-EOF
[centos]
name=oracle
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF
cd
mount /dev/sr0 /mnt
yum clean all|wc -l
yum makecache
yum install perl-Digest-MD5 -y
echo "-----------------创建所需目录及用户并上传安装包----------------------------"
# 获取当前所在目录位置
current_dir=$(pwd)
echo "当前所在目录位置: $current_dir"
# 目标路径
target_dir="/usr/local"
# 检查目标路径是否存在,如果不存在则创建
if [ ! -d "$target_dir" ]; then
mkdir -p "$target_dir"
echo "已创建目录: $target_dir"
fi
# 移动当前目录下的所有文件到目标路径
mv $current_dir/percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17.tar.gz $target_dir
echo "已将当前目录下所有文件移动至 $target_dir"
cd /usr/local
tar -xvf percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17.tar.gz
mv percona-xtrabackup-8.0.35-31-Linux-x86_64.glibc2.17 xtrabackup
echo "export PATH=\$PATH:/usr/local/xtrabackup/bin" >>/etc/profile
source /etc/profile
which xtrabackup
xtrabackup --version
五、备份脚本
#!/bin/bash
# 定义变量
BACKUP_BASE_DIR="/data/backup"
DATE_STR=$(date +%F)
TIME_STR=$(date +%H%M%S) # 添加时间戳
DAY_OF_WEEK=$(date +%u)
FULL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_full_${DATE_STR}"
INCREMENTAL_BACKUP_DIR="${BACKUP_BASE_DIR}/db_incr_${DATE_STR}_${TIME_STR}"
LOG_FILE="${BACKUP_BASE_DIR}/db_backup_${DATE_STR}_${TIME_STR}.log"
MYSQL_CONF="/etc/my.cnf"
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_SOCKET="/tmp/mysql.sock"
# 上一次备份目录(可以是全备份或上一次增量备份)
LAST_BACKUP_DIR="${BACKUP_BASE_DIR}/db_last"
# 判断是否是周一,如果是,则进行全量备份;否则进行增量备份
if [ "$DAY_OF_WEEK" -eq 1 ]; then
BACKUP_DIR=$FULL_BACKUP_DIR
BACKUP_TYPE="FULL"
INCREMENTAL_OPTION=""
else
if [ -L "$LAST_BACKUP_DIR" ] && [ -d "$(readlink -f $LAST_BACKUP_DIR)" ] && [ -f "$(readlink -f $LAST_BACKUP_DIR)/xtrabackup_checkpoints" ]; then
BACKUP_DIR=$INCREMENTAL_BACKUP_DIR
BACKUP_TYPE="INCREMENTAL"
INCREMENTAL_OPTION="--incremental-basedir=$(readlink -f $LAST_BACKUP_DIR)"
else
BACKUP_DIR=$FULL_BACKUP_DIR
BACKUP_TYPE="FULL"
INCREMENTAL_OPTION=""
fi
fi
# 创建新的备份目录
mkdir -p $BACKUP_DIR
# 执行 xtrabackup 备份命令
/usr/local/xtrabackup/bin/xtrabackup --defaults-file=$MYSQL_CONF \
--backup \
--target-dir=$BACKUP_DIR \
$INCREMENTAL_OPTION \
--user=$MYSQL_USER \
--password=$MYSQL_PASSWORD \
--socket=$MYSQL_SOCKET \
> $LOG_FILE 2>&1
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "${BACKUP_TYPE} backup completed successfully at $(date)" | tee -a $LOG_FILE
else
echo "${BACKUP_TYPE} backup failed at $(date)" | tee -a $LOG_FILE
exit 1
fi
# 更新 LAST_BACKUP_DIR 链接指向最新备份目录
ln -sfn $BACKUP_DIR $LAST_BACKUP_DIR
# 清理3天以前的备份
find $BACKUP_BASE_DIR -type d -name "db_full_*" -mtime +3 -exec rm -rf {} \;
find $BACKUP_BASE_DIR -type d -name "db_incr_*" -mtime +3 -exec rm -rf {} \;
find $BACKUP_BASE_DIR -type f -name "db_backup_*.log" -mtime +3 -exec rm -f {} \;
echo "Cleanup of backups older than 3 days completed at $(date)" | tee -a $LOG_FILE
欢迎关注公众号《小周的数据库进阶之路》,更多精彩知识和干货尽在其中。