Skip to content

Commit 4ba578a

Browse files
TomShawnti-srebot
authored andcommitted
cherry pick pingcap#4862 to release-3.0
Signed-off-by: ti-srebot <[email protected]>
1 parent c8b1876 commit 4ba578a

6 files changed

+365
-19
lines changed

auto-random.md

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
---
2+
title: AUTO_RANDOM
3+
summary: 本文介绍了 TiDB 的 `AUTO_RANDOM` 列属性。
4+
aliases: ['/docs-cn/dev/auto-random/','/docs-cn/dev/reference/sql/attributes/auto-random/']
5+
---
6+
7+
# AUTO_RANDOM <span class="version-mark">从 v3.1.0 版本开始引入</span>
8+
9+
> **注意:**
10+
>
11+
> `AUTO_RANDOM` 属性已于 v4.0.3 版本成为正式功能。
12+
13+
## 使用场景
14+
15+
`AUTO_RANDOM` 用于解决大批量写数据入 TiDB 时因含有**整型自增主键列**的表而产生的热点问题。详情参阅 [TiDB 高并发写入场景最佳实践](/best-practices/high-concurrency-best-practices.md)
16+
17+
以下面语句建立的表为例:
18+
19+
```sql
20+
CREATE TABLE t (a bigint PRIMARY KEY AUTO_INCREMENT, b varchar(255))
21+
```
22+
23+
在以上语句所建的表上执行大量未指定主键值的 `INSERT` 语句,示例如下:
24+
25+
```sql
26+
INSERT INTO t(b) VALUES ('a'), ('b'), ('c')
27+
```
28+
29+
如以上语句,由于未指定主键列的值(`a` 列),TiDB 会使用连续自增的行值作为行 ID,可能导致单个 TiKV 节点上产生写入热点,进而影响对外提供服务的性能。要避免这种写入热点,可以在执行建表语句时为 `a` 列指定 `AUTO_RANDOM` 属性而不是 `AUTO_INCREMENT` 属性。示例如下:
30+
31+
{{< copyable "sql" >}}
32+
33+
```sql
34+
CREATE TABLE t (a bigint PRIMARY KEY AUTO_RANDOM, b varchar(255))
35+
```
36+
37+
或者
38+
39+
{{< copyable "sql" >}}
40+
41+
```sql
42+
CREATE TABLE t (a bigint AUTO_RANDOM, b varchar(255), PRIMARY KEY (a))
43+
```
44+
45+
此时再执行形如 `INSERT INTO t(b) values...``INSERT` 语句。
46+
47+
+ 隐式分配:如果该 `INSERT` 语句没有指定整型主键列(`a` 列)的值,或者指定为 `NULL`,TiDB 会为该列自动分配值。该值不保证自增,不保证连续,只保证唯一,避免了连续的行 ID 带来的热点问题。
48+
+ 显式插入:如果该 `INSERT` 语句显式指定了整型主键列的值,和 `AUTO_INCREMENT` 属性类似,TiDB 会保存该值。注意,如果未在系统变量 `@@sql_mode` 中设置 `NO_AUTO_VALUE_ON_ZERO`, 即使显式指定整型主键列的值为 `0`,TiDB 也会为该列自动分配值。
49+
50+
> **注意:**
51+
>
52+
> 从 v4.0.3 开始,要使用显式插入的功能,需要将系统变量 `@@allow_auto_random_explicit_insert` 的值设置为 `1`(默认值为 `0`)。默认不支持显式插入的具体原因请参考[使用限制](#使用限制)一节。
53+
54+
自动分配值的计算方式如下:
55+
56+
该行值在二进制形式下,除去符号位的最高五位(称为 shard bits)由当前事务的开始时间决定,剩下的位数按照自增的顺序分配。
57+
58+
若要使用一个不同的 shard bits 的数量,可以在 `AUTO_RANDOM` 后面加一对括号,并在括号中指定想要的 shard bits 数量。示例如下:
59+
60+
{{< copyable "sql" >}}
61+
62+
```sql
63+
CREATE TABLE t (a bigint PRIMARY KEY AUTO_RANDOM(3), b varchar(255))
64+
```
65+
66+
以上建表语句中,shard bits 的数量为 `3`。shard bits 的数量的取值范围是 `[1, field_max_bits)`,其中 `field_max_bits` 为整型主键列类型占用的位长度。
67+
68+
创建完表后,使用 `SHOW WARNINGS` 可以查看当前表可支持的最大隐式分配的次数:
69+
70+
{{< copyable "sql" >}}
71+
72+
```sql
73+
SHOW WARNINGS
74+
```
75+
76+
```sql
77+
+-------+------+----------------------------------------------------------+
78+
| Level | Code | Message |
79+
+-------+------+----------------------------------------------------------+
80+
| Note | 1105 | Available implicit allocation times: 1152921504606846976 |
81+
+-------+------+----------------------------------------------------------+
82+
```
83+
84+
> **注意:**
85+
>
86+
> 为保证可隐式分配的次数最大,从 v4.0.3 开始,`AUTO_RANDOM` 列类型只能为 `BIGINT`
87+
88+
另外,要查看某张含有 `AUTO_RANDOM` 属性的表的 shard bits 数量,可以在系统表 `information_schema.tables``TIDB_ROW_ID_SHARDING_INFO` 一列看到模式为 `PK_AUTO_RANDOM_BITS=x` 的值,其中 `x` 为 shard bits 的数量。
89+
90+
`AUTO RANDOM` 列隐式分配的值会影响 `last_insert_id()`。可以使用 `SELECT last_insert_id()` 获取上一次 TiDB 隐式分配的 ID,例如:
91+
92+
{{< copyable "sql" >}}
93+
94+
```sql
95+
INSERT INTO t (b) VALUES ("b")
96+
SELECT * FROM t;
97+
SELECT last_insert_id()
98+
```
99+
100+
可能得到的结果如下:
101+
102+
```sql
103+
+------------+---+
104+
| a | b |
105+
+------------+---+
106+
| 1073741825 | b |
107+
+------------+---+
108+
109+
+------------------+
110+
| last_insert_id() |
111+
+------------------+
112+
| 1073741825 |
113+
+------------------+
114+
```
115+
116+
## 兼容性
117+
118+
TiDB 支持解析版本注释语法。示例如下:
119+
120+
{{< copyable "sql" >}}
121+
122+
```sql
123+
CREATE TABLE t (a bigint PRIMARY KEY /*T![auto_rand] auto_random */)
124+
```
125+
126+
{{< copyable "sql" >}}
127+
128+
```sql
129+
CREATE TABLE t (a bigint PRIMARY KEY AUTO_RANDOM)
130+
```
131+
132+
以上两个语句含义相同。
133+
134+
`SHOW CREATE TABLE` 的结果中,`AUTO_RANDOM` 属性会被注释掉。注释会附带一个特性标识符,例如 `/*T![auto_rand] auto_random */`。其中 `auto_rand` 表示 `AUTO_RANDOM` 的特性标识符,只有实现了该标识符对应特性的 TiDB 版本才能够正常解析 SQL 语句片段。
135+
136+
该功能支持向前兼容,即降级兼容。没有实现对应特性的 TiDB 版本则会忽略表(带有上述注释)的 `AUTO_RANDOM` 属性,因此能够使用含有该属性的表。
137+
138+
## 使用限制
139+
140+
目前在 TiDB 中使用 `AUTO_RANDOM` 有以下限制:
141+
142+
- 该属性必须指定在整数类型的主键列上,否则会报错。此外,当配置项 `alter-primary-key` 的值为 `true` 时,即使是整型主键列,也不支持使用 `AUTO_RANDOM`
143+
- 不支持使用 `ALTER TABLE` 来修改 `AUTO_RANDOM` 属性,包括添加或移除该属性。
144+
- 不支持修改含有 `AUTO_RANDOM` 属性的主键列的列类型。
145+
- 不支持与 `AUTO_INCREMENT` 同时指定在同一列上。
146+
- 不支持与列的默认值 `DEFAULT` 同时指定在同一列上。
147+
- 插入数据时,不建议自行显式指定含有 `AUTO_RANDOM` 列的值。不恰当地显式赋值,可能会导致该表提前耗尽用于自动分配的数值。
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
---
2+
title: 使用 Dumpling/TiDB Lightning 进行备份与恢复
3+
aliases: ['/docs-cn/dev/backup-and-restore-using-dumpling-lightning/','/docs-cn/dev/export-or-backup-using-dumpling/','/zh/tidb/dev/export-or-backup-using-dumpling']
4+
---
5+
6+
# 使用 Dumpling/TiDB Lightning 进行备份与恢复
7+
8+
本文档将详细介绍如何使用 Dumpling/TiDB Lightning 对 TiDB 进行全量备份与恢复。增量备份和同步可使用 [TiDB Binlog](/tidb-binlog/tidb-binlog-overview.md)
9+
10+
这里假定 TiDB 服务器信息如下:
11+
12+
|服务器名称|服务器地址|端口|用户名|密码|
13+
|----|-------|----|----|--------|
14+
|TiDB|127.0.0.1|4000|root|*|
15+
16+
在这个备份恢复过程中,会用到下面的工具:
17+
18+
- [Dumpling](/dumpling-overview.md):从 TiDB 导出数据
19+
- [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md):导入数据到 TiDB
20+
21+
## Dumpling/TiDB Lightning 全量备份恢复最佳实践
22+
23+
为了快速地备份恢复数据(特别是数据量巨大的库),可以参考以下建议:
24+
25+
* 导出来的数据文件应当尽可能的小,可以通过设置选项 `-F` 来控制导出来的文件大小。如果后续使用 TiDB Lightning 对备份文件进行恢复,建议把 `dumpling` -F 选项的值设置为 `256m`
26+
* 如果导出的表中有些表的行数非常多,可以通过设置选项 `-r` 来开启表内并发。
27+
28+
## 从 TiDB 备份数据
29+
30+
使用 `dumpling` 从 TiDB 备份数据的命令如下:
31+
32+
{{< copyable "shell-regular" >}}
33+
34+
```bash
35+
./bin/dumpling -h 127.0.0.1 -P 4000 -u root -t 32 -F 256m -T test.t1 -T test.t2 -o ./var/test
36+
```
37+
38+
上述命令中,用 `-T test.t1 -T test.t2` 表明只导出 `test`.`t1``test`.`t2` 两张表。更多导出数据筛选方式可以参考[筛选导出的数据](/dumpling-overview.md#筛选导出的数据)
39+
40+
`-t 32` 表明使用 32 个线程来导出数据。`-F 256m` 是将实际的表切分成一定大小的 chunk,这里的 chunk 大小为 256MB。
41+
42+
从 v4.0.0 版本开始,Dumpling 可以自动延长 GC 时间(Dumpling 需要访问 TiDB 集群的 PD 地址),而 v4.0.0 之前的版本,需要手动调整 GC 时间,否则 `dumpling` 备份时可能出现以下报错:
43+
44+
```log
45+
Could not read data from testSchema.testTable: GC life time is shorter than transaction duration, transaction starts at 2019-08-05 21:10:01.451 +0800 CST, GC safe point is 2019-08-05 21:14:53.801 +0800 CST
46+
```
47+
48+
手动调整 GC 时间的步骤如下:
49+
50+
1. 执行 `dumpling` 命令前,查询 TiDB 集群的 [GC](/garbage-collection-overview.md) 值并在 MySQL 客户端执行下列语句将其调整为合适的值:
51+
52+
{{< copyable "sql" >}}
53+
54+
```sql
55+
SELECT * FROM mysql.tidb WHERE VARIABLE_NAME = 'tikv_gc_life_time';
56+
```
57+
58+
```sql
59+
+-----------------------+------------------------------------------------------------------------------------------------+
60+
| VARIABLE_NAME | VARIABLE_VALUE |
61+
+-----------------------+------------------------------------------------------------------------------------------------+
62+
| tikv_gc_life_time | 10m0s |
63+
+-----------------------+------------------------------------------------------------------------------------------------+
64+
1 rows in set (0.02 sec)
65+
```
66+
67+
{{< copyable "sql" >}}
68+
69+
```sql
70+
UPDATE mysql.tidb SET VARIABLE_VALUE = '720h' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
71+
```
72+
73+
2. 执行 `dumpling` 命令后,将 TiDB 集群的 GC 值恢复到第 1 步中的初始值:
74+
75+
{{< copyable "sql" >}}
76+
77+
```sql
78+
UPDATE mysql.tidb SET VARIABLE_VALUE = '10m' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
79+
```
80+
81+
## 向 TiDB 恢复数据
82+
83+
使用 TiDB Lightning 将之前导出的数据导入到 TiDB,完成恢复操作。具体的使用方法见 [TiDB Lightning 使用文档](/tidb-lightning/tidb-lightning-backends.md)

backup-and-restore-using-mydumper-lightning.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ aliases: ['/docs-cn/v3.0/backup-and-restore-using-mydumper-lightning/','/docs-cn
7878
{{< copyable "sql" >}}
7979

8080
```sql
81-
update mysql.tidb set VARIABLE_VALUE = '720h' where VARIABLE_NAME = 'tikv_gc_life_time';
81+
UPDATE mysql.tidb SET VARIABLE_VALUE = '720h' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
8282
```
8383

8484
2. 执行 `mydumper` 命令后,将 TiDB 集群的 GC 值恢复到第 1 步中的初始值:
8585

8686
{{< copyable "sql" >}}
8787

8888
```sql
89-
update mysql.tidb set VARIABLE_VALUE = '10m' where VARIABLE_NAME = 'tikv_gc_life_time';
89+
UPDATE mysql.tidb SET VARIABLE_VALUE = '10m' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
9090
```
9191

9292
## 向 TiDB 恢复数据

basic-sql-operations.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ SHOW DATABASES;
4040
{{< copyable "sql" >}}
4141

4242
```sql
43+
<<<<<<< HEAD
4344
DROP DATABASE samp_db;
45+
=======
46+
USE mysql;
47+
>>>>>>> 43758a91... Capitalize sql keywords in several files (#4862)
4448
```
4549

4650
## 创建、查看和删除表
@@ -106,7 +110,11 @@ DROP TABLE person;
106110
{{< copyable "sql" >}}
107111

108112
```sql
113+
<<<<<<< HEAD
109114
DROP TABLE IF EXISTS person;
115+
=======
116+
SHOW CREATE TABLE person;
117+
>>>>>>> 43758a91... Capitalize sql keywords in several files (#4862)
110118
```
111119

112120
使用 `SHOW TABLES` 语句查看数据库中的所有表。例如:
@@ -156,7 +164,7 @@ ALTER TABLE person ADD UNIQUE person_num (number);
156164
{{< copyable "sql" >}}
157165

158166
```sql
159-
SHOW INDEX from person;
167+
SHOW INDEX FROM person;
160168
```
161169

162170
使用 `ALTER TABLE``DROP INDEX` 语句来删除索引。与 `CREATE INDEX` 语句类似,`DROP INDEX` 也可以嵌入 `ALTER TABLE` 语句。例如:
@@ -232,7 +240,11 @@ DELETE FROM person WHERE number=1;
232240
{{< copyable "sql" >}}
233241

234242
```sql
243+
<<<<<<< HEAD
235244
SELECT * FROM person;
245+
=======
246+
SELECT * FROM person WHERE id<5;
247+
>>>>>>> 43758a91... Capitalize sql keywords in several files (#4862)
236248
```
237249

238250
```

0 commit comments

Comments
 (0)