Percona XtraBackup 备份与还原


# centos 7 下

# 安装 percona XtraBackup 8.0:适用percona mysql 8.0版本

yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y

yum install percona-xtrabackup-80

# 安装 percona XtraBackup 2.4:适用percona mysql 5.1,5.5,5.6,5.7版本

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y 

yum install percona-xtrabackup-24 -y

# 安装压缩工具

yum install qpress -y

# 本次测试基于centos 7,mysql 5.7

################### 完整备份数据库并还原 ###################

# 备份数据库

xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/data/db_bak/ --socket=/tmp/mysql.sock --user=root --password=2wsx#EDC

# 创建数据文件和日志的存储路径

mkdir /data/mysqldata

mkdir /data/mysqllogs

mkdir /data/mysqllogs/binlog

touch /data/mysqllogs/error.log

 # 还原数据库

# 准备还原文件

xtrabackup --prepare --target-dir=/data/db_bak/

# 停止mysql 服务,并删除当前mysql的数据目录下的文件以及binlog日志目录的文件

service mysqld stop

rm -fr /data/mysqldata/*

rm -fr /data/mysqllogs/binlog/*

# 还原数据库

xtrabackup --copy-back --target-dir=/data/db_bak/

# 重新为mysql的数据目录和binlog目录授予权限

chown -R mysql:mysql /data/mysqldata

chown -R mysql:mysql /data/mysqllogs

# 启动数据库

service mysqld start

################### 完整备份+增量备份数据库 ###################

# 每周一进行完整备份,周二到周日进行增量备份 

# 脚本内容如下:

#!/bin/bash
user='root'
pass='2wsx#EDC'
path='/data/db_bak/'
date=`date +"%Y%m%d"`
l=`date +"%w"`
if [ $l -eq 1 ]
then
  bak_path=$path'full_bak/'$date
  mkdir -p ${bak_path}
  xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=${bak_path} --socket=/tmp/mysql.sock --user=${user} --password=${pass}

else
  p_data=`date -d "1 day ago" +"%Y%m%d"`
  if [ $l -eq 2 ]
  then
    incre_dir=${path}'full_bak/'${p_data}
  else
  incre_dir=${path}'increment_bak/'${p_data}
  fi
  bak_path=$path'increment_bak/'$date
  mkdir -p ${bak_path}
  xtrabackup --backup --target-dir=${bak_path} --incremental-basedir=${incre_dir} --socket=/tmp/mysql.sock --user=${user} --password=${pass}
fi

 # --target-dir 备份文件存储目录,--incremental-basedir 增量备份文件依据目录(如果是第一次增量备份,则为完整备份的目录,否则是前一次增量备份的目录)

################### 完整备份+增量备份 还原数据库 ###################

# 准备完整备份

xtrabackup --prepare --apply-log-only --target-dir=/data/db_bak/full_bak/20220321/

# 准备第一个增量备份

xtrabackup --prepare --apply-log-only --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220322/

# 准备第二个增量备份

xtrabackup --prepare --apply-log-only --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220323/

# 一直到准备最后一个增量备份,最后一个增量备份不需要加 --apply-log-only

xtrabackup --prepare  --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220327/

# 恢复数据库

xtrabackup --copy-back --target-dir=/data/db_bak/full_bak/20220321/

############ 注意 ############

# 例:上面一周7天,周一进行完整备份,周二至周日进行增量备份,如果只想恢复到周三的备份,只需要:周一完整备份+周二增量备份+周三增量备份。

# 恢复完成后,此时的完整备份已经的信息已经累加到了周三,如需要还原到周二的备份,即周一完整备份+周二增量备份 已经无法还原了。

# 上面的增量备份/data/db_bak/increment_bak/20220323/ 已经恢复过一次了,如果需要再次重新恢复,需要跳过这个增量备份,即 :使用过一次的增量备份,不可再次进行--prepare 

xtrabackup --prepare --apply-log-only --target-dir=/data/db_bak/full_bak/20220321/

xtrabackup --prepare --apply-log-only --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220322/

 # 报错如下:

[root@localhost ~]# xtrabackup --prepare --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220322/
xtrabackup: recognized server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksum_algorithm=strict_crc32 --innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_files_in_group=2 --innodb_log_file_size=1073741824 --innodb_fast_checksum=0 --innodb_page_size=16384 --innodb_log_block_size=512 --innodb_undo_directory=./ --innodb_undo_tablespaces=0 --server-id=1 --redo-log-version=1
xtrabackup: recognized client arguments: --prepare=1 --target-dir=/data/db_bak/full_bak/20220321/ --incremental-dir=/data/db_bak/increment_bak/20220322/
xtrabackup version 2.4.24 based on MySQL server 5.7.35 Linux (x86_64) (revision id: b4ee263)
incremental backup from 13178852243030 is enabled.
xtrabackup: cd to /data/db_bak/full_bak/20220321/
xtrabackup: This target seems to be already prepared.
xtrabackup: error: applying incremental backup needs target prepared with --apply-log-only.