Skip to content

TiDB 增量备份

增量备份是指仅备份自上次备份以来发生变化的数据,与全量备份相比,具有备份时间短、存储空间占用小的优点。TiDB 支持通过 TiCDC 或 Binlog 进行增量备份,适用于需要频繁备份的场景。

增量备份架构

1. 基于 TiCDC 的增量备份

TiCDC 是 TiDB 提供的变更数据捕获工具,可以实时捕获 TiKV 中的数据变更,并将其输出到不同的下游系统。基于 TiCDC 的增量备份架构包括:

  • TiCDC 集群:负责捕获 TiKV 中的数据变更
  • 存储系统:用于存储增量备份数据,如 S3、GCS、HDFS 或本地文件系统
  • 备份工具:将 TiCDC 捕获的变更数据转换为可恢复的备份格式

2. 基于 Binlog 的增量备份

TiDB Binlog 是 TiDB 早期提供的变更数据捕获工具,虽然已被 TiCDC 取代,但仍可用于增量备份。基于 Binlog 的增量备份架构包括:

  • TiDB Binlog 集群:包括 Pump 和 Drainer 组件
  • Pump:部署在每个 TiDB 节点,负责收集 TiDB 产生的 Binlog
  • Drainer:负责聚合和处理 Pump 收集的 Binlog
  • 存储系统:用于存储增量备份数据

增量备份准备

1. 环境要求

  • TiDB 集群版本:推荐使用 TiDB 4.0 及以上版本
  • 存储系统:支持 S3、GCS、HDFS 或本地文件系统
  • 网络带宽:确保 TiCDC 或 TiDB Binlog 与存储系统之间有足够的网络带宽
  • 存储空间:根据业务数据量增长情况,规划足够的存储空间

2. TiCDC 部署与配置

部署 TiCDC 集群

使用 TiUP 部署 TiCDC 集群:

bash
# 创建包含 TiCDC 的拓扑文件
cat > ticdc-topology.yaml << EOF
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb-deploy"
  data_dir: "/tidb-data"

pd_servers:
  - host: 10.0.1.1
  - host: 10.0.1.2
  - host: 10.0.1.3

tidb_servers:
  - host: 10.0.1.4
  - host: 10.0.1.5

tikv_servers:
  - host: 10.0.1.6
  - host: 10.0.1.7
  - host: 10.0.1.8

ticdc_servers:
  - host: 10.0.1.9
  - host: 10.0.1.10
EOF

# 部署集群
tiup cluster deploy <cluster-name> <tidb-version> ticdc-topology.yaml --user <username> -p
 启动集群
tiup cluster start <cluster-name>

配置 TiCDC 变更数据输出

创建 TiCDC 同步任务,将变更数据输出到存储系统:

bash
# 创建 TiCDC 同步任务,输出到 S3
tiup cdc cli changefeed create --server=http://<ticdc-host>:8300 --sink-uri="s3://<bucket-name>/backup/incremental?endpoint=<s3-endpoint>&access-key=<access-key>&secret-access-key=<secret-key>" --changefeed-id="incremental-backup"

# 创建 TiCDC 同步任务,输出到本地文件系统
tiup cdc cli changefeed create --server=http://<ticdc-host>:8300 --sink-uri="file:///path/to/backup/incremental" --changefeed-id="incremental-backup"

3. TiDB Binlog 部署与配置

部署 TiDB Binlog 集群

使用 TiUP 部署包含 TiDB Binlog 的集群:

bash
# 创建包含 TiDB Binlog 的拓扑文件
cat > binlog-topology.yaml << EOF
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb-deploy"
  data_dir: "/tidb-data"

pd_servers:
  - host: 10.0.1.1
  - host: 10.0.1.2
  - host: 10.0.1.3

tidb_servers:
  - host: 10.0.1.4
  - host: 10.0.1.5

tikv_servers:
  - host: 10.0.1.6
  - host: 10.0.1.7
  - host: 10.0.1.8

pump_servers:
  - host: 10.0.1.4
  - host: 10.0.1.5

drainer_servers:
  - host: 10.0.1.9
EOF

# 部署集群
tiup cluster deploy <cluster-name> <tidb-version> binlog-topology.yaml --user <username> -p
 启动集群
tiup cluster start <cluster-name>

增量备份策略设计

1. 备份周期设计

根据业务需求和数据变化频率,设计合理的增量备份周期:

  • 高频备份:对于数据变化频繁的业务,建议每小时或每 30 分钟进行一次增量备份
  • 中频备份:对于数据变化适中的业务,建议每 2-4 小时进行一次增量备份
  • 低频备份:对于数据变化较少的业务,建议每 6-24 小时进行一次增量备份

2. 备份保留策略

