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.