千万级以上数据量的数据库备份就用---Percona XtraBackup

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

        大家觉得有什么需要改进的或者步骤不懂的可以在评论区交流,第一次发文,能帮助到大家的希望可以给博主的文章点个赞,谢谢大家!

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值