Percona Xtrabackup 基于准备好的完整备份的增量备份

Percona Xtrabackup 基于准备好的完整备份的增量备份

我想使用 Percona XtraBackup 将我们的 MySQL 数据库每小时备份到暂存系统。

是否可以准备 $BACKUPBASE,然后使用这个准备好的备份基础作为以下增量备份的基础(使用incremental-lsn选项)?

我的计划是:

  • 将完整备份放入 $BACKUPBASE
  • 然后每小时:

    • 在 $BACKUPBASE 基础上进行增量备份
    • 使用以下方法将增量备份集成到 $BACKUPBASE 中

      innobackupex --apply-log $BACKUPBASE --incremental-dir=$INCREMENTALDIR
      innobackupex --apply-log $BACKUPBASE
      
    • 删除 $INCREMENTALDIR

更具体:

  • 那么 --redo-log 选项呢?在这种情况下我什么时候必须指定此选项?
  • 您可以将增量备份应用于准备好的 $BACKUPBASE

答案1

不行,因为上面提到的 --apply-log 不会更新 xtrabackup_checkpoints 中的 LSN,因此每次增量备份都会复制自上次完整备份以来修改的页面。这不是你想要实现的

更新型多巴胺

要实现您的场景,您需要:

  1. 进行完整备份

    innobackupex --no-timestamp /path/full
    
  2. 保存最后一个 LSN

    # cat /path/full/xtrabackup_checkpoints 
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 1887987291
    last_lsn = 1887987291
    compact = 0
    
    to_lsn=`grep to_lsn /path/full/xtrabackup_checkpoints | awk '{ print $3 }'`
    
  3. 应用 xtrabackup REDO 日志

    innobackupex --apply-log --redo-only /path/full/
    
  4. 进行增量备份

    innobackupex --no-timestamp --incremental /path/inc/ --incremental-lsn=$to_lsn
    
  5. 保存最后一个 LSN

    # cat /path/inc/xtrabackup_checkpoints 
    backup_type = incremental
    from_lsn = 1887987291
    to_lsn = 1887987291
    last_lsn = 1887987291
    compact = 0
    
    to_lsn=`grep to_lsn /path/inc/xtrabackup_checkpoints | awk '{ print $3 }'`
    
  6. 应用增量更改和 REDO 日志

    innobackupex --apply-log --redo-only --incremental-dir=/path/inc /path/full/
    
  7. 删除带有增量备份的目录

    rm -r  /path/inc
    

重复 4-7 即可。/path/full 将包含数据库的最新版本。

当你想恢复数据库时

  1. 完成应用日志(=创建 REDO 日志):

    innobackupex --apply-log /path/full
    
  2. 将备份副本复制到 datadir

    mv /path/full/* /var/lib/mysql
    
  3. 修复权限(检查 /path/full/backup-my.cnf 中的选项是否与 /etc/my.cnf(Debian 的 /etc/mysql/my.cnf)中的选项相同)

    chown -R mysql /var/lib/mysql
    
  4. 启动 MySQL

    /etc/init.d/mysql start
    

相关内容