Skip to content

OceanBase 物理备份与恢复

物理备份架构

备份组件

OceanBase Backup & Recovery (OBR)

  • 功能:OceanBase 官方提供的物理备份恢复工具
  • 支持的备份介质:本地磁盘、NFS、OSS、S3 等
  • 支持的备份类型:全量备份、增量备份、日志备份
  • 支持的恢复类型:全量恢复、增量恢复、PITR 恢复

备份代理

  • 功能:负责在各个节点上执行备份和恢复操作
  • 部署位置:每个 OceanBase 节点上部署
  • 通信方式:与 OBR 工具通信,执行备份恢复命令
  • 资源管理:自动管理备份所需的 CPU、内存和磁盘资源

备份存储

  • 本地存储:备份到本地磁盘,适合测试环境
  • 网络存储:备份到 NFS、NAS 等网络存储
  • 对象存储:备份到 OSS、S3 等对象存储
  • 磁带库:备份到磁带库,适合长期归档

备份流程

全量备份流程

  1. 备份准备

    • 检查集群状态,确保集群正常运行
    • 检查备份存储,确保有足够的空间
    • 检查备份代理,确保代理正常运行
  2. 备份执行

    • OBR 工具发送备份命令到备份代理
    • 备份代理在每个节点上执行备份操作
    • 备份数据文件和元数据
    • 备份完成后生成备份集
  3. 备份验证

    • 验证备份集的完整性
    • 验证备份集的可用性
    • 记录备份日志和元数据

增量备份流程

  1. 备份准备

    • 检查上次备份的位置
    • 检查增量备份所需的归档日志
    • 检查备份存储,确保有足够的空间
  2. 备份执行

    • OBR 工具发送增量备份命令到备份代理
    • 备份代理在每个节点上执行增量备份操作
    • 备份自上次备份以来变化的数据块
    • 备份完成后生成增量备份集
  3. 备份验证

    • 验证增量备份集的完整性
    • 验证增量备份集与全量备份集的一致性
    • 记录备份日志和元数据

物理备份配置

OBR 工具安装

安装步骤

bash
# 下载 OBR 工具
wget https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/obbackup-2.2.70-1.el7.x86_64.rpm

# 安装 OBR 工具
yum install -y obbackup-2.2.70-1.el7.x86_64.rpm

# 验证安装
obbackup --version

配置文件

yaml
# OBR 配置文件 ~/.obbackup/config.yaml
global:
  user: "admin"
  password: "password"
  sys_user: "root"
  sys_password: "root_password"
  cluster_id: 1
  tenant_name: "sys"
  backup_dest: "oss://backup-bucket/ob-backup"
  oss_config:
    endpoint: "oss-cn-hangzhou.aliyuncs.com"
    access_key_id: "your_access_key_id"
    access_key_secret: "your_access_key_secret"
    region: "cn-hangzhou"

备份存储配置

OSS 存储配置

bash
# 配置 OSS 存储
obbackup config add storage_type=oss endpoint=oss-cn-hangzhou.aliyuncs.com access_key_id=your_access_key_id access_key_secret=your_access_key_secret bucket=backup-bucket

# 查看存储配置
obbackup config list

NFS 存储配置

bash
# 挂载 NFS 存储
mount -t nfs nfs-server:/backup /mnt/backup

# 配置 NFS 存储
obbackup config add storage_type=nfs path=/mnt/backup

本地存储配置

bash
# 创建本地备份目录
mkdir -p /data/ob-backup

# 配置本地存储
obbackup config add storage_type=local path=/data/ob-backup

物理备份操作

全量备份

命令格式

bash
obbackup backup --cluster=obcluster --tenant=tenant1 --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001

常用选项

  • --cluster:指定集群名称
  • --tenant:指定租户名称
  • --backup_type:指定备份类型(full, incremental, differential)
  • --backup_dest:指定备份存储位置
  • --backup_set_name:指定备份集名称
  • --parallel:指定并行备份线程数
  • --compress:启用压缩备份
  • --encrypt:启用加密备份

示例

bash
# 全量备份 sys 租户
obbackup backup --cluster=obcluster --tenant=sys --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=sys_full_backup_20231001 --parallel=8 --compress

# 全量备份业务租户
obbackup backup --cluster=obcluster --tenant=business --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --parallel=16 --compress --encrypt

增量备份

命令格式

