Skip to content

Commit

Permalink
Update garbage collection docs #4552 (#5856) (#5867)
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-srebot authored Mar 29, 2021
1 parent ee3925b commit 1702a65
Show file tree
Hide file tree
Showing 18 changed files with 124 additions and 239 deletions.
21 changes: 1 addition & 20 deletions alert-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ summary: TiDB 集群中各组件的报警规则详解。

* 处理方法:

1. 执行 `select VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME="tikv_gc_leader_desc"` 来找到 gc leader 对应的 `tidb-server`
1. 执行 `SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME="tikv_gc_leader_desc"` 来找到 gc leader 对应的 `tidb-server`
2. 查看该 `tidb-server` 的日志,grep gc_worker tidb.log;
3. 如果发现这段时间一直在 resolve locks(最后一条日志是 `start resolve locks`)或者 delete ranges(最后一条日志是 `start delete {number} ranges`),说明 GC 进程是正常的。否则需要报备开发人员 [[email protected]](mailto:[email protected]) 进行处理。

Expand Down Expand Up @@ -603,25 +603,6 @@ summary: TiDB 集群中各组件的报警规则详解。

Apply Raft log 线程压力太大,通常是因为写入太猛了。

#### `TiDB_tikvclient_gc_action_fail`(基本不发生,只在特殊配置下才会发生)

* 报警规则:

`sum(increase(tidb_tikvclient_gc_action_result{type="fail”}[1m])) > 10`

> **注意:**
>
> 由于 3.0 中引入了分布式 GC 且 GC 不会在 TiDB 执行,因此 `tidb_tikvclient_gc_action_result` 指标虽然在 3.* 以上版本中存在,但是不会有值。
* 规则描述:

GC 失败的 Region 较多。

* 处理方法:

1. 一般是因为并行 GC 开的太高了,可以适当降低 GC 并行度。你需要先确认 GC 失败是由于服务器繁忙导致的。
2. 通过执行 `update set VARIABLE_VALUE=”{number}” where VARIABLE_NAME=”tikv_gc_concurrency”` 适当降低并行度。

### 警告级别报警项

#### `TiKV_leader_drops`
Expand Down
18 changes: 9 additions & 9 deletions backup-and-restore-using-dumpling-lightning.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,30 +55,30 @@ Could not read data from testSchema.testTable: GC life time is shorter than tran
{{< copyable "sql" >}}

```sql
SELECT * FROM mysql.tidb WHERE VARIABLE_NAME = 'tikv_gc_life_time';
SHOW GLOBAL VARIABLES LIKE 'tidb_gc_life_time';
```

```sql
+-----------------------+------------------------------------------------------------------------------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+-----------------------+------------------------------------------------------------------------------------------------+
| tikv_gc_life_time | 10m0s |
+-----------------------+------------------------------------------------------------------------------------------------+
1 rows in set (0.02 sec)
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| tidb_gc_life_time | 10m0s |
+-------------------+-------+
1 row in set (0.03 sec)
```

{{< copyable "sql" >}}

```sql
UPDATE mysql.tidb SET VARIABLE_VALUE = '720h' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
SET GLOBAL tidb_gc_life_time = '720h';
```

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

{{< copyable "sql" >}}

```sql
UPDATE mysql.tidb SET VARIABLE_VALUE = '10m' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
SET GLOBAL tidb_gc_life_time = '10m';
```

## 向 TiDB 恢复数据
Expand Down
21 changes: 4 additions & 17 deletions br/backup-and-restore-tool.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ summary: 了解 BR 工具是什么、有什么用。

# 备份与恢复工具 BR 简介

