diff --git a/ticdc/ticdc-faq.md b/ticdc/ticdc-faq.md index 47afa2bcbcfa..2b4d413309b1 100644 --- a/ticdc/ticdc-faq.md +++ b/ticdc/ticdc-faq.md @@ -53,6 +53,111 @@ cdc cli changefeed list --server=http://127.0.0.1:8300 > > 该功能在 TiCDC 4.0.3 版本引入。 +## 上游停止更新后,如何判断 TiCDC 是否已将所有更新同步到下游? + +在上游 TiDB 集群停止更新后,可以通过比较上游 TiDB 集群的最新 [TSO](/glossary.md#tso) 时间戳与 TiCDC 当前的同步进度判断同步是否完成。如果 TiCDC 的同步进度时间大于或等于上游 TiDB 集群的 TSO,则说明 TiCDC 已同步所有更新。具体操作步骤如下: + +1. 获取上游 TiDB 集群的最新 TSO 时间戳。 + + > **注意:** + > + > 请使用 `TIDB_CURRENT_TSO()` 函数获取 TSO,而不是 `NOW()` 等查询当前时间的函数。 + + 以下示例使用 [`TIDB_PARSE_TSO()`](/functions-and-operators/tidb-functions.md#tidb_parse_tso) 将 TSO 转换为可读的时间格式,便于后续比较: + + ```sql + BEGIN; + SELECT TIDB_PARSE_TSO(TIDB_CURRENT_TSO()); + ROLLBACK; + ``` + + 输出结果示例如下: + + ```sql + +------------------------------------+ + | TIDB_PARSE_TSO(TIDB_CURRENT_TSO()) | + +------------------------------------+ + | 2024-11-12 20:35:34.848000 | + +------------------------------------+ + ``` + +2. 获取 TiCDC 当前的同步进度。 + + 你可以通过以下两种方法之一检查当前的同步进度: + + * **方法一**:查询同步任务的 Checkpoint(推荐) + + 使用 [TiCDC 命令行工具](/ticdc/ticdc-manage-changefeed.md) `cdc cli` 查看所有同步任务的 Checkpoint: + + ```shell + cdc cli changefeed list --server=http://127.0.0.1:8300 + ``` + + 输出结果示例如下: + + ```json + [ + { + "id": "syncpoint", + "namespace": "default", + "summary": { + "state": "normal", + "tso": 453880043653562372, + "checkpoint": "2024-11-12 20:36:01.447", + "error": null + } + } + ] + ``` + + 在输出结果中,`"checkpoint": "2024-11-12 20:36:01.447"` 表示 TiCDC 当前的同步进度为 `2024-11-12 20:36:01.447`,即所有在该时间之前的上游 TiDB 变更已同步完成。如果该时间戳大于或等于步骤 1 中获取的上游 TiDB TSO 时间,则表示所有更新已经同步到下游。 + + * **方法二**:查询下游 TiDB 的 Syncpoint 信息 + + 如果下游是 TiDB,并且已启用 [TiCDC Syncpoint 功能](/ticdc/ticdc-upstream-downstream-check.md),可以通过查询下游 TiDB 的 Syncpoint 信息获取同步进度。 + + > **注意:** + > + > Syncpoint 信息的更新间隔由 [`sync-point-interval`](/ticdc/ticdc-upstream-downstream-check.md#启用-syncpoint) 参数控制。如需获取最新同步进度,建议使用方法一。 + + 在下游 TiDB 中执行以下 SQL 语句,获取上游 TSO (`primary_ts`) 和下游 TSO (`secondary_ts`) 信息。 + + ```sql + SELECT * FROM tidb_cdc.syncpoint_v1; + ``` + + 输出结果示例如下: + + ```sql + +------------------+------------+--------------------+--------------------+---------------------+ + | ticdc_cluster_id | changefeed | primary_ts | secondary_ts | created_at | + +------------------+------------+--------------------+--------------------+---------------------+ + | default | syncpoint | 453879870259200000 | 453879870545461257 | 2024-11-12 20:25:01 | + | default | syncpoint | 453879948902400000 | 453879949214351361 | 2024-11-12 20:30:01 | + | default | syncpoint | 453880027545600000 | 453880027751907329 | 2024-11-12 20:35:00 | + +------------------+------------+--------------------+--------------------+---------------------+ + ``` + + 在输出结果中,每一行表示上游 TiDB 在 `primary_ts` 时刻的 snapshot 与下游 TiDB 在 `secondary_ts` 时刻的 snapshot 一致。 + + 要查看同步进度,可以将最新的 `primary_ts` 转换为可读的时间格式: + + ```sql + SELECT TIDB_PARSE_TSO(453880027545600000); + ``` + + 转换结果示例如下: + + ```sql + +------------------------------------+ + | TIDB_PARSE_TSO(453880027545600000) | + +------------------------------------+ + | 2024-11-12 20:35:00 | + +------------------------------------+ + ``` + + 如果 `primary_ts` 对应的时间大于或等于步骤 1 中获取的上游 TiDB 集群的 TSO 时间戳,说明 TiCDC 已经将所有更新同步到下游。 + ## TiCDC 的 `gc-ttl` 是什么? 从 TiDB v4.0.0-rc.1 版本起,PD 支持外部服务设置服务级别 GC safepoint。任何一个服务可以注册更新自己服务的 GC safepoint。PD 会保证任何晚于该 GC safepoint 的 KV 数据不会在 TiKV 中被 GC 清理掉。