bash
obbackup backup --cluster=obcluster --tenant=tenant1 --backup_type=incremental --backup_dest=oss://backup-bucket/ob-backup --base_backup_set=full_backup_20231001 --backup_set_name=incr_backup_20231002

常用选项

  • --base_backup_set:指定基础备份集名称
  • --from_lsn:指定增量备份的起始 LSN
  • --to_lsn:指定增量备份的结束 LSN

示例

bash
# 增量备份业务租户
obbackup backup --cluster=obcluster --tenant=business --backup_type=incremental --backup_dest=oss://backup-bucket/ob-backup --base_backup_set=business_full_backup_20231001 --backup_set_name=business_incr_backup_20231002 --parallel=16 --compress

# 基于 LSN 的增量备份
obbackup backup --cluster=obcluster --tenant=business --backup_type=incremental --backup_dest=oss://backup-bucket/ob-backup --from_lsn=1000000000 --to_lsn=2000000000 --backup_set_name=business_incr_backup_20231002 --parallel=16 --compress

差异备份

命令格式

bash
obbackup backup --cluster=obcluster --tenant=tenant1 --backup_type=differential --backup_dest=oss://backup-bucket/ob-backup --base_backup_set=full_backup_20231001 --backup_set_name=diff_backup_20231002

示例

bash
# 差异备份业务租户
obbackup backup --cluster=obcluster --tenant=business --backup_type=differential --backup_dest=oss://backup-bucket/ob-backup --base_backup_set=business_full_backup_20231001 --backup_set_name=business_diff_backup_20231002 --parallel=16 --compress

日志备份

命令格式

bash
obbackup backup --cluster=obcluster --tenant=tenant1 --backup_type=log --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=log_backup_20231001

示例

bash
# 备份归档日志
obbackup backup --cluster=obcluster --tenant=business --backup_type=log --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_log_backup_20231001 --parallel=8

备份管理

查看备份集

命令格式

bash
obbackup list --backup_dest=oss://backup-bucket/ob-backup

示例

bash
# 查看所有备份集
obbackup list --backup_dest=oss://backup-bucket/ob-backup

# 查看特定租户的备份集
obbackup list --backup_dest=oss://backup-bucket/ob-backup --tenant=business

# 查看特定类型的备份集
obbackup list --backup_dest=oss://backup-bucket/ob-backup --backup_type=full

验证备份集

命令格式

bash
obbackup validate --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001

示例

bash
# 验证备份集完整性
obbackup validate --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001

# 验证备份集可恢复性
obbackup validate --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --check_recoverable

删除备份集

命令格式

bash
obbackup delete --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001

示例

bash
# 删除过期备份集
obbackup delete --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20230901

# 根据备份时间删除备份集
obbackup delete --backup_dest=oss://backup-bucket/ob-backup --before='2023-09-01 00:00:00'

备份集导出

命令格式

bash
obbackup export --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001 --export_path=/data/export

示例

bash
# 导出备份集到本地
obbackup export --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --export_path=/data/export

物理恢复操作

恢复前准备

检查恢复环境

bash
# 检查目标集群状态
obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW CLUSTER STATUS;"

# 检查目标租户状态
obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW TENANTS;"

# 检查恢复存储
obbackup config list

准备恢复目录

bash
# 创建恢复目录
mkdir -p /data/ob-recovery

# 授权恢复目录
chown -R oceanbase:oceanbase /data/ob-recovery

全量恢复

命令格式

bash
obbackup restore --cluster=obcluster --tenant=tenant1 --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001 --restore_path=/data/ob-recovery

示例

bash
# 全量恢复业务租户
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --restore_path=/data/ob-recovery --parallel=16

增量恢复

命令格式

bash
obbackup restore --cluster=obcluster --tenant=tenant1 --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=incr_backup_20231002 --base_backup_set=full_backup_20231001 --restore_path=/data/ob-recovery

示例

bash
# 增量恢复业务租户
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_incr_backup_20231002 --base_backup_set=business_full_backup_20231001 --restore_path=/data/ob-recovery --parallel=16

PITR 恢复

命令格式

bash
obbackup restore --cluster=obcluster --tenant=tenant1 --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=full_backup_20231001 --recovery_time='2023-10-02 14:30:00' --restore_path=/data/ob-recovery

示例

bash
# PITR 恢复业务租户到指定时间点
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --recovery_time='2023-10-02 14:30:00' --restore_path=/data/ob-recovery --parallel=16