根据业务数据的重要性和合规要求,设计合理的备份保留策略:

  • 近期备份:保留最近 7-30 天的增量备份,用于快速恢复
  • 中期备份:保留最近 1-3 个月的增量备份,用于历史数据查询
  • 长期备份:将重要数据的增量备份归档,保留 6 个月以上,用于合规审计

3. 备份验证策略

定期验证增量备份的完整性和可恢复性:

  • 自动验证:使用脚本定期验证备份文件的完整性
  • 手动验证:定期进行恢复测试,确保备份数据可以正常恢复
  • 监控告警:监控备份任务的执行状态,及时发现备份失败情况

增量备份操作

1. 使用 TiCDC 进行增量备份

创建增量备份任务

bash
# 创建 TiCDC 增量备份任务
tiup cdc cli changefeed create \
  --server=http://<ticdc-host>:8300 \
  --sink-uri="s3://<bucket-name>/backup/incremental?endpoint=<s3-endpoint>&access-key=<access-key>&secret-access-key=<secret-key>" \
  --changefeed-id="incremental-backup" \
  --start-ts=<start-ts> \
  --config=ticdc-backup-config.toml

配置文件示例(ticdc-backup-config.toml)

toml
[sink]
# 输出格式,支持 json、avro 等
format = "json"
# 是否输出事务信息
enable-txn = true
# 输出文件的滚动大小,默认 64MB
file-size = "64MB"
# 输出文件的滚动时间,默认 1h
flush-interval = "1h"

查看备份任务状态

bash
# 查看所有 TiCDC 任务
tiup cdc cli changefeed list --server=http://<ticdc-host>:8300

# 查看指定任务的详细状态
tiup cdc cli changefeed query --server=http://<ticdc-host>:8300 --changefeed-id="incremental-backup"

2. 使用 TiDB Binlog 进行增量备份

配置 Drainer 输出到文件

修改 Drainer 配置文件 drainer.toml

toml
[syncer]
# 输出格式,支持 mysql、pb、file 等
dest-type = "file"
# 文件输出路径
dir = "/path/to/backup/incremental"
# 输出文件的滚动大小,默认 128MB
file-size = 128
# 输出文件的滚动时间,默认 3600s
flush-interval = 3600

重启 Drainer 生效配置

bash
# 重启 Drainer 组件
tiup cluster reload <cluster-name> -R drainer

增量备份恢复操作

1. 基于全量备份 + 增量备份的恢复

增量备份恢复需要先恢复全量备份,然后应用增量备份:

步骤 1:恢复全量备份

bash
# 使用 BR 恢复全量备份
tiup br restore full \
  --pd="<pd-host>:2379" \
  --storage="s3://<bucket-name>/backup/full" \
  --ratelimit=128 \
  --concurrency=64

步骤 2:应用增量备份

根据增量备份的类型,选择不同的恢复方式:

使用 TiCDC 增量备份恢复
bash
# 使用 TiCDC 恢复工具应用增量备份
tiup cdc cli processor create \
  --server=http://<ticdc-host>:8300 \
  --changefeed-id="incremental-restore" \
  --sink-uri="mysql://<user>:<password>@<tidb-host>:4000/" \
  --config=ticdc-restore-config.toml
使用 TiDB Binlog 增量备份恢复
bash
# 使用 binlogctl 恢复增量备份
tiup binlogctl drainer restore \
  --data-dir="/path/to/backup/incremental" \
  --pd-urls="<pd-host>:2379" \
  --from-db="<source-db>" \
  --to-db="<target-db>"

2. 恢复到指定时间点

使用 TiCDC 恢复到指定时间点

bash
# 创建 TiCDC 恢复任务,恢复到指定时间点
tiup cdc cli changefeed create \
  --server=http://<ticdc-host>:8300 \
  --sink-uri="mysql://<user>:<password>@<tidb-host>:4000/" \
  --changefeed-id="point-in-time-restore" \
  --start-ts=<start-ts> \
  --target-ts=<target-ts> \
  --config=ticdc-restore-config.toml

使用 TiDB Binlog 恢复到指定时间点

bash
# 使用 binlogctl 恢复到指定时间点
tiup binlogctl drainer restore \
  --data-dir="/path/to/backup/incremental" \
  --pd-urls="<pd-host>:2379" \
  --from-db="<source-db>" \
  --to-db="<target-db>" \
  --stop-ts=<target-ts>

增量备份监控与告警

1. 监控指标

  • 备份任务状态:监控 TiCDC 或 TiDB Binlog 任务的运行状态
  • 备份延迟:监控增量备份与实时数据的延迟情况
  • 备份文件大小:监控增量备份文件的大小变化
  • 备份成功率:统计备份任务的成功和失败次数

2. 告警配置

  • 备份任务失败:当备份任务失败时,触发告警
  • 备份延迟过高:当备份延迟超过阈值时,触发告警
  • 备份文件过大:当增量备份文件过大时,触发告警
  • 备份验证失败:当备份验证失败时,触发告警

