Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

br: update restore checkpoint information #18623

Merged
merged 12 commits into from
Oct 21, 2024
2 changes: 1 addition & 1 deletion br/backup-and-restore-storages.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ tiup br restore db --db test -u "${PD_IP}:2379" \
在备份之前,需要为 br 命令行工具访问 Amazon S3 中的备份目录设置相应的访问权限:

- 备份时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:`s3:ListBucket`、`s3:GetObject`、`s3:DeleteObject`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:`s3:ListBucket`、`s3:GetObject`、`s3:DeleteObject` 和 `s3:PutObject`。br 命令行工具会将断点信息写到备份数据目录下的 `./checkpoints` 子目录。在恢复日志备份数据时,br 命令行工具会将备份恢复集群的表 ID 映射关系写到备份数据目录下的 `./pitr_id_maps` 子目录
- 恢复时 TiKV 和 br 命令行工具需要的访问备份数据目录的最小权限:`s3:ListBucket` 和 `s3:GetObject`

如果你还没有创建备份数据保存目录,可以参考[创建存储桶](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-bucket.html)在指定的区域中创建一个 S3 存储桶。如果需要使用文件夹,可以参考[使用文件夹在 Amazon S3 控制台中组织对象](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/user-guide/create-folder.html)在存储桶中创建一个文件夹。

Expand Down
2 changes: 1 addition & 1 deletion br/backup-and-restore-use-cases.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ aliases: ['/docs-cn/dev/br/backup-and-restore-use-cases/','/docs-cn/dev/referenc
2. 配置 br 命令行工具和 TiKV 访问 S3 中的备份目录的权限。本文推荐使用最安全的 IAM 访问方式,配置过程可以参考[控制存储桶访问](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/walkthrough1.html)。权限要求如下:

- 备份集群的 TiKV 和 br 命令行工具需要的 `s3://tidb-pitr-bucket/backup-data` 权限:`s3:ListBucket`、`s3:GetObject`、`s3:DeleteObject`、`s3:PutObject` 和 `s3:AbortMultipartUpload`。
- 恢复集群的 TiKV 和 br 命令行工具需要 `s3://tidb-pitr-bucket/backup-data` 的最小权限:`s3:ListBucket`、`s3:GetObject`、`s3:DeleteObject` 和 `s3:PutObject`。
- 恢复集群的 TiKV 和 br 命令行工具需要 `s3://tidb-pitr-bucket/backup-data` 的最小权限:`s3:ListBucket` 和 `s3:GetObject`。

3. 规划备份数据保存的目录结构,以及快照(全量)备份和日志备份的目录。

Expand Down
22 changes: 22 additions & 0 deletions br/br-checkpoint-restore.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,25 @@ br 工具暂停 GC 的原理是通过执行 `SET config tikv gc.ratio-threshold
### 不要在恢复期间修改集群数据

在恢复失败后,请避免向集群写入或删除数据、删除或创建表。由于备份数据中可能包含重命名表的 DDL 操作,断点恢复无法确认被删除的表或已存在的表是否是外部操作引起的,这会影响下次重试恢复的准确性。

## 实现细节

断点恢复的具体操作细节分为快照恢复和 PITR 恢复两部分。

### 快照恢复

在第一次执行恢复时,br 工具会在恢复集群中创建 `__TiDB_BR_Temporary_Snapshot_Restore_Checkpoint` 数据库,用于存放断点数据,并且 br 工具会记录这次恢复的上游集群 ID 和备份的 BackupTS。
Oreoxmt marked this conversation as resolved.
Show resolved Hide resolved

如果恢复执行失败,你可以使用相同的命令再次执行恢复,br 工具自动从 `__TiDB_BR_Temporary_Snapshot_Restore_Checkpoint` 数据库中读取断点信息,并从上次中断的位置继续恢复。

当恢复执行失败后,如果你尝试使用与断点记录不同的备份数据恢复到同一集群,br 工具会报错,并提示上游集群 ID 或 BackupTS 与断点记录不同。如果恢复集群已被清理,你可以手动删除 `__TiDB_BR_Temporary_Snapshot_Restore_Checkpoint` 数据库,然后使用其他备份重试。
Oreoxmt marked this conversation as resolved.
Show resolved Hide resolved

### PITR 恢复

[PITR (Point-in-time recovery)](/br/br-pitr-guide.md) 恢复分为快照恢复和日志恢复两个阶段。

在第一次执行恢复时,br 工具首先进入快照恢复阶段。该阶段与上述只进行快照恢复操作相同。当 br 工具进入快照恢复阶段,备份数据的上游集群的 ID 和备份数据的 BackupTS(即日志恢复的起始时间点 `start-ts`)已经被记录到断点中。如果在此阶段恢复失败,尝试继续断点恢复时无法再调整快照备份路径(等于日志恢复的起始时间点 `restored-ts`)。
Leavrth marked this conversation as resolved.
Show resolved Hide resolved

qiancai marked this conversation as resolved.
Show resolved Hide resolved
在第一次执行恢复并且进入日志恢复阶段时,br 工具会在恢复集群中创建 `__TiDB_BR_Temporary_Log_Restore_Checkpoint` 数据库,用于存放断点数据,,并且 br 工具会记录这次恢复的上游集群 ID 和恢复的时间范围 `start-ts` 与 `restored-ts`。如果在此阶段恢复失败,你需要指定与断点记录相同的快照备份路径和 `restored-ts` 参数,否则 br 工具会报错,并提示上游集群 ID 或恢复的时间范围与断点记录不同。如果恢复集群已被清理,你可以手动删除 `__TiDB_BR_Temporary_Log_Restore_Checkpoint` 数据库,然后使用其他备份重试。
Leavrth marked this conversation as resolved.
Show resolved Hide resolved

在第一次执行恢复并且进入日志恢复阶段恢复库表数据之前,br 工具会构造出在 `restored-ts` 时间点的上下游集群库表 ID 映射关系,并将其持久化到系统表 `mysql.tidb_pitr_id_map` 中,以避免库表 ID 被重复分配。
Leavrth marked this conversation as resolved.
Show resolved Hide resolved