[BR](https://github.com/pingcap/br) 全称为 Backup & Restore,是 TiDB **分布式备份恢复**的命令行工具,用于对 TiDB 集群进行数据备份和恢复。**BR 只支持在 TiDB v3.1 及以上版本使用。**
[BR](https://github.com/pingcap/br) 全称为 Backup & Restore,是 TiDB **分布式备份恢复**的命令行工具,用于对 TiDB 集群进行数据备份和恢复。

相比 [`dumpling`](/backup-and-restore-using-dumpling-lightning.md),BR 更适合**大数据量**的场景。

Expand Down Expand Up @@ -49,21 +49,15 @@ SST 文件以 `storeID_regionID_regionEpoch_keyHash_cf` 的格式命名。格式
> **注意:**
>
> - 如果没有挂载网盘或者使用其他共享存储,那么 BR 备份的数据会生成在各个 TiKV 节点上。由于 BR 只备份 leader 副本,所以各个节点预留的空间需要根据 leader size 来预估。
> - 同时由于 v4.0 默认使用 leader count 进行平衡,所以会出现 leader size 差别大的问题,导致各个节点备份数据不均衡。
> - 同时由于 TiDB 默认使用 leader count 进行平衡,所以会出现 leader size 差别大的问题,导致各个节点备份数据不均衡。
### 使用限制

下面是使用 BR 进行备份恢复的几条限制:

- BR 只支持在 TiDB v3.1 及以上版本使用。
- BR 恢复到 TiCDC / Drainer 的上游集群时,恢复数据无法由 TiCDC / Drainer 同步到下游。
- BR 只支持在 `new_collations_enabled_on_first_bootstrap` [开关值](/character-set-and-collation.md#排序规则支持)相同的集群之间进行操作。这是因为 BR 仅备份 KV 数据。如果备份集群和恢复集群采用不同的排序规则,数据校验会不通过。所以恢复集群时,你需要确保 `select VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME='new_collation_enabled';` 语句的开关值查询结果与备份时的查询结果相一致,才可以进行恢复。

- 对于 v3.1 集群,TiDB 尚未支持 new collation,因此可以认为 new collation 未打开
- 对于 v4.0 集群,请通过 `SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME='new_collation_enabled';` 查看 new collation 是否打开。

例如,数据备份在 v3.1 集群。如果恢复到 v4.0 集群中,查询恢复集群的 `new_collation_enabled` 的值为 `true`,则说明创建恢复集群时打开了 new collation 支持的开关。此时恢复数据,可能会出错。

## 兼容性

BR 和 TiDB 集群的兼容性问题分为以下两方面:
Expand Down Expand Up @@ -121,18 +115,11 @@ BR 内置版本会在执行备份和恢复操作前,对 TiDB 集群版本和

#### 通过 SQL 语句

在 v4.0.2 及以上版本的 TiDB 中,支持直接通过 SQL 语句进行备份恢复,具体使用示例见:

- [Backup 语法](/sql-statements/sql-statement-backup.md#backup)
- [Restore 语法](/sql-statements/sql-statement-restore.md#restore)
TiDB 支持使用 SQL 语句 [`BACKUP`](/sql-statements/sql-statement-backup.md#backup)[`RESTORE`](/sql-statements/sql-statement-restore.md#restore) 进行备份恢复。如果要查看备份恢复的进度,你可以使用 [`SHOW BACKUPS|RESTORES`](/sql-statements/sql-statement-show-backups.md) 语句。

#### 通过命令行工具

在 v3.1 以上的 TiDB 版本中,支持通过命令行工具进行备份恢复。

首先需要下载一个 BR 工具的二进制包,详见[下载链接](/download-ecosystem-tools.md#备份和恢复-br-工具)

通过命令行工具进行备份恢复的具体操作见[使用备份与恢复工具 BR](/br/use-br-command-line-tool.md)
TiDB 支持使用 BR 命令行工具进行备份恢复(需[手动下载](/download-ecosystem-tools.md#备份和恢复-br-工具))。关于 BR 命令行工具的具体使用方法,请参阅[使用备份与恢复工具 BR](/br/use-br-command-line-tool.md)

#### 在 Kubernetes 环境下

Expand Down
22 changes: 4 additions & 18 deletions br/backup-and-restore-use-cases.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,26 +77,12 @@ BR 可以直接将命令下发到 TiKV 集群来执行备份和恢复,不依

### 备份前的准备工作

如果你使用的是 TiDB v4.0.8 及以上版本,相应版本的 BR 工具已支持自适应 GC。你只需要将 `backupTS` 注册到 PD 的 `safePoint`,保证 `safePoint` 在备份期间不会向前移动,即可避免手动设置 GC
关于 `br backup` 命令的具体使用方法,参见[使用备份与恢复工具 BR](/br/use-br-command-line-tool.md)

如果你使用的是 TiDB v4.0.7 及以下版本,则需要在 BR 备份前后,按照以下步骤手动设置 GC
运行 `br backup` 命令前,请确保以下条件

1. 运行 [`br backup` 命令](/br/use-br-command-line-tool.md#br-命令行描述)前,查询 TiDB 集群的 [`tikv_gc_life_time`](/garbage-collection-configuration.md#tikv_gc_life_time) 配置项的值,并使用 MySQL 客户端将该项调整至合适的值,确保备份期间不会发生 [Garbage Collection](/garbage-collection-overview.md) (GC)。

{{< copyable "sql" >}}

```sql
SELECT * FROM mysql.tidb WHERE VARIABLE_NAME = 'tikv_gc_life_time';
UPDATE mysql.tidb SET VARIABLE_VALUE = '720h' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
```

2. 在备份完成后,将该参数调回原来的值。

{{< copyable "sql" >}}

```sql
UPDATE mysql.tidb SET VARIABLE_VALUE = '10m' WHERE VARIABLE_NAME = 'tikv_gc_life_time';
```
1. TiDB 集群中没有正在运行中的 DDL。
2. 用于创建备份的存储设备有足够的空间。

### 恢复前的准备工作

Expand Down
13 changes: 0 additions & 13 deletions br/use-br-command-line-tool.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,19 +63,6 @@ BR 由多层命令组成。目前,BR 包含 `backup`、`restore` 和 `version`

使用 `br backup` 命令来备份集群数据。可选择添加 `full``table` 子命令来指定备份的范围:全部集群数据或单张表的数据。

如果 BR 的版本低于 v4.0.8,而且备份时间可能超过设定的 [`tikv_gc_life_time`](/garbage-collection-configuration.md#tikv_gc_life_time)(默认 `10m0s`,即表示 10 分钟),需要手动将该参数调大。

例如,将 `tikv_gc_life_time` 调整为 `720h`

{{< copyable "sql" >}}

```sql
mysql -h${TiDBIP} -P4000 -u${TIDB_USER} ${password_str} -Nse \
"update mysql.tidb set variable_value='720h' where variable_name='tikv_gc_life_time'";
```

自 v4.0.8 起 BR 已经支持自适应 GC,无需手动调整 `tikv_gc_life_time`

### 备份全部集群数据

要备份全部集群数据,可使用 `br backup full` 命令。该命令的使用帮助可以通过 `br backup full -h``br backup full --help` 来获取。
Expand Down
4 changes: 2 additions & 2 deletions dumpling-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,15 +300,15 @@ Dumpling 导出 TiDB 较大单表时,可能会因为导出数据过大导致 T
{{< copyable "sql" >}}

```sql
update mysql.tidb set VARIABLE_VALUE = '720h' where VARIABLE_NAME = 'tikv_gc_life_time';
SET GLOBAL tidb_gc_life_time = '720h';
```

在操作结束之后,再将 GC 时间调回原样(默认是 `10m`):

{{< copyable "sql" >}}

```sql
update mysql.tidb set VARIABLE_VALUE = '10m' where VARIABLE_NAME = 'tikv_gc_life_time';
SET GLOBAL tidb_gc_life_time = '10m';
```

最后,所有的导出数据都可以用 [TiDB Lightning](/tidb-lightning/tidb-lightning-backends.md) 导入回 TiDB。
Expand Down
12 changes: 4 additions & 8 deletions error-codes.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ TiDB 兼容 MySQL 的错误码,在大多数情况下,返回和 MySQL 一样

* Error Number: 8048

设置了不支持的隔离级别,如果是使用第三方工具或框架等无法修改代码进行适配的情况,可以考虑通过 `tidb_skip_isolation_level_check` 来绕过这一检查。
设置了不支持的隔离级别,如果是使用第三方工具或框架等无法修改代码进行适配的情况,可以考虑通过 [`tidb_skip_isolation_level_check`](/system-variables.md#tidb_skip_isolation_level_check) 来绕过这一检查。

{{< copyable "sql" >}}

Expand All @@ -140,13 +140,9 @@ TiDB 兼容 MySQL 的错误码,在大多数情况下,返回和 MySQL 一样

* Error Number: 8055

当前快照过旧,数据可能已经被 GC。可以调大 `tikv_gc_life_time` 的值来避免该问题。新版本的 TiDB 会自动为长时间运行的事务保留数据,一般不会遇到该错误。有关 GC 的介绍和配置可以参考 [GC 机制简介](/garbage-collection-overview.md)和 [GC 配置](/garbage-collection-configuration.md)文档。

{{< copyable "sql" >}}

```sql
update mysql.tidb set VARIABLE_VALUE="24h" where VARIABLE_NAME="tikv_gc_life_time";
```
当前快照过旧,数据可能已经被 GC。可以调大 [`tidb_gc_life_time`](/system-variables.md#tidb_gc_life_time-从-v50-ga-版本开始引入 ) 的值来避免该问题。从 TiDB v4.0.8 版本起, TiDB 会自动为长时间运行的事务保留数据,一般不会遇到该错误。

有关 GC 的介绍和配置可以参考 [GC 机制简介](/garbage-collection-overview.md)和 [GC 配置](/garbage-collection-configuration.md)文档。

* Error Number: 8059

Expand Down
9 changes: 4 additions & 5 deletions faq/migration-tidb-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ TiDB 支持绝大多数 MySQL 语法,一般不需要修改代码。

### 如何导出 TiDB 数据?

TiDB 目前暂时不支持 `select into outfile`,可以通过以下方式导出 TiDB 数据:参考 [MySQL 使用 mysqldump 导出某个表的部分数据](https://blog.csdn.net/xin_yu_xin/article/details/7574662),使用 mysqldump 加 where 条件导出,使用 MySQL client 将 select 的结果输出到一个文件。
你可以通过以下方式导出 TiDB 数据:

- 参考 [MySQL 使用 mysqldump 导出某个表的部分数据](https://blog.csdn.net/xin_yu_xin/article/details/7574662),使用 mysqldump 加 where 条件导出。
- 使用 MySQL client 将 select 的结果输出到一个文件。

### 如何从 DB2、Oracle 数据库迁移到 TiDB?

Expand Down Expand Up @@ -116,7 +119,3 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO

- 目前已开发分布式导入工具 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md),需要注意的是数据导入过程中为了性能考虑,不会执行完整的事务流程,所以没办法保证导入过程中正在导入的数据的 ACID 约束,只能保证整个导入过程结束以后导入数据的 ACID 约束。因此适用场景主要为新数据的导入(比如新的表或者新的索引),或者是全量的备份恢复(先 Truncate 原表再导入)。
- TiDB 的数据加载与磁盘以及整体集群状态相关,加载数据时应关注该主机的磁盘利用率,TiClient Error/Backoff/Thread CPU 等相关 metric,可以分析相应瓶颈。

### 对数据做删除操作之后,空间回收比较慢,如何处理?

可以设置并行 GC,加快对空间的回收速度。默认并发为 1,最大可调整为 tikv 实例数量的 50%。可使用 `update mysql.tidb set VARIABLE_VALUE="3" where VARIABLE_NAME="tikv_gc_concurrency";` 命令来调整。
2 changes: 1 addition & 1 deletion faq/sql-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO

## 对数据做删除操作之后,空间回收比较慢,如何处理?

可以设置并行 GC,加快对空间的回收速度。默认并发为 1,最大可调整为 TiKV 实例数量的 50%。可使用 `update mysql.tidb set VARIABLE_VALUE="3" where VARIABLE_NAME="tikv_gc_concurrency";` 命令来调整
TiDB 采用了多版本并发控制 (MVCC),为了使并发事务能查看到早期版本的数据,删除数据不会立即回收空间,而是推迟一段时间后再进行垃圾回收 (GC)。你可以通过修改系统变量 [`tidb_gc_life_time`](/system-variables.md#tidb_gc_life_time-从-v50-ga-版本开始引入 )的值(默认值为 `10m0s`)配置历史数据的保留时限

## `SHOW PROCESSLIST` 是否显示系统进程号?

Expand Down
4 changes: 2 additions & 2 deletions faq/tidb-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,12 @@ TiKV 操作繁忙,一般出现在数据库负载比较高时,请检查 TiKV

#### 3.1.7 ERROR 9006 (HY000) : GC life time is shorter than transaction duration

`GC Life Time` 间隔时间过短,长事务本应读到的数据可能被清理了,可使用如下命令增加 `GC Life Time`
`GC Life Time` 间隔时间过短,长事务本应读到的数据可能被清理了。你可以使用如下命令修改 [`tidb_gc_life_time`](/system-variables.md#tidb_gc_life_time-从-v50-ga-版本开始引入 ) 的值

{{< copyable "sql" >}}

```sql
update mysql.tidb set variable_value='30m' where variable_name='tikv_gc_life_time';
SET GLOBAL tidb_gc_life_time = '30m';
```

其中 30m 代表仅清理 30 分钟前的数据,这可能会额外占用一定的存储空间。
Expand Down
Loading

0 comments on commit 1702a65

Please sign in to comment.