赞
踩
Percona XtraBackup(下文简称PXB)是一个强大的开源工具,旨在为MySQL数据库提供高性能的在线备份解决方案,与传统的备份工具相比(mysqldump、mydumper等)。具备以下优势:
PXB支持的安装方式有很多,本文主要将通过yum安装和Docker安装
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only tools release
yum list | grep percona-xtrabackup
sudo yum install percona-xtrabackup-80.x86_64
xtrabackup -version
yum -y install qpress
安装docker步骤就省略了
docker pull percona/percona-xtrabackup
PXB使用主要分为三个步骤,备份、准备、恢复。
数据备份时,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 是指 本次备份时的序号,后续增量备份需要使用这个值
如果备份时未进行压缩,可以在备份完成之后就先准备 备份文件,这样恢复数据时只需要将备份后的包拷贝到数据库文件中即可,博主是对数据进行压缩了,所以在恢复数据时才准备 备份文件。
解压备份文件
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
启动数据库,查看数据是否恢复
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
解压备份文件
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
上面只是介绍了全量备份和增量备份的步骤,但是在生产环境中还是要通过自动化脚本去进行备份数据,下面介绍下我在生产环境中是怎样实现自动化备份的。
首先编写全量备份脚本和增量备份脚本。我目前是每周一进行全量备份,周二到周末进行增量备份,恢复时最多只需要基于7天的备份数据进行恢复。每天备份完成后将数据发送到其他服务器进行存储,备份结果通过webhook发送至企业微信。
- #!/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

- #!/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

大家觉得有什么需要改进的或者步骤不懂的可以在评论区交流,第一次发文,能帮助到大家的希望可以给博主的文章点个赞,谢谢大家!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。