# PITR 恢复业务租户到指定 LSN
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --recovery_lsn=1500000000 --restore_path=/data/ob-recovery --parallel=16

恢复后验证

验证集群状态

bash
# 验证集群状态
obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW CLUSTER STATUS;"

# 验证租户状态
obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW TENANTS;"

# 验证数据完整性
obclient -h127.0.0.1 -P2881 -ubusiness -p -c -A business -e "SELECT COUNT(*) FROM test_table;"

备份恢复最佳实践

备份策略设计

全量备份策略

  • 备份频率:每周一次全量备份
  • 备份时间:业务低峰期,如凌晨 2:00-6:00
  • 备份保留时间:保留 4 周
  • 备份介质:对象存储(OSS/S3)+ 本地磁盘

增量备份策略

  • 备份频率:每天一次增量备份
  • 备份时间:业务低峰期,如凌晨 1:00-2:00
  • 备份保留时间:保留 1 周
  • 备份介质:对象存储(OSS/S3)

日志备份策略

  • 备份频率:每小时一次日志备份
  • 备份时间:每小时整点
  • 备份保留时间:保留 2 周
  • 备份介质:对象存储(OSS/S3)

备份性能优化

并行备份

bash
# 使用 16 个并行线程进行备份
obbackup backup --cluster=obcluster --tenant=business --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --parallel=16

压缩备份

bash
# 启用压缩备份
obbackup backup --cluster=obcluster --tenant=business --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --compress

增量备份

bash
# 使用增量备份减少备份时间和空间
obbackup backup --cluster=obcluster --tenant=business --backup_type=incremental --backup_dest=oss://backup-bucket/ob-backup --base_backup_set=business_full_backup_20231001 --backup_set_name=business_incr_backup_20231002

恢复性能优化

并行恢复

bash
# 使用 16 个并行线程进行恢复
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --restore_path=/data/ob-recovery --parallel=16

直接恢复到目标位置

bash
# 直接恢复到目标数据目录
obbackup restore --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --restore_path=/data/ob/data --direct

预恢复准备

bash
# 提前准备恢复环境
obbackup prepare --cluster=obcluster --tenant=business --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001 --restore_path=/data/ob-recovery

常见问题处理

备份失败

症状

  • 备份命令执行失败
  • 报错信息包含 "Backup failed" 或 "Failed to backup"
  • 备份日志显示错误信息

解决方案

  1. 检查集群状态

    bash
    obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW CLUSTER STATUS;"
  2. 检查备份存储

    bash
    obbackup config list
  3. 检查备份日志

    bash
    tail -n 100 /home/oceanbase/obbackup/logs/obbackup.log
  4. 检查磁盘空间

    bash
    df -h
  5. 检查网络连接

    bash
    ping oss-cn-hangzhou.aliyuncs.com

恢复失败

症状

  • 恢复命令执行失败
  • 报错信息包含 "Restore failed" 或 "Failed to restore"
  • 恢复日志显示错误信息
  • 目标集群或租户无法启动

解决方案

  1. 检查目标环境

    bash
    obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SHOW CLUSTER STATUS;"
  2. 检查备份集完整性

    bash
    obbackup validate --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=business_full_backup_20231001
  3. 检查恢复日志

    bash
    tail -n 100 /home/oceanbase/obbackup/logs/obbackup.log
  4. 检查恢复目录权限

    bash
    ls -la /data/ob-recovery
  5. 检查目标集群版本

    bash
    obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -e "SELECT version();"

备份集损坏

症状

  • 备份集验证失败
  • 恢复时提示备份集损坏
  • 备份日志显示校验和错误

解决方案

  1. 重新备份:删除损坏的备份集,重新进行备份
  2. 使用冗余备份:如果有多个备份集,使用其他备份集进行恢复
  3. 检查备份存储:检查备份存储的可靠性,如磁盘坏道、网络故障等
  4. 启用备份校验:在备份时启用校验和验证

恢复后数据不一致

症状

  • 恢复后数据与预期不符
  • 表数据缺失或错误
  • 索引损坏

解决方案

  1. 验证备份集:验证备份集的完整性和一致性
  2. 重新恢复:使用正确的备份集重新进行恢复
  3. 检查恢复命令:检查恢复命令的参数是否正确
  4. 执行数据校验:恢复后执行数据校验,如检查表行数、索引完整性等

常见问题(FAQ)

