Skip to content

Commit

Permalink
add rebase
Browse files Browse the repository at this point in the history
  • Loading branch information
djshow832 committed Nov 18, 2024
1 parent 239a00d commit e53fe33
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
41 changes: 41 additions & 0 deletions auto-increment.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 有以下限制:
Expand Down
19 changes: 19 additions & 0 deletions auto-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 有以下限制:
Expand Down

0 comments on commit e53fe33

Please sign in to comment.