1.PXB 介绍
Percona XtraBackup(下文简称PXB)是一个强大的开源工具,旨在为MySQL数据库提供高性能的在线备份解决方案,与传统的备份工具相比(mysqldump、mydumper等)。具备以下优势:
- 快速备份及恢复
- 备份期间不间断处理事务
- 节省磁盘空间和网络带宽
- 可增量备份或全量备份
2.PXB 安装
PXB支持的安装方式有很多,本文主要将通过yum安装和Docker安装
2.1 yum安装PXB
- 安装Percona yum 库
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
- 启动percona库
percona-release enable-only tools release
- 查看PXB版本
yum list | grep percona-xtrabackup
- 安装指定版本的PXB
sudo yum install percona-xtrabackup-80.x86_64
- 查看PXB是否安装成功
xtrabackup -version
- 下载压缩解压工具(PXB可以使用qpress对备份后的数据进行压缩)
yum -y install qpress
2.2 Docker安装PXB
安装docker步骤就省略了
- 拉取镜像
docker pull percona/percona-xtrabackup
3.PXB 使用
PXB使用主要分为三个步骤,备份、准备、恢复。
3.1 全量备份及恢复
3.1.1 数据备份
数据备份时,mysql不需要停机
xtrabackup --compress --compress-threads=4 --backup --target-dir=/home/data/xtrabackup/backupFile -uroot -p123456
参数说明
--compress 使用qpress对备份后的数据进行压缩(建议使用)
--compress-threads=4 使用多线程对数据进行压缩(根据自己服务器配置去设置)
--target-dir=backupFile 备份后的数据存放路径
-uroot -p123456 数据库相关配置
如果出现下图所示,则表明备份成功,注意备份完的文件后缀为.qp表明压缩成功
查看数据备份信息
# 进入备份文件
cd /home/data/xtraback/backupFile
# 查看备份信息
cat xtrabackup_checkpoints
# 结果如下
backup_type = full-prepared
from_lsn = 0
to_lsn = 27504543987983
last_lsn = 27504543987983
flushed_lsn = 27504543987983
redo_memory = 0
redo_frames = 0
PXB通过LSN编号记录备份的序号
from_lsn = 0 是指从0开始
last_lsn 是指 本次备份时的序号,后续增量备份需要使用这个值
3.1.2 数据恢复
如果备份时未进行压缩,可以在备份完成之后就先准备 备份文件,这样恢复数据时只需要将备份后的包拷贝到数据库文件中即可,博主是对数据进行压缩了,所以在恢复数据时才准备 备份文件。
解压备份文件
xtrabackup --decompress --remove-original --parallel=4 --target-dir=/home/data/xtrabackup/backupFile
准备备份文件
xtrabackup --prepare --target-dir=/home/data/xtrabackup/backupFile/
恢复文件(先停止mysql,将mysql数据文件全部删除否则会导致数据恢复失败)
xtrabackup --copy-back --target-dir=/home/data/xtrabackup/backupFile/
给恢复后的数据文件进行授权(数据库文件地址 可在/etc/my.cnf中查看)
chown -R mysql.mysql /home/data/mysql
启动数据库,查看数据是否恢复
3.2 增量备份及恢复
3.2.1 数据备份
xtrabackup --compress --compress-threads=4 --backup --target-dir=/home/data/xtraback/incBackupFile -uroot -p123456 --incremental-basedir=/home/data/xtraback/backupFile
参数说明 相比较与全量备份多了一个参数
--incremental-basedir=/home/data/xtraback/oldIncBackupFile 表明上一次备份的文件夹,就是基于上次备份的文件去做增量备份
通过看控制台输出查看是否增量备份成功
查看数据备份信息(注意看from_lsn和上一次备份的to_lsn是否一致)
# 进入备份文件
cd /home/data/xtraback/incBackupFile
# 查看备份信息
cat xtrabackup_checkpoints
# 结果如下
backup_type = incremental
from_lsn = 27504543987983
to_lsn = 29392091292833
last_lsn = 29392161117571
flushed_lsn = 29391535392794
redo_memory = 0
redo_frames = 0
3.2.2 数据恢复
解压备份文件
xtrabackup --decompress --remove-original --parallel=4 --target-dir=/home/data/xtrabackup/incBackupFile
准备备份文件
xtrabackup --prepare --apply-log-only --target-dir=/home/data/xtrabackup/backupFile
xtrabackup --prepare --target-dir=/home/data/xtrabackup/incBackupFile--incremental-dir=/home/data/xtrabackup/backupFile/
恢复备份文件(其实就是将要恢复的数据copy到数据库的数据文件中)
xtrabackup --copy-back --target-dir=/home/data/xtrabackup/incBackupFile/
授权数据库文件
chown -R mysql.mysql /home/data/mysql
3.3 实现自动备份数据
上面只是介绍了全量备份和增量备份的步骤,但是在生产环境中还是要通过自动化脚本去进行备份数据,下面介绍下我在生产环境中是怎样实现自动化备份的。
首先编写全量备份脚本和增量备份脚本。我目前是每周一进行全量备份,周二到周末进行增量备份,恢复时最多只需要基于7天的备份数据进行恢复。每天备份完成后将数据发送到其他服务器进行存储,备份结果通过webhook发送至企业微信。
3.3.1 全量备份脚本
#!/bin/bash
date=$(date +%Y%m%d)
lastDate=$(date -d "$date -1 day" +%Y%m%d)
delDate=$(date -d "$date -7 day" +%Y%m%d)
basePath=/home/data/xtrabackup/
targetDir=$basePath/$date
logFile=$basePath/backupLog/backup_full.log
mysql_password=123456
mv $logFile $basePath/backupLog/backup_full_$lastDate.log
rm -rf $targetDir
mkdir -p $targetDir
cd $basePath
xtrabackup --compress --compress-threads=4 --backup --target-dir=$targetDir -uroot -p$mysql_password >> $logFile 2>&1
last_line=$(tail -n 1 "$logFile")
if echo "$last_line" | grep -q "completed OK!"; then
tar -czvf $basePath/full_$date.tar.gz $date >>$logFile 2>&1
sshpass -p '123456' scp $basePath/full_$date.tar.gz root@192.168.1.6:$basePath
find $basePath -name "full_$delDate.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
find $basePath -name "inc_*.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
rm -rf $lastDate
find $basePath/backupLog -name "*$delDate" -type f -exec rm {} \; >>$logFile 2>&1
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "Mysql数据备份已完成"
}
}'
else
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "Mysql数据备份未完成,请检查原因"
}
}'
fi
3.3.2 增量备份脚本
#!/bin/bash
date=$(date +%Y%m%d)
delDate=$(date -d "$date -7 day" +%Y%m%d)
previousDate=$(date -d "$date -1 day" +%Y%m%d)
basePath=/home/data/xtrabackup/
targetDir=$basePath/$date
logFile=$basePath/backupLog/backup_inc.log
mysql_password=123456
mv $logFile $basePath/backupLog/backup_inc_$previousDate.log
rm -rf $targetDir
mkdir -p $targetDir
cd $basePath
xtrabackup --compress --compress-threads=4 --backup --target-dir=$targetDir -uroot -p$mysql_password --incremental-basedir=$basePath/$previousDate >>$logFile 2>&1
last_line=$(tail -n 1 "$logFile")
if echo "$last_line" | grep -q "completed OK!"; then
tar -czvf $basePath/inc_$date.tar.gz $date >>$logFile 2>&1
sshpass -p '123456' scp $basePath/inc_$date.tar.gz root@192.168.1.6:$basePath
find $basePath -name "inc_$delDate.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
rm -rf $previousDate
find $basePath/backupLog -name "*$delDate" -type f -exec rm {} \; >>$logFile 2>&1
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "Mysql数据备份已完成"
}
}'
else
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "Mysql数据备份未完成,请检查原因"
}
}'
fi
大家觉得有什么需要改进的或者步骤不懂的可以在评论区交流,第一次发文,能帮助到大家的希望可以给博主的文章点个赞,谢谢大家!