XtraBuckup mysql 备份恢复

100 阅读5分钟

前言:

Mysql备份有多种方式,mysql dymp备份,XtraBackup,目前XtraBackup在各方面性能更好,备份文件更少。

安装

这里安装Percona-XtraBackup-2.4.21,版本可自行选择

  • 下载rpm
Wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
  • 安装
yum install -y percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
  • 验证安装(能查到版本说明安装成功)
[root@localhost web]# innobackupex --version
xtrabackup: recognized server arguments: --datadir=/usr/local/mysql/0728 --server-id=1
innobackupex version 2.4.21 Linux (x86_64) (revision id: 5988af5)

备份

命令

xtrabackup [--defaults-file=#] --backup +参数

全量备份

全量备份命令:

xtrabackup --defaults-file=/etc/my.cnf --backup --user=root --password=feng --socket=/tmp/mysql.sock --target-dir=/backup/mysql/full/20230730

这里没有制定备份文件进行压缩,xtrabackup带有压缩功能,参数是: --compress 默认是单线程进行压缩,想要提高效率可以再带上多线程压缩参数: --compress-threads=20 这里代表开了20个线程进行压缩文件。

compress 需要用到qpress工具,需要先安装

Xtrabackup常用参数

常用参数:
--user=USER                     指定备份用户,不指定的话为当前系统用户
--password=PASSWD               指定备份用户密码
--port=PORT                     指定数据库端口
--defaults-group=GROUP-NAME     在多实例的时候使用
--host=HOST                     指定备份的主机,可以为远程数据库服务器
--apply-log                     回滚日志
--database                      指定需要备份的数据库,多个数据库之间以空格分开
--defaults-file                 指定mysql的配置文件
--copy-back                     将备份数据复制回原始位置
--incremental                   增量备份,后面跟要增量备份的路径
--incremental-basedir=DIRECTORY 增量备份时使用指向上一次的增量备份所在的目录
--incremental-dir=DIRECTORY     增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
--redo-only                     对增量备份进行合并
--rsync                         加快本地文件传输,适用于non-InnoDB数据库引擎。不与--stream共用
--safe-slave-backup
--no-timestamp                  生成的备份文件不以时间戳为目录.

增量备份

命令:

xtrabackup --defaults-file=/etc/my.cnf --backup  --user=root --password=feng --socket=/tmp/mysql.sock --target-dir=/backup/mysql/add/ad01  --incremental-basedir=/backup/mysql/full/20230730

--backup --incremental-basedir 参数必须都是要带的

恢复

在第一次备份全量后,存放备份文件目录为 /backup/mysql/full/20230730 第一次增量备份基于上一次全量/backup/mysql/full/20230730产生,存放目录为 ad01; 基于第一次增量ad01 进行第二次增量备份,存放目录为 ad02,以此类推。

进行恢复操作:

  • 1、全量恢复
  • 2、增量恢复

备份文件预处理-prepare

一般情况下,在备份完成后,数据尚且不能用于恢复操作。

因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务,此时数据文件仍处理不一致状态。

prepare的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

仅全量步骤 这个命令需要在备份的机器上执行

xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/mysql/full/20230730

增量步骤 这个命令需要在备份的机器上执行

#上一次全量准备  
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/backup/mysql/full/20230730
#第一次增量准备  
xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/backup/mysql/full/20230730 --incremental-dir=/backup/mysql/add/ad01
#第二次增量准备  
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/20230730 --incremental-dir=/backup/mysql/add/ad02
#第三次增量准备  
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/mysql/full/20230730 --incremental-dir=/backup/mysql/add/ad02

除了最后一次增量备份的prepare不需要加--apply-log-only

第二步复制文件到mysql data目录

这一步可以在其它的机器上执行,其它机器安装xtrabackup mysql

复制备份数据到MySQL服务下(全量增量复制命令基本相同)

# 停止mysql
service mysql stop
# 新建mysql data目录,不破坏以前的数据
mkdir /usr/local/mysql/0728
# 执行复制 
xtrabackup --datadir=/usr/local/mysql/0703 --copy-back --target-dir=/usr/local/22-07-03
# 目录权限
chown -R mysql:mysql /usr/local/mysql/0703
# 启动mysql
service mysql start

/usr/local/22-07-03 是从上一步prepare生成的文件夹,复制到恢复机器上。恢复通常是在测试环境进行的。

自动备份脚本:

本文采用linux自带定时任务+执行备份脚本实现定时执行备份,保留一个周期数据备份,两份全备,一周增备,即有两个全备文件夹存放目录 fu01 fu02(脚本已优化为时间轴目录名)和 一周增备存放目录 ad01 ad02 ad03 ad04 ad05。

#!/bin/bash
#获取当前时间是周几
TIMENOW=$(date +%w)
#上一天是周几
LASTADD=`expr $TIMENOW - 1`
if [ $TIMENOW = '0' ]
then
#新建备份文件夹
mkdir -p /backup/mysql/full/`date +%y-%m-%d`
else
mkdir -p /backup/mysql/add/ad0$TIMENOW/`date +%y-%m-%d`
fi
#获取最近的全量备份目录
full_last_dir=`ls /backup/mysql/full -t |head -n 1`
#获取新创建的增量备份目录
add_last_dir=`ls /backup/mysql/add/ad0$TIMENOW -t |head -n 1`
#赋值备份路径给变量
full_data=/backup/mysql/full/$full_last_dir
add_data=/backup/mysql/add/ad0$TIMENOW/$add_last_dir
#如果是周日,执行全量备份
if [ $TIMENOW = '0' ]
    then
	#全量备份数据
        xtrabackup --defaults-file=/etc/my.cnf --backup --user=root --password=feng --socket=/tmp/mysql.sock --target-dir=$full_data
        if [ $? -eq 0 ]
        then
                echo "备份成功,执行历史备份数据删除" >> /root/script/back.log
        else
                echo "警告,备份数据失败"  >> /root/script/back.log
        fi
#增量备份数据
else
#找到上一次备份的最新目录/如果一个周期内只有一个备份文件,可以不需要这条命令
add_yesterday_dir=`ls /backup/mysql/add/ad0$LASTADD -t |head -n 1`
#获取上一次增量备份目录
last_add_data=/backup/mysql/add/ad0$LASTADD/$add_yesterday_dir
#获取上一个周期的增量备份文件夹
old_addfile=`date -d "7 days ago" +%y-%m-%d`
 #执行增量备份
        if [ $TIMENOW = '1' ]
                then
                xtrabackup --defaults-file=/etc/my.cnf --backup  --user=root --password=feng --socket=/tmp/mysql.sock --target-dir=$add_data --incremental-basedir=$full_data
        else
            #获取临时文件夹变量,指定到上一次增量文件夹中
         	 xtrabackup --defaults-file=/etc/my.cnf --backup  --user=root --password=feng --socket=/tmp/mysql.sock --target-dir=$add_data  --incremental-basedir=$last_add_data
        fi   
        if [ $? -eq 0 ]
                then
                echo "备份成功,执行历史备份数据删除" >> /root/script/back.log
        else
                echo "警告,备份数据失败" >> /root/script/back.log
        fi
fi

crontab命令如下:

  • crontab -l:查看定时任务
  • crontab -e:编辑定时任务
0 3 * * * /root/script/backup_auto.sh

代表每天凌晨3点整执行backup_auto.sh脚本,授予脚本执行权限:

chmod 755 /root/script/backup_auto.sh

参考