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

update lightning conflict detection recording view #17648

Merged
merged 15 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 7 additions & 9 deletions tidb-lightning/tidb-lightning-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,8 @@ driver = "file"
# - "":在物理导入模式下,不进行冲突数据检测和处理。如果源文件存在主键或唯一键冲突的记录,后续步骤会报错。在逻辑导入模式下,"" 策略将被转换为 "error" 策略处理。
# - "error":检测到导入的数据存在主键或唯一键冲突的数据时,终止导入并报错。
# - "replace":遇到主键或唯一键冲突的数据时,保留最新的数据,覆盖旧的数据。
# 冲突数据将被记录到目标 TiDB 集群中的 `lightning_task_info.conflict_error_v2` 表(该表用于记录物理导入模式下后置冲突检测到的冲突数据)
# 和 `conflict_records` 表(该表用于记录逻辑导入模式和物理导入模式下前置冲突检测到的冲突数据)中。
# 如果在物理导入模式下配置了 `conflict.strategy = "replace"`,可以在 `lightning_task_info.conflict_view` 视图中查看冲突数据。
# 冲突数据将被记录到目标 TiDB 集群中的 `lightning_task_info.conflict_view` 视图中。
# 在 `lightning_task_info.conflict_view` 视图中,如果某行的 `is_precheck_conflict` 字段为 `0`,表示该行记录的冲突数据是通过后置冲突检测发现的;如果某行的 `is_precheck_conflict` 字段为 `1`,表示该行记录的冲突数据是通过前置冲突检测发现的。
# 你可以根据业务需求选择正确的记录重新手动写入到目标表中。注意,该方法要求目标 TiKV 的版本为 v5.2.0 或更新版本。
# - "ignore":遇到主键或唯一键冲突的数据时,保留旧的数据,忽略新的数据。仅当导入模式为逻辑导入模式时可以使用该选项。
strategy = ""
Expand All @@ -146,14 +145,13 @@ strategy = ""
# 当后端是 “importer” 时,tikv-importer 的监听地址(需改为实际地址)。
addr = "172.16.31.10:8287"