3. 使用 Prometheus 和 Grafana 监控

TiCDC 和 TiDB Binlog 都提供了 Prometheus 监控指标,可以通过 Grafana 可视化监控:

  • TiCDC 监控指标cdc_changefeed_checkpoint_tscdc_changefeed_processed_events
  • TiDB Binlog 监控指标binlog_pump_event_countbinlog_drainer_event_count

增量备份最佳实践

1. 备份策略最佳实践

  • 结合全量备份:定期进行全量备份,然后使用增量备份补充,形成完整的备份链
  • 分层备份:根据数据的重要性,采用不同的备份频率和保留策略
  • 多副本存储:将增量备份数据存储在多个地理位置,提高数据安全性

2. 性能优化最佳实践

  • 合理配置备份周期:根据数据变化频率,调整备份周期,避免备份过于频繁影响系统性能
  • 调整备份并发度:根据系统负载,调整备份任务的并发度
  • 避开业务高峰:在业务低峰期进行增量备份,减少对业务的影响

3. 安全最佳实践

  • 加密备份数据:对敏感数据的增量备份进行加密存储
  • 访问控制:严格控制备份数据的访问权限,只有授权人员才能访问
  • 审计日志:记录备份数据的访问和操作日志,便于审计

4. 灾难恢复最佳实践

  • 定期恢复测试:定期进行灾难恢复测试,验证增量备份的可恢复性
  • 恢复演练:每年至少进行一次完整的灾难恢复演练,包括全量备份和增量备份的恢复
  • 恢复时间目标(RTO):根据业务需求,制定合理的恢复时间目标,并确保备份策略能够满足该目标

常见问题处理

1. TiCDC 备份任务失败

  • 问题:TiCDC 备份任务失败,状态显示为 failed解决方法:检查 TiCDC 日志,查看具体失败原因,可能的原因包括网络连接问题、存储系统权限问题或配置错误

  • 问题:TiCDC 备份延迟过高 解决方法:增加 TiCDC 节点数量,调整 TiCDC 配置参数,如 worker-countbatch-size

2. TiDB Binlog 备份任务失败

  • 问题:Pump 或 Drainer 组件异常 解决方法:检查组件日志,重启异常组件,或增加组件数量

  • 问题:Binlog 数据丢失 解决方法:检查 TiDB 配置,确保 Binlog 功能正常启用,定期验证 Binlog 数据的完整性

3. 增量备份恢复失败

  • 问题:恢复过程中出现数据冲突 解决方法:检查恢复目标数据库的状态,确保目标数据库为空或与备份数据兼容

  • 问题:恢复时间过长 解决方法:增加恢复任务的并发度,优化目标数据库的配置,或考虑使用并行恢复

常见问题(FAQ)

Q1: TiDB 增量备份支持哪些存储系统?

A1: TiDB 增量备份支持多种存储系统,包括 S3、GCS、HDFS、本地文件系统等,具体支持的存储系统取决于使用的备份工具。

Q2: 如何选择 TiCDC 和 TiDB Binlog 进行增量备份?

A2: 推荐使用 TiCDC 进行增量备份,因为 TiCDC 是 TiDB 4.0 及以上版本的推荐变更数据捕获工具,具有更高的性能和可靠性。TiDB Binlog 已逐渐被 TiCDC 取代,仅建议在旧版本 TiDB 集群中使用。

Q3: 增量备份可以恢复单个表吗?

A3: 是的,TiCDC 和 TiDB Binlog 都支持按表进行增量备份和恢复。在创建备份任务时,可以通过配置指定需要备份的表。

Q4: 如何监控增量备份的延迟情况?

A4: 可以通过 Prometheus 监控 TiCDC 或 TiDB Binlog 的延迟指标,如 cdc_changefeed_checkpoint_tsbinlog_drainer_checkpoint_ts,然后在 Grafana 中创建监控面板。

Q5: 增量备份数据的压缩方式有哪些?

A5: TiCDC 和 TiDB Binlog 都支持对备份数据进行压缩,支持的压缩算法包括 gzip、snappy、lz4 等。可以在配置文件中指定压缩方式。

Q6: 如何处理增量备份中的大事务?

A6: 对于大事务,可以调整备份工具的配置参数,如增加 batch-sizefile-size,以提高大事务的处理能力。同时,建议在业务层面优化大事务,将其拆分为多个小事务。

Q7: 增量备份可以与全量备份自动结合吗?

A7: 是的,可以使用脚本或工具自动管理全量备份和增量备份的结合。例如,可以定期创建全量备份,然后自动创建基于该全量备份的增量备份任务。

Q8: 如何验证增量备份的完整性?

A8: 可以使用备份工具提供的验证命令,或编写脚本验证备份文件的完整性。同时,建议定期进行恢复测试,确保增量备份可以正常恢复。