From e53fe33ec0400e573551cd79771f7fde363233d6 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Mon, 18 Nov 2024 16:59:25 +0800 Subject: [PATCH 1/5] add rebase --- auto-increment.md | 41 +++++++++++++++++++++++++++++++++++++++++ auto-random.md | 19 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/auto-increment.md b/auto-increment.md index 37fc43cc6bcc..97e0d426c681 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -410,6 +410,47 @@ CREATE TABLE t(a int AUTO_INCREMENT key) AUTO_ID_CACHE 1; 使用 MySQL 兼容模式后,能保证 ID **唯一**、**单调递增**,行为几乎跟 MySQL 完全一致。即使跨 TiDB 实例访问,ID 也不会出现回退。只有在中心化分配自增 ID 服务的“主” TiDB 实例进程退出(如该 TiDB 节点重启)或者异常崩溃时,才有可能造成部分 ID 不连续。这是因为主备切换时,“备” 节点需要丢弃一部分之前的“主” 节点已经分配的 ID,以保证 ID 不出现重复。 +## 手动调整初始值 + +在显式插入自增值时,如果该值大于下一个要分配的自增值,当前 TiDB server 的初始值会自动增长,以保证后续隐式插入不会与该值重复。例如: + +```sql +CREATE TABLE t(id int PRIMARY KEY AUTO_INCREMENT, c int); +Query OK, 0 rows affected (0.53 sec) + +INSERT INTO t(id, c) VALUES(100000, 1); +Query OK, 1 row affected (0.02 sec) + +SHOW CREATE TABLE t; ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Table | Create Table | ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| t | CREATE TABLE `t` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=130001 | ++-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +但是其他 TiDB server 的缓存范围不变,仍有可能出现 `Duplicate Entry` 的错误。所以在再次隐式分配前,需要手动调整初始值。你只需将 `AUTO_INCREMENT` 设置为 0,TiDB 会自动设置初始值为下一个可用范围的初始值。例如: + +```sql +ALTER TABLE t AUTO_INCREMENT=0; +Query OK, 0 rows affected, 1 warning (0.53 sec) + +SHOW WARNINGS; ++---------+------+----------------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+----------------------------------------------------------------------------+ +| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 130001 instead | ++---------+------+----------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +BR、DM、Lightning 在恢复或同步完数据之后,会自动调整 `AUTO_INCREMENT` 值。但 TiCDC 在同步数据之后不会自动调整,因此需要在停止 TiCDC 之后、进行主备切换之前,手动调整下游集群中表的 `AUTO_INCREMENT`。 + ## 使用限制 目前在 TiDB 中使用 `AUTO_INCREMENT` 有以下限制: diff --git a/auto-random.md b/auto-random.md index 034e06e41c80..d54e07dfdb1d 100644 --- a/auto-random.md +++ b/auto-random.md @@ -159,6 +159,25 @@ SHOW WARNINGS; `AUTO_RANDOM` 列隐式分配的值和自增列类似,也遵循 session 变量 [`auto_increment_increment`](/system-variables.md#auto_increment_increment) 和 [`auto_increment_offset`](/system-variables.md#auto_increment_offset) 的控制,其中隐式分配值的自增位 (ID) 满足等式 `(ID - auto_increment_offset) % auto_increment_increment == 0`。 +## 手动调整初始值 + +显式插入 `AUTO_RANDOM` 列的行为与 `AUTO_INCREMENT` 列一致,你也需要手动调整初始值,详细信息请参阅[手动调整初始值](/auto-increment.md#手动调整初始值)。 + +调整初始值时,需要设置表的 `AUTO_RANDOM_BASE` 值: + +```sql +ALTER TABLE t AUTO_RANDOM_BASE=0; +Query OK, 0 rows affected, 1 warning (0.52 sec) + +SHOW WARNINGS; ++---------+------+-----------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+-----------------------------------------------------------------------+ +| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 1 instead | ++---------+------+-----------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + ## 使用限制 目前在 TiDB 中使用 `AUTO_RANDOM` 有以下限制: From b73e54b3e0d9b155a437cdfe6ae9859b2aa3b966 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Mon, 18 Nov 2024 17:37:30 +0800 Subject: [PATCH 2/5] remove section --- auto-increment.md | 43 ++----------------------------------------- auto-random.md | 6 +++--- 2 files changed, 5 insertions(+), 44 deletions(-) diff --git a/auto-increment.md b/auto-increment.md index 97e0d426c681..a32eb3bc4625 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -384,6 +384,8 @@ SELECT * FROM t; 3 rows in set (0.01 sec) ``` +BR、DM、Lightning 在恢复或同步完数据之后,会自动调整 `AUTO_INCREMENT` 值。但 TiCDC 在同步数据之后不会自动调整,因此需要在停止 TiCDC 之后、进行主备切换之前,手动调整下游集群中表的 `AUTO_INCREMENT`。 + ### 自增步长和偏移量设置 从 v3.0.9 和 v4.0.rc-1 开始,和 MySQL 的行为类似,自增列隐式分配的值遵循 session 变量 `@@auto_increment_increment` 和 `@@auto_increment_offset` 的控制,其中自增列隐式分配的值 (ID) 将满足式子 `(ID - auto_increment_offset) % auto_increment_increment == 0`。 @@ -410,47 +412,6 @@ CREATE TABLE t(a int AUTO_INCREMENT key) AUTO_ID_CACHE 1; 使用 MySQL 兼容模式后,能保证 ID **唯一**、**单调递增**,行为几乎跟 MySQL 完全一致。即使跨 TiDB 实例访问,ID 也不会出现回退。只有在中心化分配自增 ID 服务的“主” TiDB 实例进程退出(如该 TiDB 节点重启)或者异常崩溃时,才有可能造成部分 ID 不连续。这是因为主备切换时,“备” 节点需要丢弃一部分之前的“主” 节点已经分配的 ID,以保证 ID 不出现重复。 -## 手动调整初始值 - -在显式插入自增值时,如果该值大于下一个要分配的自增值,当前 TiDB server 的初始值会自动增长,以保证后续隐式插入不会与该值重复。例如: - -```sql -CREATE TABLE t(id int PRIMARY KEY AUTO_INCREMENT, c int); -Query OK, 0 rows affected (0.53 sec) - -INSERT INTO t(id, c) VALUES(100000, 1); -Query OK, 1 row affected (0.02 sec) - -SHOW CREATE TABLE t; -+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Table | Create Table | -+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| t | CREATE TABLE `t` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `c` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */ -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=130001 | -+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -1 row in set (0.00 sec) -``` - -但是其他 TiDB server 的缓存范围不变,仍有可能出现 `Duplicate Entry` 的错误。所以在再次隐式分配前,需要手动调整初始值。你只需将 `AUTO_INCREMENT` 设置为 0,TiDB 会自动设置初始值为下一个可用范围的初始值。例如: - -```sql -ALTER TABLE t AUTO_INCREMENT=0; -Query OK, 0 rows affected, 1 warning (0.53 sec) - -SHOW WARNINGS; -+---------+------+----------------------------------------------------------------------------+ -| Level | Code | Message | -+---------+------+----------------------------------------------------------------------------+ -| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 130001 instead | -+---------+------+----------------------------------------------------------------------------+ -1 row in set (0.00 sec) -``` - -BR、DM、Lightning 在恢复或同步完数据之后,会自动调整 `AUTO_INCREMENT` 值。但 TiCDC 在同步数据之后不会自动调整,因此需要在停止 TiCDC 之后、进行主备切换之前,手动调整下游集群中表的 `AUTO_INCREMENT`。 - ## 使用限制 目前在 TiDB 中使用 `AUTO_INCREMENT` 有以下限制: diff --git a/auto-random.md b/auto-random.md index d54e07dfdb1d..e3b7ee266448 100644 --- a/auto-random.md +++ b/auto-random.md @@ -159,11 +159,11 @@ SHOW WARNINGS; `AUTO_RANDOM` 列隐式分配的值和自增列类似,也遵循 session 变量 [`auto_increment_increment`](/system-variables.md#auto_increment_increment) 和 [`auto_increment_offset`](/system-variables.md#auto_increment_offset) 的控制,其中隐式分配值的自增位 (ID) 满足等式 `(ID - auto_increment_offset) % auto_increment_increment == 0`。 -## 手动调整初始值 +## 清除自增 ID 缓存 -显式插入 `AUTO_RANDOM` 列的行为与 `AUTO_INCREMENT` 列一致,你也需要手动调整初始值,详细信息请参阅[手动调整初始值](/auto-increment.md#手动调整初始值)。 +显式插入 `AUTO_RANDOM` 列的行为与 `AUTO_INCREMENT` 列一致,你也需要清除自增 ID 缓存,详细信息请参阅[清除自增 ID 缓存](/auto-increment.md#清除自增-id-缓存)。 -调整初始值时,需要设置表的 `AUTO_RANDOM_BASE` 值: +你可以执行 `ALTER TABLE` 语句设置 `AUTO_RANDOM_BASE = 0` 来清除集群中所有 TiDB 节点的自增 ID 缓存。例如: ```sql ALTER TABLE t AUTO_RANDOM_BASE=0; From eb555f5ac5714f2bfeb4d890fc125f6f018c7e12 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Mon, 18 Nov 2024 17:39:29 +0800 Subject: [PATCH 3/5] rephrase --- auto-increment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto-increment.md b/auto-increment.md index a32eb3bc4625..eb676f9f54e7 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -384,7 +384,7 @@ SELECT * FROM t; 3 rows in set (0.01 sec) ``` -BR、DM、Lightning 在恢复或同步完数据之后,会自动调整 `AUTO_INCREMENT` 值。但 TiCDC 在同步数据之后不会自动调整,因此需要在停止 TiCDC 之后、进行主备切换之前,手动调整下游集群中表的 `AUTO_INCREMENT`。 +DM、Lightning 在同步完数据之后,会自动清除自增 ID 缓存。但 TiCDC 在同步数据之后不会自动消除,因此需要在停止 TiCDC 之后、进行主备切换之前,手动清除下游集群的自增 ID 缓存。 ### 自增步长和偏移量设置 From c580d4708e156c1a636d619de814506e418acfe2 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Mon, 18 Nov 2024 17:41:03 +0800 Subject: [PATCH 4/5] replace 1 with 101 --- auto-random.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/auto-random.md b/auto-random.md index e3b7ee266448..7cf6af87fe73 100644 --- a/auto-random.md +++ b/auto-random.md @@ -170,11 +170,11 @@ ALTER TABLE t AUTO_RANDOM_BASE=0; Query OK, 0 rows affected, 1 warning (0.52 sec) SHOW WARNINGS; -+---------+------+-----------------------------------------------------------------------+ -| Level | Code | Message | -+---------+------+-----------------------------------------------------------------------+ -| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 1 instead | -+---------+------+-----------------------------------------------------------------------+ ++---------+------+-------------------------------------------------------------------------+ +| Level | Code | Message | ++---------+------+-------------------------------------------------------------------------+ +| Warning | 1105 | Can't reset AUTO_INCREMENT to 0 without FORCE option, using 101 instead | ++---------+------+-------------------------------------------------------------------------+ 1 row in set (0.00 sec) ``` From 51f7e25947018bd19d7c78a3d1773157029865e8 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Fri, 22 Nov 2024 10:49:16 +0800 Subject: [PATCH 5/5] update DM --- auto-increment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto-increment.md b/auto-increment.md index eb676f9f54e7..96ec62eddebd 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -384,7 +384,7 @@ SELECT * FROM t; 3 rows in set (0.01 sec) ``` -DM、Lightning 在同步完数据之后,会自动清除自增 ID 缓存。但 TiCDC 在同步数据之后不会自动消除,因此需要在停止 TiCDC 之后、进行主备切换之前,手动清除下游集群的自增 ID 缓存。 +Lightning 在导入完数据之后,会自动清除自增 ID 缓存。但 DM 和 TiCDC 在增量同步数据之后不会自动清除,因此需要在停止 DM 和 TiCDC 之后、进行主备切换之前,手动清除下游集群的自增 ID 缓存。 ### 自增步长和偏移量设置