Q1: 物理备份和逻辑备份有什么区别?

A1: 物理备份和逻辑备份的主要区别:

  • 备份对象:物理备份备份物理文件,逻辑备份备份逻辑数据(SQL 语句)
  • 备份速度:物理备份速度快,逻辑备份速度慢
  • 恢复速度:物理恢复速度快,逻辑恢复速度慢
  • 占用空间:物理备份占用空间小,逻辑备份占用空间大
  • 适用场景:物理备份适合大规模数据库,逻辑备份适合小规模数据库

Q2: 如何选择合适的备份类型?

A2: 选择备份类型的依据:

  • 数据库大小:TB 级以上数据库建议使用物理备份
  • 备份时间要求:要求备份时间短的场景使用物理备份
  • 恢复时间要求:要求恢复时间短的场景使用物理备份
  • 备份空间要求:备份空间有限的场景使用物理备份
  • 数据迁移需求:需要跨版本、跨平台迁移的场景使用逻辑备份

Q3: 如何备份 OceanBase 集群中的多个租户?

A3: 备份多个租户的方法:

  • 逐个备份:使用循环脚本逐个备份每个租户
  • 并行备份:同时备份多个租户,提高备份效率
  • 集群级备份:备份整个集群,包含所有租户
bash
# 逐个备份租户
for tenant in $(obclient -h127.0.0.1 -P2881 -uroot -p -c -A oceanbase -N -e "SHOW TENANTS WHERE tenant_name NOT IN ('sys', 'meta');"); do
  obbackup backup --cluster=obcluster --tenant=$tenant --backup_type=full --backup_dest=oss://backup-bucket/ob-backup --backup_set_name=${tenant}_full_backup_$(date +%Y%m%d) --parallel=8 --compress
done

Q4: 如何实现备份的自动化?

A4: 实现备份自动化的方法:

  • 使用 crontab:配置 crontab 定时执行备份脚本
  • 使用 Ansible:使用 Ansible 自动化备份流程
  • 使用 OCP:使用 OceanBase Cloud Platform (OCP) 管理备份
  • 自定义脚本:编写自定义脚本,实现备份、验证、清理等自动化流程

Q5: 如何监控备份任务的执行状态?

A5: 监控备份任务的方法:

  • 查看备份日志:实时查看备份日志,了解备份进度
  • 使用 OCP 监控:通过 OCP 监控备份任务的执行状态
  • 配置告警:配置备份失败告警,及时发现备份问题
  • 定期验证:定期验证备份集的完整性和可恢复性

Q6: 如何处理备份存储的扩容?

A6: 处理备份存储扩容的方法:

  • 对象存储:自动扩容,无需手动操作
  • 本地磁盘:添加新的磁盘,挂载到备份目录
  • NFS 存储:扩展 NFS 存储容量
  • 备份集迁移:将旧备份集迁移到归档存储,释放空间

Q7: 如何实现跨区域备份?

A7: 实现跨区域备份的方法:

  • 使用跨区域复制:配置对象存储的跨区域复制功能
  • 手动复制:定期将备份集复制到其他区域
  • 跨区域备份任务:在其他区域执行备份任务
  • 使用 OCP:通过 OCP 配置跨区域备份策略

Q8: 如何恢复到不同的集群?

A8: 恢复到不同集群的方法:

  • 同版本恢复:确保目标集群版本与备份集群版本相同
  • 使用 OBR 工具:使用 OBR 工具的恢复功能
  • 配置目标集群:确保目标集群配置与备份集群兼容
  • 执行恢复验证:恢复后执行数据验证,确保数据一致性

Q9: 如何实现 PITR(Point-in-Time Recovery)?

A9: 实现 PITR 恢复的方法:

  • 启用归档日志:确保数据库已启用归档日志
  • 定期备份日志:定期备份归档日志
  • 使用 OBR 工具:使用 OBR 工具的 PITR 恢复功能
  • 指定恢复时间点:在恢复时指定目标时间点或 LSN

Q10: 如何优化备份和恢复的性能?

A10: 优化备份和恢复性能的方法:

  • 使用并行备份:增加并行线程数,提高备份速度
  • 启用压缩:在备份时启用压缩,减少备份时间和空间
  • 使用增量备份:使用增量备份减少备份数据量
  • 优化存储:使用高性能存储,如 NVMe SSD、对象存储
  • 合理规划备份时间:在业务低峰期进行备份,减少对业务的影响