当前位置:   article > 正文

千万级以上数据量的数据库备份就用---Percona XtraBackup_pxb流式压缩备份

pxb流式压缩备份

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表明压缩成功

        查看数据备份信息

  1. # 进入备份文件
  2. cd /home/data/xtraback/backupFile
  3. # 查看备份信息
  4. cat xtrabackup_checkpoints
  5. # 结果如下
  6. backup_type = full-prepared
  7. from_lsn = 0
  8. to_lsn = 27504543987983
  9. last_lsn = 27504543987983
  10. flushed_lsn = 27504543987983
  11. redo_memory = 0
  12. 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是否一致)

  1. # 进入备份文件
  2. cd /home/data/xtraback/incBackupFile
  3. # 查看备份信息
  4. cat xtrabackup_checkpoints
  5. # 结果如下
  6. backup_type = incremental
  7. from_lsn = 27504543987983
  8. to_lsn = 29392091292833
  9. last_lsn = 29392161117571
  10. flushed_lsn = 29391535392794
  11. redo_memory = 0
  12. redo_frames = 0

3.2.2 数据恢复

        解压备份文件

xtrabackup --decompress --remove-original --parallel=4 --target-dir=/home/data/xtrabackup/incBackupFile

        准备备份文件

  1. xtrabackup --prepare --apply-log-only --target-dir=/home/data/xtrabackup/backupFile
  2. 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 全量备份脚本

  1. #!/bin/bash
  2. date=$(date +%Y%m%d)
  3. lastDate=$(date -d "$date -1 day" +%Y%m%d)
  4. delDate=$(date -d "$date -7 day" +%Y%m%d)
  5. basePath=/home/data/xtrabackup/
  6. targetDir=$basePath/$date
  7. logFile=$basePath/backupLog/backup_full.log
  8. mysql_password=123456
  9. mv $logFile $basePath/backupLog/backup_full_$lastDate.log
  10. rm -rf $targetDir
  11. mkdir -p $targetDir
  12. cd $basePath
  13. xtrabackup --compress --compress-threads=4 --backup --target-dir=$targetDir -uroot -p$mysql_password >> $logFile 2>&1
  14. last_line=$(tail -n 1 "$logFile")
  15. if echo "$last_line" | grep -q "completed OK!"; then
  16. tar -czvf $basePath/full_$date.tar.gz $date >>$logFile 2>&1
  17. sshpass -p '123456' scp $basePath/full_$date.tar.gz root@192.168.1.6:$basePath
  18. find $basePath -name "full_$delDate.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
  19. find $basePath -name "inc_*.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
  20. rm -rf $lastDate
  21. find $basePath/backupLog -name "*$delDate" -type f -exec rm {} \; >>$logFile 2>&1
  22. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
  23. -H 'Content-Type: application/json' \
  24. -d '
  25. {
  26. "msgtype": "text",
  27. "text": {
  28. "content": "Mysql数据备份已完成"
  29. }
  30. }'
  31. else
  32. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
  33. -H 'Content-Type: application/json' \
  34. -d '
  35. {
  36. "msgtype": "text",
  37. "text": {
  38. "content": "Mysql数据备份未完成,请检查原因"
  39. }
  40. }'
  41. fi

3.3.2 增量备份脚本

  1. #!/bin/bash
  2. date=$(date +%Y%m%d)
  3. delDate=$(date -d "$date -7 day" +%Y%m%d)
  4. previousDate=$(date -d "$date -1 day" +%Y%m%d)
  5. basePath=/home/data/xtrabackup/
  6. targetDir=$basePath/$date
  7. logFile=$basePath/backupLog/backup_inc.log
  8. mysql_password=123456
  9. mv $logFile $basePath/backupLog/backup_inc_$previousDate.log
  10. rm -rf $targetDir
  11. mkdir -p $targetDir
  12. cd $basePath
  13. xtrabackup --compress --compress-threads=4 --backup --target-dir=$targetDir -uroot -p$mysql_password --incremental-basedir=$basePath/$previousDate >>$logFile 2>&1
  14. last_line=$(tail -n 1 "$logFile")
  15. if echo "$last_line" | grep -q "completed OK!"; then
  16. tar -czvf $basePath/inc_$date.tar.gz $date >>$logFile 2>&1
  17. sshpass -p '123456' scp $basePath/inc_$date.tar.gz root@192.168.1.6:$basePath
  18. find $basePath -name "inc_$delDate.tar.gz" -type f -exec rm {} \; >>$logFile 2>&1
  19. rm -rf $previousDate
  20. find $basePath/backupLog -name "*$delDate" -type f -exec rm {} \; >>$logFile 2>&1
  21. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
  22. -H 'Content-Type: application/json' \
  23. -d '
  24. {
  25. "msgtype": "text",
  26. "text": {
  27. "content": "Mysql数据备份已完成"
  28. }
  29. }'
  30. else
  31. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=72eb0d19-3d54-44dd-867' \
  32. -H 'Content-Type: application/json' \
  33. -d '
  34. {
  35. "msgtype": "text",
  36. "text": {
  37. "content": "Mysql数据备份未完成,请检查原因"
  38. }
  39. }'
  40. fi

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/717828
推荐阅读
相关标签
  

闽ICP备14008679号