# `duplicate-resolution` 参数从 v8.0.0 开始已被废弃,并将在未来版本中被移除。详情参考 <https://docs.pingcap.com/zh/tidb/dev/tidb-lightning-physical-import-mode-usage#旧版冲突检测从-v800-开始已被废弃>。
# `duplicate-resolution` 参数从 v8.0.0 开始已被废弃,并将在未来版本中被移除。详情参考 <https://docs.pingcap.com/zh/tidb/stable/tidb-lightning-physical-import-mode-usage#旧版冲突检测从-v800-开始已被废弃>。
# 物理导入模式设置是否检测和解决重复的记录(唯一键冲突)。
# 目前支持两种解决方法:
# - none: 不检测重复记录。该模式是两种模式中性能最佳的,但是如果数据源存在重复记录,会导致 TiDB 中出现数据不一致的情况。
# - remove:如果写入的数据 A 和 B 存在 Primary Key 或 Unique Key 冲突,
# 则会将 A 和 B 这两条冲突数据从目标表移除,同时记录到目标 TiDB 中的 `lightning_task_info.conflict_error_v1` 表中。
# 你可以根据业务需求选择正确的记录重新手动写入到目标表中。注意,该方法要求目标 TiKV 的版本为 v5.2.0 或更新版本。
# 如果版本过低,则会启用 'none' 模式。
# - 'none':不检测重复记录。
# 如果数据源存在重复记录,会导致 TiDB 中出现数据不一致的情况。
# 如果 `duplicate-resolution` 设置为 'none' 且 `conflict.strategy` 未设置,TiDB Lightning 会自动将 `conflict.strategy` 赋值为 ""。
# - 'remove':如果 `duplicate-resolution` 设置为 'remove' 且 `conflict.strategy` 未设置,TiDB Lightning 会自动将 `conflict.strategy` 赋值为 "replace" 开启新版冲突检测。
# 默认值为 'none'。
# duplicate-resolution = 'none'
qiancai marked this conversation as resolved.
Show resolved Hide resolved
# 物理导入模式下,向 TiKV 发送数据时一次请求中最大 KV 数量。
Expand Down
28 changes: 20 additions & 8 deletions tidb-lightning/tidb-lightning-error-resolution.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ max-error = 0
task-info-schema-name = 'lightning_task_info'
```

在此数据库中,TiDB Lightning 创建了 3 个表
在此数据库中,TiDB Lightning 创建了 3 个表和 1 个视图

```sql
CREATE TABLE type_error_v1 (
Expand All @@ -94,7 +94,7 @@ CREATE TABLE type_error_v1 (
error text NOT NULL,
row_data text NOT NULL
);
CREATE TABLE conflict_error_v1 (
CREATE TABLE conflict_error_v3 (
task_id bigint NOT NULL,
create_time datetime(6) NOT NULL DEFAULT now(6),
table_name varchar(261) NOT NULL,
Expand All @@ -105,26 +105,38 @@ CREATE TABLE conflict_error_v1 (
raw_value mediumblob NOT NULL,
raw_handle mediumblob NOT NULL,
raw_row mediumblob NOT NULL,
KEY (task_id, table_name)
kv_type tinyint(1) NOT NULL,
INDEX (task_id, table_name),
INDEX (index_name),
INDEX (table_name, index_name),
INDEX (kv_type)
);
CREATE TABLE conflict_records (
task_id bigint NOT NULL,
create_time datetime(6) NOT NULL DEFAULT now(6),
table_name varchar(261) NOT NULL,
path varchar(2048) NOT NULL,
offset bigint NOT NULL,
error text NOT NULL,
row_id bigint NOT NULL COMMENT 'the row id of the conflicted row',
error text NOT NULL,
row_id bigint NOT NULL COMMENT 'the row id of the conflicted row',
row_data text NOT NULL COMMENT 'the row data of the conflicted row',
KEY (task_id, table_name)
);
CREATE VIEW conflict_view AS
SELECT 0 AS is_precheck_conflict, task_id, create_time, table_name, index_name, key_data, row_data, raw_key, raw_value, raw_handle, raw_row, kv_type, NULL AS path, NULL AS offset, NULL AS error, NULL AS row_id
FROM conflict_error_v3
UNION ALL
SELECT 1 AS is_precheck_conflict, task_id, create_time, table_name, NULL AS index_name, NULL AS key_data, row_data, NULL AS raw_key, NULL AS raw_value, NULL AS raw_handle, NULL AS raw_row, NULL AS kv_type, path, offset, error, row_id
FROM conflict_records;
```

`type_error_v1` 记录由 `lightning.max-error` 配置项管理的所有[类型错误 (Type error)](#类型错误-type-error)。每个错误一行。
`type_error_v1` 表记录由 `lightning.max-error` 配置项管理的所有[类型错误 (Type error)](#类型错误-type-error)。每个错误一行。

`conflict_error_v3` 表记录物理导入模式的 `conflict` 配置组的后置检测冲突错误,每对冲突占两行。

`conflict_error_v2` 记录物理导入模式的 `conflict` 配置组的冲突错误,每对冲突占两行
`conflict_records` 表记录逻辑导入模式和物理导入模式 `conflict` 配置组的前置检测冲突错误,每个错误占一行

`conflict_records` 记录逻辑导入模式和物理导入模式 `conflict` 配置组的冲突错误,每个错误占一行
`conflict_view` 视图记录物理导入模式和逻辑导入模式 `conflict` 配置组的前置和后置检测冲突错误,是通过对 `conflict_error_v3` 表和 `conflict_records` 表进行 `UNION` 操作生成的

Oreoxmt marked this conversation as resolved.
Show resolved Hide resolved
| 列名 | 语法 | 类型 | 冲突 | 说明 |
| ------------ | ------ | ---- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------- |
Expand Down
9 changes: 4 additions & 5 deletions tidb-lightning/tidb-lightning-physical-import-mode-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ data-source-dir = "/data/my_database"
# - "":不进行冲突数据检测和处理。如果源文件存在主键或唯一键冲突的记录,后续步骤会报错
# - "error":检测到导入的数据存在主键或唯一键冲突的数据时,终止导入并报错
# - "replace":遇到主键或唯一键冲突的数据时,保留最新的数据,覆盖旧的数据。
# 冲突数据将被记录到目标 TiDB 集群中的 `lightning_task_info.conflict_error_v2` 表(该表用于记录后置冲突检测到的冲突数据)
# 和 `conflict_records` 表(该表用于记录前置冲突检测到的冲突数据)中。
# 如果在物理导入模式下配置了 `conflict.strategy = "replace"`,可以在 `lightning_task_info.conflict_view` 视图中查看冲突数据。
# 冲突数据将被记录到目标 TiDB 集群中的 `lightning_task_info.conflict_view` 视图中。
# 在 `lightning_task_info.conflict_view` 视图中,如果某行的 `is_precheck_conflict` 字段为 `0`,表示该行记录的冲突数据是通过后置冲突检测发现的;如果某行的 `is_precheck_conflict` 字段为 `1`,表示该行记录的冲突数据是通过前置冲突检测发现的。
# 你可以根据业务需求选择正确的记录重新手动写入到目标表中。注意,该方法要求目标 TiKV 的版本为 v5.2.0 或更新版本。
strategy = ""
# 控制是否开启前置冲突检测,即导入数据到 TiDB 前,先检查所需导入的数据是否存在冲突。该参数默认值为 false,表示仅开启后置冲突检测。取值为 true 时,表示同时开启前置冲突检测和后置冲突检测。冲突记录数量高于 1,000,000 的场景建议配置 `precheck-conflict-before-import = true`,可以提升冲突检测的性能,反之建议关闭。
Expand All @@ -50,8 +49,8 @@ strategy = ""
backend = "local"

# 冲突数据处理方式
# `duplicate-resolution` 参数从 v8.0.0 开始已被废弃,并将在未来版本中被移除。详情参考 <https://docs.pingcap.com/zh/tidb/dev/tidb-lightning-physical-import-mode-usage#旧版冲突检测从-v800-开始已被废弃>。
duplicate-resolution = 'remove'
# `duplicate-resolution` 参数从 v8.0.0 开始已被废弃,并将在未来版本中被移除。如果 `duplicate-resolution` 设置为 'none' 且 `conflict.strategy` 未设置,TiDB Lightning 会自动将 `conflict.strategy` 赋值为 ""。如果 `duplicate-resolution` 设置为 'remove' 且 `conflict.strategy` 未设置,TiDB Lightning 会自动将 `conflict.strategy` 赋值为 "replace" 开启新版冲突检测。详情参考 <https://docs.pingcap.com/zh/tidb/stable/tidb-lightning-physical-import-mode-usage#旧版冲突检测从-v800-开始已被废弃>。
qiancai marked this conversation as resolved.
Show resolved Hide resolved
duplicate-resolution = 'none'

# 本地进行 KV 排序的路径。
sorted-kv-dir = "./some-dir"
Expand Down
Loading