MySQL 的增量备份是指只备份自上次备份(全量或增量)以来发生更改的数据,而不备份整个数据库。增量备份的优势在于它占用的存储空间较少,备份速度较快,适用于大规模数据库。

要实现 MySQL 的增量备份,通常使用 MySQL 的 binlog(二进制日志)来实现,因为二进制日志记录了所有对数据库的数据更改操作。增量备份可以基于二进制日志的内容。

实现步骤:

  1. 启用 MySQL 二进制日志
    在 MySQL 配置文件中启用二进制日志,配置文件通常为 my.cnfmy.ini

    [mysqld]
    log-bin=mysql-bin
    expire_logs_days=7  # 日志保存的天数,根据需要调整
    binlog_format=row   # 日志记录的格式,推荐使用 `row`

    启用后,MySQL 会生成二进制日志文件,这些文件可以用于恢复数据库中的所有更改。

  2. 全量备份
    需要先进行一次全量备份,通常使用 mysqldumpxtrabackup 工具来执行。示例命令如下:

    mysqldump --all-databases --single-transaction --quick --lock-tables=false > /backup/full_backup.sql
  3. 增量备份
    增量备份的核心是备份自上次备份以来生成的 binlog 文件。通过保存和转储这些 binlog 文件,我们就可以实现增量备份。

    • 确定上一次增量备份时的 binlog 文件名和位置。
    • 将这些 binlog 文件保存为增量备份。

Shell 脚本实现 MySQL 增量备份

#!/bin/bash

# 配置变量
BACKUP_DIR="/backup"  # 备份目录
BINLOG_DIR="/var/lib/mysql"  # 二进制日志文件所在目录
LOG_FILE="$BACKUP_DIR/backup.log"  # 备份日志
LAST_BINLOG_FILE="$BACKUP_DIR/last_binlog.txt"  # 上次备份时的 binlog 文件名

# 记录当前时间
NOW=$(date +"%Y-%m-%d_%H-%M-%S")

# 如果没有全量备份,先进行全量备份
if [ ! -f "$BACKUP_DIR/full_backup.sql" ]; then
    echo "[$NOW] No full backup found, starting full backup..." >> "$LOG_FILE"
    mysqldump --all-databases --single-transaction --quick --lock-tables=false > "$BACKUP_DIR/full_backup.sql"
    echo "[$NOW] Full backup completed." >> "$LOG_FILE"
fi

# 记录当前的 binlog 文件列表
echo "[$NOW] Starting incremental backup..." >> "$LOG_FILE"

# 获取当前的 binlog 文件列表
CURRENT_BINLOG=$(mysql -e "SHOW MASTER LOGS;" | tail -n +2 | awk '{print $1}')

# 读取上次备份时的 binlog 文件
if [ -f "$LAST_BINLOG_FILE" ]; then
    LAST_BINLOG=$(cat "$LAST_BINLOG_FILE")
else
    LAST_BINLOG=""
fi

# 备份从上次备份后的 binlog 文件
for binlog in $CURRENT_BINLOG; do
    if [[ "$binlog" > "$LAST_BINLOG" ]]; then
        cp "$BINLOG_DIR/$binlog" "$BACKUP_DIR/$binlog"
        echo "[$NOW] Backed up binlog: $binlog" >> "$LOG_FILE"
    fi
done

# 更新最后备份的 binlog 文件记录
echo "$CURRENT_BINLOG" > "$LAST_BINLOG_FILE"

echo "[$NOW] Incremental backup completed." >> "$LOG_FILE"

脚本解析:

  1. 变量配置

    • BACKUP_DIR:存储备份文件的目录。
    • BINLOG_DIR:MySQL 存储二进制日志的目录(通常为 /var/lib/mysql)。
    • LOG_FILE:备份操作的日志文件。
    • LAST_BINLOG_FILE:记录上次备份的 binlog 文件。
  2. 全量备份检测

    • 如果没有发现全量备份文件(full_backup.sql),则自动执行一次全量备份。
  3. 增量备份过程

    • 通过 SHOW MASTER LOGS 获取当前的 binlog 文件列表。
    • 根据上次备份的 binlog 文件名,复制新的 binlog 文件到备份目录。
    • 每次备份后,将最新的 binlog 文件记录在 last_binlog.txt 中,以便下次增量备份时使用。
  4. 增量备份文件

    • 该脚本会把增量备份的 binlog 文件保存到 BACKUP_DIR 目录下,以便在恢复时进行使用。

恢复流程:

  1. 恢复全量备份

    mysql < /backup/full_backup.sql
  2. 应用增量备份(binlog 文件)

    mysqlbinlog /backup/mysql-bin.000001 /backup/mysql-bin.000002 | mysql

    依次应用增量备份的 binlog 文件,将数据库恢复到最新状态。

总结:

通过启用 MySQL 的二进制日志并结合增量备份脚本,可以高效地完成增量备份。增量备份相比全量备份更加节省存储空间,适合大规模数据库场景的日常备份需求。

要按照上述 Shell 脚本的增量备份机制进行恢复操作,分为两个步骤:首先是恢复全量备份,然后应用增量备份中的二进制日志(binlog 文件)来将数据库恢复到最新状态。

恢复步骤

  1. 恢复全量备份

    首先,使用 MySQL 全量备份文件(full_backup.sql)来恢复数据库到全量备份的状态。假设你的全量备份文件位于 /backup/full_backup.sql

    mysql -u root -p < /backup/full_backup.sql

    此命令会将 full_backup.sql 中的数据恢复到你的数据库中。

  2. 应用增量备份(binlog 文件)

    增量备份的 binlog 文件是二进制日志,存储了自上次全量备份后的所有数据变更。接下来需要使用 mysqlbinlog 命令将这些二进制日志文件逐个应用到数据库中。

    假设增量备份的 binlog 文件保存在 /backup/ 目录中。根据你执行的增量备份情况,binlog 文件可能为 mysql-bin.000001mysql-bin.000002 等。

    mysqlbinlog /backup/mysql-bin.000001 /backup/mysql-bin.000002 | mysql -u root -p

    或者,你可以使用一个循环来自动应用多个 binlog 文件:

    for binlog in /backup/mysql-bin.*
    do
        mysqlbinlog "$binlog" | mysql -u root -p
    done

    上述命令会自动遍历 /backup/ 目录下的所有 binlog 文件并依次应用到 MySQL 数据库中。

恢复流程解释

  1. 恢复全量备份
    通过全量备份文件(full_backup.sql)恢复数据库到备份时的状态,这一步恢复所有在全量备份时的数据。

  2. 应用增量备份
    二进制日志文件(binlog 文件)记录了在全量备份之后所有的数据库操作。使用 mysqlbinlog 工具可以读取这些日志,并将日志中的 SQL 语句应用到 MySQL 数据库中,从而将数据库状态恢复到最新的状态。

    如果有多个增量备份(多个 binlog 文件),需要按照生成的顺序逐一应用,确保不会遗漏任何数据变更。

注意事项

  • 增量备份文件顺序:务必要按照 binlog 文件生成的顺序依次应用,不能跳过或错乱顺序,否则可能导致数据恢复不完整或数据不一致。
  • 完整性检查:在恢复过程中,可以通过查看 MySQL 日志或者直接查询数据库,检查数据的完整性和一致性。
  • 备份频率:全量备份应定期进行,以减少依赖增量备份的文件数量,从而缩短恢复时间。

通过这些步骤,你可以根据全量备份和增量备份,完整恢复数据库,确保数据的一致性和完整性。

作者:严锋  创建时间:2024-10-15 20:14
最后编辑:严锋  更新时间:2025-05-09 15:48