mysql Percona XtraBackup 生产环境不锁库定时增量备份脚本

内容目录

Percona XtraBackup 是一个热备份工具,它在备份过程中不会锁定数据库,从而允许数据库在备份期间继续接受读写操作。这使得它成为一个非常有效的备份解决方案,尤其是在需要持续运行的生产环境中。
Xtrabackup 系列版本
目前 Xtrabackup 活跃的大版本有三个:

Xtrabackup 2.4 适用于 MySQL 5.6 和 MySQL 5.7。
Xtrabackup 8.0 适用于 MySQL 8.0。
Xtrabackup 8.1 适用于 MySQL 8.1。
注意,三个版本不能混用,因为 MySQL 8.0 版本 redo log 和数据字典格式都发生了变化,可能会出现不兼容的情况
官网下载:https://www.percona.com/downloads

安装

yum install -y perl-Digest-MD5  libaio libev perl-DBD-MySQL

wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.29/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.29-1.el7.x86_64.rpm
rpm -ivh  percona-xtrabackup-24-2.4.29-1.el7.x86_64.rpm 

详细说明

  1. 备份期间的锁定

    • XtraBackup 使用 InnoDB 存储引擎的 MVCC(多版本并发控制)来确保一致性备份。在备份过程中,XtraBackup 会拷贝数据文件,同时跟踪 InnoDB 的日志文件以捕获任何写操作。
    • 在备份开始时,XtraBackup 会短暂地锁定 InnoDB 表,以确保获取一致性快照。这种锁定是非常短暂的,通常在几毫秒到几秒之间,不会对数据库的正常操作造成明显影响。
    • 对于 MyISAM 表,XtraBackup 会在备份过程中对这些表进行读锁定,因此如果你的数据库主要使用 InnoDB 表,锁定时间会非常短。
  2. 恢复期间的锁定

    • 在恢复数据时,XtraBackup 需要将数据库置于离线状态,因为恢复过程会覆盖现有的数据文件。这意味着在恢复期间,数据库将无法接受连接和操作。

增量备份脚本

以下脚本将进行全量和增量备份,使用 Percona XtraBackup,而不锁定数据库:

#!/bin/bash

# 配置备份参数
BACKUP_DIR="/path/to/backup"
FULL_BACKUP_DIR="$BACKUP_DIR/full"
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $FULL_BACKUP_DIR
mkdir -p $INCREMENTAL_BACKUP_DIR

# 全备份文件路径
FULL_BACKUP_PATH="$FULL_BACKUP_DIR/full_backup"

# 增量备份文件路径
INCREMENTAL_BACKUP_PATH="$INCREMENTAL_BACKUP_DIR/incremental_backup_$DATE"

# 如果全备份不存在,创建全备份
if [ ! -d $FULL_BACKUP_PATH ]; then
    xtrabackup --backup --target-dir=$FULL_BACKUP_PATH --user=your_username --password=your_password
    if [ $? -ne 0 ]; then
        echo "Full backup failed!"
        exit 1
    fi
fi

# 创建增量备份
xtrabackup --backup --target-dir=$INCREMENTAL_BACKUP_PATH --incremental-basedir=$FULL_BACKUP_PATH --user=your_username --password=your_password
if [ $? -ne 0 ]; then
    echo "Incremental backup failed!"
    exit 1
fi

# 更新全备份路径
FULL_BACKUP_PATH=$INCREMENTAL_BACKUP_PATH

# 清理旧的增量备份(保留最近 7 天的增量备份)
find $INCREMENTAL_BACKUP_DIR -type d -name "incremental_backup_*" -mtime +7 -exec rm -rf {} \;

设置定时任务

使用 crontab 来设置定时任务,使备份脚本自动执行。执行以下命令来编辑 crontab 文件:

crontab -e

crontab 文件中添加以下行,这样脚本会每天凌晨 2 点运行:

0 2 * * * /path/to/xtrabackup_incremental.sh >> /path/to/xtrabackup_incremental.log 2>&1

确保将 /path/to/xtrabackup_incremental.sh/path/to/xtrabackup_incremental.log 替换为你的备份脚本路径和日志文件路径。

恢复过程

  1. 准备全量备份
xtrabackup --prepare --apply-log-only --target-dir=/path/to/backup/full/full_backup
  1. 应用增量备份
for dir in /path/to/backup/incremental/incremental_backup_*; do
    xtrabackup --prepare --apply-log-only --target-dir=/path/to/backup/full/full_backup --incremental-dir=$dir
done
  1. 完成准备
xtrabackup --prepare --target-dir=/path/to/backup/full/full_backup
  1. 恢复数据
xtrabackup --copy-back --target-dir=/path/to/backup/full/full_backup

确保 /path/to/backup/full/full_backup/path/to/backup/incremental/incremental_backup_* 替换为实际的备份路径。

通过使用 Percona XtraBackup,你可以在不锁定数据库的情况下进行热备份,从而保证数据库的高可用性和一致性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注