diff --git a/basic-features.md b/basic-features.md index 921ff29df6d0..1c4a3e9f4ef4 100644 --- a/basic-features.md +++ b/basic-features.md @@ -62,27 +62,47 @@ aliases: ['/zh/tidb/v6.5/experimental-features','/zh/tidb/stable/experimental-fe ## SQL 语句 -| SQL 语句 [^3] | 6.5 | 6.1 | 5.4 | 5.3 | 5.2 | 5.1 | 5.0 | 4.0 | -| --------------------------------------------------------------------------- | :------: | :------: | :------: | :------: | :------: | :------: | :------: | :------: | -| `SELECT`,`INSERT`,`UPDATE`,`DELETE`,`REPLACE` | Y | Y | Y | Y | Y | Y | Y | Y | -| `INSERT ON DUPLICATE KEY UPDATE` | Y | Y | Y | Y | Y | Y | Y | Y | -| `LOAD DATA INFILE` | Y | Y | Y | Y | Y | Y | Y | Y | -| `SELECT INTO OUTFILE` | Y | Y | Y | Y | Y | Y | Y | Y | -| `INNER JOIN`, LEFT\|RIGHT [OUTER] JOIN | Y | Y | Y | Y | Y | Y | Y | Y | -| `UNION`,`UNION ALL` | Y | Y | Y | Y | Y | Y | Y | Y | -| [`EXCEPT` 和 `INTERSECT` 运算符](/functions-and-operators/set-operators.md) | Y | Y | Y | Y | Y | Y | Y | N | -| `GROUP BY`,`ORDER BY` | Y | Y | Y | Y | Y | Y | Y | Y | -| [窗口函数](/functions-and-operators/window-functions.md) | Y | Y | Y | Y | Y | Y | Y | Y | -| [公共表表达式 (CTE)](/sql-statements/sql-statement-with.md) | Y | Y | Y | Y | Y | Y | N | N | -| `START TRANSACTION`,`COMMIT`,`ROLLBACK` | Y | Y | Y | Y | Y | Y | Y | Y | -| [`EXPLAIN`](/sql-statements/sql-statement-explain.md) | Y | Y | Y | Y | Y | Y | Y | Y | -| [`EXPLAIN ANALYZE`](/sql-statements/sql-statement-explain-analyze.md) | Y | Y | Y | Y | Y | Y | Y | Y | -| [用户自定义变量](/user-defined-variables.md) | E | E | E | E | E | E | E | E | -| [`BATCH [ON COLUMN] LIMIT INTEGER DELETE`](/sql-statements/sql-statement-batch.md) | Y | Y | N | N | N | N | N | N | -| [`BATCH [ON COLUMN] LIMIT INTEGER INSERT/UPDATE/REPLACE`](/sql-statements/sql-statement-batch.md) | Y | N | N | N | N | N | N | N | -| [`ALTER TABLE ... COMPACT`](/sql-statements/sql-statement-alter-table-compact.md) | Y | E | N | N | N | N | N | N | -| [表级锁 (Table Lock)](/sql-statements/sql-statement-lock-tables-and-unlock-tables.md) | E | E | E | E | E | E | E | E | -| [物化列式存储的查询结果](/tiflash/tiflash-results-materialization.md) | E | N | N | N | N | N | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| SQL 语句 [^3] | 6.5 | 6.1 | 5.4 | 5.3 | 5.2 | 5.1 | 5.0 | 4.0 | ++===================================================================================================+:===:+:===:+:===:+:===:+:===:+:===:+:===:+:===:+ +| `SELECT`,`INSERT`,`UPDATE`,`DELETE`,`REPLACE` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `INSERT ON DUPLICATE KEY UPDATE` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `LOAD DATA INFILE` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `SELECT INTO OUTFILE` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `INNER JOIN`, `LEFT|RIGHT [OUTER] JOIN` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `UNION`,`UNION ALL` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`EXCEPT` 和 `INTERSECT` 运算符](/functions-and-operators/set-operators.md) | Y | Y | Y | Y | Y | Y | Y | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `GROUP BY`,`ORDER BY` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [窗口函数](/functions-and-operators/window-functions.md) | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [公共表表达式 (CTE)](/sql-statements/sql-statement-with.md) | Y | Y | Y | Y | Y | Y | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| `START TRANSACTION`,`COMMIT`,`ROLLBACK` | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`EXPLAIN`](/sql-statements/sql-statement-explain.md) | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`EXPLAIN ANALYZE`](/sql-statements/sql-statement-explain-analyze.md) | Y | Y | Y | Y | Y | Y | Y | Y | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [用户自定义变量](/user-defined-variables.md) | E | E | E | E | E | E | E | E | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`BATCH [ON COLUMN] LIMIT INTEGER DELETE`](/sql-statements/sql-statement-batch.md) | Y | Y | N | N | N | N | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`BATCH [ON COLUMN] LIMIT INTEGER INSERT/UPDATE/REPLACE`](/sql-statements/sql-statement-batch.md) | Y | N | N | N | N | N | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [`ALTER TABLE ... COMPACT`](/sql-statements/sql-statement-alter-table-compact.md) | Y | E | N | N | N | N | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [表级锁 (Table Lock)](/sql-statements/sql-statement-lock-tables-and-unlock-tables.md) | E | E | E | E | E | E | E | E | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ +| [物化列式存储的查询结果](/tiflash/tiflash-results-materialization.md) | E | N | N | N | N | N | N | N | ++---------------------------------------------------------------------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+ ## 高级 SQL 功能 diff --git a/best-practices/tidb-best-practices.md b/best-practices/tidb-best-practices.md index 887c0068ce19..6e7109c5a418 100644 --- a/best-practices/tidb-best-practices.md +++ b/best-practices/tidb-best-practices.md @@ -1,197 +1,197 @@ ---- -title: TiDB 最佳实践 ---- - -# TiDB 最佳实践 - -本文档总结使用 TiDB 时的一些最佳实践,主要涉及 SQL 使用和 OLAP/OLTP 优化技巧,特别是一些 TiDB 专有的优化开关。 - -建议先阅读讲解 TiDB 原理的三篇文章([讲存储](https://pingcap.com/blog-cn/tidb-internal-1/),[说计算](https://pingcap.com/blog-cn/tidb-internal-2/),[谈调度](https://pingcap.com/blog-cn/tidb-internal-3/)),再来看这篇文章。 - -## 前言 - -数据库是一个通用的基础组件,在开发过程中会考虑到多种目标场景,在具体的业务场景中,需要根据业务的实际情况对数据的参数或者使用方式进行调整。 - -TiDB 是一个兼容 MySQL 协议和语法的分布式数据库,但是由于其内部实现,特别是支持分布式存储以及分布式事务,使得一些使用方法和 MySQL 有所区别。 - -## 基本概念 - -TiDB 的最佳实践与其实现原理密切相关,建议读者先了解一些基本的实现机制,包括 Raft、分布式事务、数据分片、负载均衡、SQL 到 KV 的映射方案、二级索引的实现方法、分布式执行引擎。下面会做一点简单的介绍,更详细的信息可以参考 PingCAP 公众号以及知乎专栏的一些文章。 - -### Raft - -Raft 是一种一致性协议,能提供强一致的数据复制保证,TiDB 最底层用 Raft 来同步数据。每次写入都要写入多数副本,才能对外返回成功,这样即使丢掉少数副本,也能保证系统中还有最新的数据。比如最大 3 副本的话,每次写入 2 副本才算成功,任何时候,只丢失一个副本的情况下,存活的两个副本中至少有一个具有最新的数据。 - -相比 Master-Slave 方式的同步,同样是保存三副本,Raft 的方式更为高效,写入的延迟取决于最快的两个副本,而不是最慢的那个副本。所以使用 Raft 同步的情况下,异地多活成为可能。在典型的两地三中心场景下,每次写入只需要本数据中心以及离得近的一个数据中心写入成功就能保证数据的一致性,而并不需要三个数据中心都写成功。但是这并不意味着在任何场景都能构建跨机房部署的业务,当写入量比较大时候,机房之间的带宽和延迟成为关键因素,如果写入速度超过机房之间的带宽,或者是机房之间延迟过大,整个 Raft 同步机制依然无法很好的运转。 - -### 分布式事务 - -TiDB 提供完整的分布式事务,事务模型是在 [Google Percolator](https://research.google.com/pubs/pub36726.html) 的基础上做了一些优化。具体的实现可以参考[《Percolator 和 TiDB 事务算法》](https://pingcap.com/blog-cn/percolator-and-txn/)这篇文章。本文档只讨论以下几点: - -+ 乐观锁 - - TiDB 的乐观事务模型,只有在真正提交的时候,才会做冲突检测。如果有冲突,则需要重试。这种模型在冲突严重的场景下,会比较低效,因为重试之前的操作都是无效的,需要重复做。举一个比较极端的例子,就是把数据库当做计数器用,如果访问的并发度比较高,那么一定会有严重的冲突,导致大量的重试甚至是超时。但是如果访问冲突并不十分严重,那么乐观锁模型具备较高的效率。在冲突严重的场景下,推荐使用悲观锁,或在系统架构层面解决问题,比如将计数器放在 Redis 中。 - -+ 悲观锁 - - TiDB 的悲观事务模式,悲观事务的行为和 MySQL 基本一致,在执行阶段就会上锁,先到先得,避免冲突情况下的重试,可以保证有较多冲突的事务的成功率。悲观锁同时解决了希望通过 `select for update` 对数据提前锁定的场景。但如果业务场景本身冲突较少,乐观锁的性能会更有优势。 - -+ 事务大小限制 - - 由于分布式事务要做两阶段提交,并且底层还需要做 Raft 复制,如果一个事务非常大,会使得提交过程非常慢,并且会卡住下面的 Raft 复制流程。为了避免系统出现被卡住的情况,我们对事务的大小做了限制: - - - 单个事务包含的 SQL 语句不超过 5000 条(默认) - - 单条 KV entry 不超过 6MB(默认) - - KV entry 的总大小不超过 10G - - 在 Google 的 Cloud Spanner 上面,也有[类似的限制](https://cloud.google.com/spanner/docs/limits)。 - -### 数据分片 - -TiKV 自动将底层数据按照 Key 的 Range 进行分片。每个 Region 是一个 Key 的范围,从 `StartKey` 到 `EndKey` 的左闭右开区间。Region 中的 Key-Value 总量超过一定值,就会自动分裂。这部分用户不需要担心。 - -### 负载均衡 - -PD 会根据整个 TiKV 集群的状态,对集群的负载进行调度。调度是以 Region 为单位,以 PD 配置的策略为调度逻辑,自动完成。 - -### SQL on KV - -TiDB 自动将 SQL 结构映射为 KV 结构。具体的可以参考[《三篇文章了解 TiDB 技术内幕 - 说计算》](https://pingcap.com/blog-cn/tidb-internal-2/)这篇文档。简单来说,TiDB 执行了以下操作: - -+ 一行数据映射为一个 KV,Key 以 `TableID` 构造前缀,以行 ID 为后缀 -+ 一条索引映射为一个 KV,Key 以 `TableID+IndexID` 构造前缀,以索引值构造后缀 - -可以看到,对于一个表中的数据或者索引,会具有相同的前缀,这样在 TiKV 的 Key 空间内,这些 Key-Value 会在相邻的位置。那么当写入量很大,并且集中在一个表上面时,就会造成写入的热点,特别是连续写入的数据中某些索引值也是连续的(比如 update time 这种按时间递增的字段),会在很少的几个 Region 上形成写入热点,成为整个系统的瓶颈。同样,如果所有的数据读取操作也都集中在很小的一个范围内(比如在连续的几万或者十几万行数据上),那么可能造成数据的访问热点。 - -### 二级索引 - -TiDB 支持完整的二级索引,并且是全局索引,很多查询可以通过索引来优化。如果利用好二级索引,对业务非常重要,很多 MySQL 上的经验在 TiDB 这里依然适用,不过 TiDB 还有一些自己的特点,需要注意,这一节主要讨论在 TiDB 上使用二级索引的一些注意事项。 - -+ 二级索引是否越多越好 - - 二级索引能加速查询,但是要注意新增一个索引是有副作用的。上一节介绍了索引的存储模型,那么每增加一个索引,在插入一条数据的时候,就要新增一个 Key-Value,所以索引越多,写入越慢,并且空间占用越大。另外过多的索引也会影响优化器运行时间,并且不合适的索引会误导优化器。所以索引并不是越多越好。 - -+ 对哪些列建索引比较合适 - - 上文提到,索引很重要但不是越多越好,因此需要根据具体的业务特点创建合适的索引。原则上需要对查询中需要用到的列创建索引,目的是提高性能。下面几种情况适合创建索引: - - - 区分度比较大的列,通过索引能显著地减少过滤后的行数 - - 有多个查询条件时,可以选择组合索引,注意需要把等值条件的列放在组合索引的前面 - - 这里举一个例子,假设常用的查询是 `select * from t where c1 = 10 and c2 = 100 and c3 > 10`,那么可以考虑建立组合索引 `Index cidx (c1, c2, c3)`,这样可以用查询条件构造出一个索引前缀进行 Scan。 - -+ 通过索引查询和直接扫描 Table 的区别 - - TiDB 实现了全局索引,所以索引和 Table 中的数据并不一定在一个数据分片上。通过索引查询的时候,需要先扫描索引,得到对应的行 ID,然后通过行 ID 去取数据,所以可能会涉及到两次网络请求,会有一定的性能开销。 - - 如果查询涉及到大量的行,那么扫描索引是并发进行,只要第一批结果已经返回,就可以开始去取 Table 的数据,所以这里是一个并行 + Pipeline 的模式,虽然有两次访问的开销,但是延迟并不会很大。 - - 以下情况不会涉及到两次访问的问题: - - - 索引中的列已经满足了查询需求。比如 Table `t` 上面的列 `c` 有索引,查询是 `select c from t where c > 10;`,这个时候,只需要访问索引,就可以拿到所需要的全部数据。这种情况称之为覆盖索引 (Covering Index)。所以如果很关注查询性能,可以将部分不需要过滤但是需要在查询结果中返回的列放入索引中,构造成组合索引,比如这个例子:`select c1, c2 from t where c1 > 10;`,要优化这个查询可以创建组合索引 `Index c12 (c1, c2)`。 - - 表的 Primary Key 是整数类型。在这种情况下,TiDB 会将 Primary Key 的值当做行 ID,所以如果查询条件是在 PK 上面,那么可以直接构造出行 ID 的范围,直接扫描 Table 数据,获取结果。 - -+ 查询并发度 - - 数据分散在很多 Region 上,所以 TiDB 在做查询的时候会并发进行,默认的并发度比较保守,因为过高的并发度会消耗大量的系统资源,且对于 OLTP 类型的查询,往往不会涉及到大量的数据,较低的并发度已经可以满足需求。对于 OLAP 类型的 Query,往往需要较高的并发度。所以 TiDB 支持通过 System Variable 来调整查询并发度。 - - - [tidb_distsql_scan_concurrency](/system-variables.md#tidb_distsql_scan_concurrency) - - 在进行扫描数据的时候的并发度,这里包括扫描 Table 以及索引数据。 - - - [tidb_index_lookup_size](/system-variables.md#tidb_index_lookup_size) - - 如果是需要访问索引获取行 ID 之后再访问 Table 数据,那么每次会把一批行 ID 作为一次请求去访问 Table 数据,这个参数可以设置 Batch 的大小,较大的 Batch 会使得延迟增加,较小的 Batch 可能会造成更多的查询次数。这个参数的合适大小与查询涉及的数据量有关。一般不需要调整。 - - - [tidb_index_lookup_concurrency](/system-variables.md#tidb_index_lookup_concurrency) - - 如果是需要访问索引获取行 ID 之后再访问 Table 数据,每次通过行 ID 获取数据时候的并发度通过这个参数调节。 - -+ 通过索引保证结果顺序 - - 索引除了可以用来过滤数据之外,还能用来对数据排序,首先按照索引的顺序获取行 ID,然后再按照行 ID 的返回顺序返回行的内容,这样可以保证返回结果按照索引列有序。前面提到了扫索引和获取 Row 之间是并行 + Pipeline 模式,如果要求按照索引的顺序返回 Row,那么这两次查询之间的并发度设置的太高并不会降低延迟,所以默认的并发度比较保守。可以通过 [tidb_index_serial_scan_concurrency](/system-variables.md#tidb_index_serial_scan_concurrency) 变量进行并发度调整。 - -+ 逆序索引 - - 目前 TiDB 支持对索引进行逆序 Scan,目前速度比顺序 Scan 慢一些,通常情况下慢 20%,在数据频繁修改造成版本较多的情况下,会慢的更多。如果可能,建议避免对索引的逆序 Scan。 - -## 场景与实践 - -上一节我们讨论了一些 TiDB 基本的实现机制及其对使用带来的影响,本节我们从具体的使用场景出发,谈一些更为具体的操作实践。我们以从部署到支撑业务这条链路为序,进行讨论。 - -### 部署 - -在部署之前请务必阅读 [TiDB 部署建议以及对硬件的需求](/hardware-and-software-requirements.md)。 - -推荐通过 [TiUP](/production-deployment-using-tiup.md) 部署 TiDB 集群,这个工具可以部署、停止、销毁、升级整个集群,非常方便易用。非常不推荐手动部署,后期的维护和升级会很麻烦。 - -### 导入数据 - -为了提高导入数据期间的写入性能,可以对 TiKV 的参数进行调优,具体的文档查看 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 - -### 写入 - -上面提到了 TiDB 对单个事务的大小有限制,这层限制是在 KV 层面,反映在 SQL 层面的话,简单来说一行数据会映射为一个 KV entry,每多一个索引,也会增加一个 KV entry。 - -> **注意:** -> -> 对事务的大小限制,要考虑 TiDB 做编码以及事务额外 Key 的开销,在使用的时候,**建议每个事务的行数不超过 200 行,且单行数据小于 100k**,否则可能性能不佳。 - -建议无论是 Insert,Update 还是 Delete 语句,都通过分 Batch 或者是加 Limit 的方式限制。 - -在删除大量数据的时候,建议使用 `Delete from t where xx limit 5000;` 这样的方案,通过循环来删除,用 `Affected Rows == 0` 作为循环结束条件。 - -如果一次删除的数据量非常大,这种循环的方式会越来越慢,因为每次删除都是从前向后遍历,前面的删除之后,短时间内会残留不少删除标记(后续会被 GC 清理掉),影响后面的 `Delete` 语句。如果有可能,建议把 `Where` 条件细化。举个例子,假设要删除 2017-05-26 当天的所有数据,那么可以这样做: - -```SQL -for i from 0 to 23: - while affected_rows > 0: - delete from t where insert_time >= i:00:00 and insert_time < (i+1):00:00 limit 5000; - affected_rows = select affected_rows() -``` - -上面是一段伪代码,意思就是要把大块的数据拆成小块删除,以避免删除过程中前面的 Delete 语句影响后面的 Delete 语句。 - -### 查询 - -看业务的查询需求以及具体的语句,可以参考 [TiDB 专用系统变量和语法](/system-variables.md)这篇文档。可以通过 SET 语句控制 SQL 执行的并发度,另外通过 Hint 控制 Join 物理算子选择。 - -另外 MySQL 标准的索引选择 Hint 语法,也可以用,通过 `Use Index/Ignore Index hint` 控制优化器选择索引。 - -如果是个 OLTP 和 OLAP 混合类型的业务,可以把 TP 请求和 AP 请求发送到不同的 tidb-server 上,这样能够减小 AP 业务对于 TP 业务的影响。 承载 AP 业务的 tidb-server 推荐使用高配的机器,比如 CPU 核数比较多,内存比较大。 - -但彻底的隔离 OLTP 和 OLAP,推荐将 OLAP 的业务跑在 TiFlash 上。TiFlash 是列存引擎,在 OLAP 的分析查询场景上,性能极具亮点,TiFlash 可以在存储层上做到物理隔离,并可做到一致性读取。 - -### 监控和日志 - -Metrics 系统是了解系统状态的最佳方法,建议所有的用户都部署监控系统。 - -TiDB [使用 Grafana + Prometheus 监控系统状态](/tidb-monitoring-framework.md)。如果使用 TiUP 部署集群,那么会自动部署和配置监控系统。 - -监控系统中的监控项很多,大部分是给 TiDB 开发者查看的内容,如果没有对源代码比较深入的了解,并没有必要了解这些监控项。我们会精简出一些和业务相关或者是系统关键组件状态相关的监控项,放在一个独立的 `overview` 面板中,供用户使用。 - -除了监控之外,查看日志也是了解系统状态的常用方法。TiDB 的三个组件 tidb-server/tikv-server/pd-server 都有一个 `--log-file` 的参数。如果启动的时候设置了这个参数,那么日志会保存着参数所设置的文件的位置,另外会自动的按天对 Log 文件做归档。如果没有设置 `--log-file` 参数,日志会输出在 `stderr` 中。 - -从 4.0 版本开始,从解决易用性的角度出发,提供了 [TiDB Dashboard](/dashboard/dashboard-intro.md) UI 系统,通过浏览器访问 `http://PD_IP:PD_PORT/dashboard` 即可打开 TiDB Dashboard。TiDB Dashboard 可以提供集群状态、性能分析、流量可视化、SQL 诊断、日志搜索等功能。 - -### 文档 - -了解一个系统或者解决使用中的问题最好的方法是阅读文档,明白实现原理。TiDB 有大量的官方文档,希望大家在遇到问题的时候能先尝试通过文档或者搜索 Issue list 寻找解决方案。官方文档查看 [docs-cn](https://github.com/pingcap/docs-cn)。如果希望阅读英文文档,可以查看 [docs](https://github.com/pingcap/docs)。 - -其中的 [FAQ](/faq/tidb-faq.md) 和[故障诊断](/troubleshoot-tidb-cluster.md)章节建议大家仔细阅读。另外 TiDB 还有一些不错的工具,也有配套的文档,具体的见各项工具的 GitHub 页面。 - -除了文档之外,还有很多不错的文章介绍 TiDB 的各项技术细节内幕,大家可以关注下面这些文章发布渠道: - -+ 公众号:微信搜索 PingCAP -+ 知乎专栏:[TiDB 的后花园](https://zhuanlan.zhihu.com/newsql) -+ [官方博客](https://pingcap.com/blog-cn/) - -## TiDB 的最佳适用场景 - -简单来说,TiDB 适合具备下面这些特点的场景: - -+ 数据量大,单机保存不下 -+ 不希望做 Sharding 或者懒得做 Sharding -+ 访问模式上没有明显的热点 -+ 需要事务、需要强一致、需要灾备 -+ 希望 Real-Time HTAP,减少存储链路 +--- +title: TiDB 最佳实践 +--- + +# TiDB 最佳实践 + +本文档总结使用 TiDB 时的一些最佳实践,主要涉及 SQL 使用和 OLAP/OLTP 优化技巧,特别是一些 TiDB 专有的优化开关。 + +建议先阅读讲解 TiDB 原理的三篇文章([讲存储](https://pingcap.com/blog-cn/tidb-internal-1/),[说计算](https://pingcap.com/blog-cn/tidb-internal-2/),[谈调度](https://pingcap.com/blog-cn/tidb-internal-3/)),再来看这篇文章。 + +## 前言 + +数据库是一个通用的基础组件,在开发过程中会考虑到多种目标场景,在具体的业务场景中,需要根据业务的实际情况对数据的参数或者使用方式进行调整。 + +TiDB 是一个兼容 MySQL 协议和语法的分布式数据库,但是由于其内部实现,特别是支持分布式存储以及分布式事务,使得一些使用方法和 MySQL 有所区别。 + +## 基本概念 + +TiDB 的最佳实践与其实现原理密切相关,建议读者先了解一些基本的实现机制,包括 Raft、分布式事务、数据分片、负载均衡、SQL 到 KV 的映射方案、二级索引的实现方法、分布式执行引擎。下面会做一点简单的介绍,更详细的信息可以参考 PingCAP 公众号以及知乎专栏的一些文章。 + +### Raft + +Raft 是一种一致性协议,能提供强一致的数据复制保证,TiDB 最底层用 Raft 来同步数据。每次写入都要写入多数副本,才能对外返回成功,这样即使丢掉少数副本,也能保证系统中还有最新的数据。比如最大 3 副本的话,每次写入 2 副本才算成功,任何时候,只丢失一个副本的情况下,存活的两个副本中至少有一个具有最新的数据。 + +相比 Master-Slave 方式的同步,同样是保存三副本,Raft 的方式更为高效,写入的延迟取决于最快的两个副本,而不是最慢的那个副本。所以使用 Raft 同步的情况下,异地多活成为可能。在典型的两地三中心场景下,每次写入只需要本数据中心以及离得近的一个数据中心写入成功就能保证数据的一致性,而并不需要三个数据中心都写成功。但是这并不意味着在任何场景都能构建跨机房部署的业务,当写入量比较大时候,机房之间的带宽和延迟成为关键因素,如果写入速度超过机房之间的带宽,或者是机房之间延迟过大,整个 Raft 同步机制依然无法很好的运转。 + +### 分布式事务 + +TiDB 提供完整的分布式事务,事务模型是在 [Google Percolator](https://research.google.com/pubs/pub36726.html) 的基础上做了一些优化。具体的实现可以参考[《Percolator 和 TiDB 事务算法》](https://pingcap.com/blog-cn/percolator-and-txn/)这篇文章。本文档只讨论以下几点: + ++ 乐观锁 + + TiDB 的乐观事务模型,只有在真正提交的时候,才会做冲突检测。如果有冲突,则需要重试。这种模型在冲突严重的场景下,会比较低效,因为重试之前的操作都是无效的,需要重复做。举一个比较极端的例子,就是把数据库当做计数器用,如果访问的并发度比较高,那么一定会有严重的冲突,导致大量的重试甚至是超时。但是如果访问冲突并不十分严重,那么乐观锁模型具备较高的效率。在冲突严重的场景下,推荐使用悲观锁,或在系统架构层面解决问题,比如将计数器放在 Redis 中。 + ++ 悲观锁 + + TiDB 的悲观事务模式,悲观事务的行为和 MySQL 基本一致,在执行阶段就会上锁,先到先得,避免冲突情况下的重试,可以保证有较多冲突的事务的成功率。悲观锁同时解决了希望通过 `select for update` 对数据提前锁定的场景。但如果业务场景本身冲突较少,乐观锁的性能会更有优势。 + ++ 事务大小限制 + + 由于分布式事务要做两阶段提交,并且底层还需要做 Raft 复制,如果一个事务非常大,会使得提交过程非常慢,并且会卡住下面的 Raft 复制流程。为了避免系统出现被卡住的情况,我们对事务的大小做了限制: + + - 单个事务包含的 SQL 语句不超过 5000 条(默认) + - 单条 KV entry 不超过 6MB(默认) + - KV entry 的总大小不超过 10G + + 在 Google 的 Cloud Spanner 上面,也有[类似的限制](https://cloud.google.com/spanner/docs/limits)。 + +### 数据分片 + +TiKV 自动将底层数据按照 Key 的 Range 进行分片。每个 Region 是一个 Key 的范围,从 `StartKey` 到 `EndKey` 的左闭右开区间。Region 中的 Key-Value 总量超过一定值,就会自动分裂。这部分用户不需要担心。 + +### 负载均衡 + +PD 会根据整个 TiKV 集群的状态,对集群的负载进行调度。调度是以 Region 为单位,以 PD 配置的策略为调度逻辑,自动完成。 + +### SQL on KV + +TiDB 自动将 SQL 结构映射为 KV 结构。具体的可以参考[《三篇文章了解 TiDB 技术内幕 - 说计算》](https://pingcap.com/blog-cn/tidb-internal-2/)这篇文档。简单来说,TiDB 执行了以下操作: + ++ 一行数据映射为一个 KV,Key 以 `TableID` 构造前缀,以行 ID 为后缀 ++ 一条索引映射为一个 KV,Key 以 `TableID+IndexID` 构造前缀,以索引值构造后缀 + +可以看到,对于一个表中的数据或者索引,会具有相同的前缀,这样在 TiKV 的 Key 空间内,这些 Key-Value 会在相邻的位置。那么当写入量很大,并且集中在一个表上面时,就会造成写入的热点,特别是连续写入的数据中某些索引值也是连续的(比如 update time 这种按时间递增的字段),会在很少的几个 Region 上形成写入热点,成为整个系统的瓶颈。同样,如果所有的数据读取操作也都集中在很小的一个范围内(比如在连续的几万或者十几万行数据上),那么可能造成数据的访问热点。 + +### 二级索引 + +TiDB 支持完整的二级索引,并且是全局索引,很多查询可以通过索引来优化。如果利用好二级索引,对业务非常重要,很多 MySQL 上的经验在 TiDB 这里依然适用,不过 TiDB 还有一些自己的特点,需要注意,这一节主要讨论在 TiDB 上使用二级索引的一些注意事项。 + ++ 二级索引是否越多越好 + + 二级索引能加速查询,但是要注意新增一个索引是有副作用的。上一节介绍了索引的存储模型,那么每增加一个索引,在插入一条数据的时候,就要新增一个 Key-Value,所以索引越多,写入越慢,并且空间占用越大。另外过多的索引也会影响优化器运行时间,并且不合适的索引会误导优化器。所以索引并不是越多越好。 + ++ 对哪些列建索引比较合适 + + 上文提到,索引很重要但不是越多越好,因此需要根据具体的业务特点创建合适的索引。原则上需要对查询中需要用到的列创建索引,目的是提高性能。下面几种情况适合创建索引: + + - 区分度比较大的列,通过索引能显著地减少过滤后的行数 + - 有多个查询条件时,可以选择组合索引,注意需要把等值条件的列放在组合索引的前面 + + 这里举一个例子,假设常用的查询是 `select * from t where c1 = 10 and c2 = 100 and c3 > 10`,那么可以考虑建立组合索引 `Index cidx (c1, c2, c3)`,这样可以用查询条件构造出一个索引前缀进行 Scan。 + ++ 通过索引查询和直接扫描 Table 的区别 + + TiDB 实现了全局索引,所以索引和 Table 中的数据并不一定在一个数据分片上。通过索引查询的时候,需要先扫描索引,得到对应的行 ID,然后通过行 ID 去取数据,所以可能会涉及到两次网络请求,会有一定的性能开销。 + + 如果查询涉及到大量的行,那么扫描索引是并发进行,只要第一批结果已经返回,就可以开始去取 Table 的数据,所以这里是一个并行 + Pipeline 的模式,虽然有两次访问的开销,但是延迟并不会很大。 + + 以下情况不会涉及到两次访问的问题: + + - 索引中的列已经满足了查询需求。比如 Table `t` 上面的列 `c` 有索引,查询是 `select c from t where c > 10;`,这个时候,只需要访问索引,就可以拿到所需要的全部数据。这种情况称之为覆盖索引 (Covering Index)。所以如果很关注查询性能,可以将部分不需要过滤但是需要在查询结果中返回的列放入索引中,构造成组合索引,比如这个例子:`select c1, c2 from t where c1 > 10;`,要优化这个查询可以创建组合索引 `Index c12 (c1, c2)`。 + - 表的 Primary Key 是整数类型。在这种情况下,TiDB 会将 Primary Key 的值当做行 ID,所以如果查询条件是在 PK 上面,那么可以直接构造出行 ID 的范围,直接扫描 Table 数据,获取结果。 + ++ 查询并发度 + + 数据分散在很多 Region 上,所以 TiDB 在做查询的时候会并发进行,默认的并发度比较保守,因为过高的并发度会消耗大量的系统资源,且对于 OLTP 类型的查询,往往不会涉及到大量的数据,较低的并发度已经可以满足需求。对于 OLAP 类型的 Query,往往需要较高的并发度。所以 TiDB 支持通过 System Variable 来调整查询并发度。 + + - [tidb_distsql_scan_concurrency](/system-variables.md#tidb_distsql_scan_concurrency) + + 在进行扫描数据的时候的并发度,这里包括扫描 Table 以及索引数据。 + + - [tidb_index_lookup_size](/system-variables.md#tidb_index_lookup_size) + + 如果是需要访问索引获取行 ID 之后再访问 Table 数据,那么每次会把一批行 ID 作为一次请求去访问 Table 数据,这个参数可以设置 Batch 的大小,较大的 Batch 会使得延迟增加,较小的 Batch 可能会造成更多的查询次数。这个参数的合适大小与查询涉及的数据量有关。一般不需要调整。 + + - [tidb_index_lookup_concurrency](/system-variables.md#tidb_index_lookup_concurrency) + + 如果是需要访问索引获取行 ID 之后再访问 Table 数据,每次通过行 ID 获取数据时候的并发度通过这个参数调节。 + ++ 通过索引保证结果顺序 + + 索引除了可以用来过滤数据之外,还能用来对数据排序,首先按照索引的顺序获取行 ID,然后再按照行 ID 的返回顺序返回行的内容,这样可以保证返回结果按照索引列有序。前面提到了扫索引和获取 Row 之间是并行 + Pipeline 模式,如果要求按照索引的顺序返回 Row,那么这两次查询之间的并发度设置的太高并不会降低延迟,所以默认的并发度比较保守。可以通过 [tidb_index_serial_scan_concurrency](/system-variables.md#tidb_index_serial_scan_concurrency) 变量进行并发度调整。 + ++ 逆序索引 + + 目前 TiDB 支持对索引进行逆序 Scan,目前速度比顺序 Scan 慢一些,通常情况下慢 20%,在数据频繁修改造成版本较多的情况下,会慢的更多。如果可能,建议避免对索引的逆序 Scan。 + +## 场景与实践 + +上一节我们讨论了一些 TiDB 基本的实现机制及其对使用带来的影响,本节我们从具体的使用场景出发,谈一些更为具体的操作实践。我们以从部署到支撑业务这条链路为序,进行讨论。 + +### 部署 + +在部署之前请务必阅读 [TiDB 部署建议以及对硬件的需求](/hardware-and-software-requirements.md)。 + +推荐通过 [TiUP](/production-deployment-using-tiup.md) 部署 TiDB 集群,这个工具可以部署、停止、销毁、升级整个集群,非常方便易用。非常不推荐手动部署,后期的维护和升级会很麻烦。 + +### 导入数据 + +为了提高导入数据期间的写入性能,可以对 TiKV 的参数进行调优,具体的文档查看 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 + +### 写入 + +上面提到了 TiDB 对单个事务的大小有限制,这层限制是在 KV 层面,反映在 SQL 层面的话,简单来说一行数据会映射为一个 KV entry,每多一个索引,也会增加一个 KV entry。 + +> **注意:** +> +> 对事务的大小限制,要考虑 TiDB 做编码以及事务额外 Key 的开销,在使用的时候,**建议每个事务的行数不超过 200 行,且单行数据小于 100k**,否则可能性能不佳。 + +建议无论是 Insert,Update 还是 Delete 语句,都通过分 Batch 或者是加 Limit 的方式限制。 + +在删除大量数据的时候,建议使用 `Delete from t where xx limit 5000;` 这样的方案,通过循环来删除,用 `Affected Rows == 0` 作为循环结束条件。 + +如果一次删除的数据量非常大,这种循环的方式会越来越慢,因为每次删除都是从前向后遍历,前面的删除之后,短时间内会残留不少删除标记(后续会被 GC 清理掉),影响后面的 `Delete` 语句。如果有可能,建议把 `Where` 条件细化。举个例子,假设要删除 2017-05-26 当天的所有数据,那么可以这样做: + +```SQL +for i from 0 to 23: + while affected_rows > 0: + delete from t where insert_time >= i:00:00 and insert_time < (i+1):00:00 limit 5000; + affected_rows = select affected_rows() +``` + +上面是一段伪代码,意思就是要把大块的数据拆成小块删除,以避免删除过程中前面的 Delete 语句影响后面的 Delete 语句。 + +### 查询 + +看业务的查询需求以及具体的语句,可以参考 [TiDB 专用系统变量和语法](/system-variables.md)这篇文档。可以通过 SET 语句控制 SQL 执行的并发度,另外通过 Hint 控制 Join 物理算子选择。 + +另外 MySQL 标准的索引选择 Hint 语法,也可以用,通过 `Use Index/Ignore Index hint` 控制优化器选择索引。 + +如果是个 OLTP 和 OLAP 混合类型的业务,可以把 TP 请求和 AP 请求发送到不同的 tidb-server 上,这样能够减小 AP 业务对于 TP 业务的影响。 承载 AP 业务的 tidb-server 推荐使用高配的机器,比如 CPU 核数比较多,内存比较大。 + +但彻底的隔离 OLTP 和 OLAP,推荐将 OLAP 的业务跑在 TiFlash 上。TiFlash 是列存引擎,在 OLAP 的分析查询场景上,性能极具亮点,TiFlash 可以在存储层上做到物理隔离,并可做到一致性读取。 + +### 监控和日志 + +Metrics 系统是了解系统状态的最佳方法,建议所有的用户都部署监控系统。 + +TiDB [使用 Grafana + Prometheus 监控系统状态](/tidb-monitoring-framework.md)。如果使用 TiUP 部署集群,那么会自动部署和配置监控系统。 + +监控系统中的监控项很多,大部分是给 TiDB 开发者查看的内容,如果没有对源代码比较深入的了解,并没有必要了解这些监控项。我们会精简出一些和业务相关或者是系统关键组件状态相关的监控项,放在一个独立的 `overview` 面板中,供用户使用。 + +除了监控之外,查看日志也是了解系统状态的常用方法。TiDB 的三个组件 tidb-server/tikv-server/pd-server 都有一个 `--log-file` 的参数。如果启动的时候设置了这个参数,那么日志会保存着参数所设置的文件的位置,另外会自动的按天对 Log 文件做归档。如果没有设置 `--log-file` 参数,日志会输出在 `stderr` 中。 + +从 4.0 版本开始,从解决易用性的角度出发,提供了 [TiDB Dashboard](/dashboard/dashboard-intro.md) UI 系统,通过浏览器访问 `http://PD_IP:PD_PORT/dashboard` 即可打开 TiDB Dashboard。TiDB Dashboard 可以提供集群状态、性能分析、流量可视化、SQL 诊断、日志搜索等功能。 + +### 文档 + +了解一个系统或者解决使用中的问题最好的方法是阅读文档,明白实现原理。TiDB 有大量的官方文档,希望大家在遇到问题的时候能先尝试通过文档或者搜索 Issue list 寻找解决方案。官方文档查看 [docs-cn](https://github.com/pingcap/docs-cn)。如果希望阅读英文文档,可以查看 [docs](https://github.com/pingcap/docs)。 + +其中的 [FAQ](/faq/tidb-faq.md) 和[故障诊断](/troubleshoot-tidb-cluster.md)章节建议大家仔细阅读。另外 TiDB 还有一些不错的工具,也有配套的文档,具体的见各项工具的 GitHub 页面。 + +除了文档之外,还有很多不错的文章介绍 TiDB 的各项技术细节内幕,大家可以关注下面这些文章发布渠道: + ++ 公众号:微信搜索 PingCAP ++ 知乎专栏:[TiDB 的后花园](https://zhuanlan.zhihu.com/newsql) ++ [官方博客](https://pingcap.com/blog-cn/) + +## TiDB 的最佳适用场景 + +简单来说,TiDB 适合具备下面这些特点的场景: + ++ 数据量大,单机保存不下 ++ 不希望做 Sharding 或者懒得做 Sharding ++ 访问模式上没有明显的热点 ++ 需要事务、需要强一致、需要灾备 ++ 希望 Real-Time HTAP,减少存储链路 diff --git a/br/br-monitoring-and-alert.md b/br/br-monitoring-and-alert.md index 3e41b783c523..c7c2392f644d 100644 --- a/br/br-monitoring-and-alert.md +++ b/br/br-monitoring-and-alert.md @@ -25,30 +25,66 @@ summary: 了解备份恢复的监控告警。 ### 监控指标 -| 指标 | 类型 | 说明 | -|-------------------------------------------------------|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------| -| **tikv_log_backup_interal_actor_acting_duration_sec** | Histogram | 处理内部各种消息事件的耗时。
`message :: TaskType` | -| **tikv_log_backup_initial_scan_reason** | Counter | 触发增量扫的原因统计。主要是 Leader 迁移或者 Region Version 变更。
`reason :: {"leader-changed", "region-changed", "retry"}` | -| **tikv_log_backup_event_handle_duration_sec** | Histogram | 处理 KV Event 的耗时。和 `tikv_log_backup_on_event_duration_seconds` 相比,这个指标还包含了一些内部转化消耗的时间。
`stage :: {"to_stream_event", "save_to_temp_file"}` | -| **tikv_log_backup_handle_kv_batch** | Histogram | 由 RaftStore 发送的 KV 对的 Batch 大小统计,统计数据为 Region 级别。 | -| **tikv_log_backup_initial_scan_disk_read** | Counter | 增量扫期间,从硬盘读取的数据量的大小。在 Linux 系统下,这个信息来自于 procfs,是实际从 block device 读取的数据量的大小;配置项 `initial-scan-rate-limit` 也是施加于这个数值上。 | -| **tikv_log_backup_incremental_scan_bytes** | Histogram | 增量扫期间,实际产生的 KV 对的大小。因为压缩和读放大的缘故,这个数值和 `tikv_log_backup_initial_scan_disk_read` 不一定相同。 | -| **tikv_log_backup_skip_kv_count** | Counter | 日志备份期间,因为对备份没有帮助而被跳过的 Raft Event 数量。 | -| **tikv_log_backup_errors** | Counter | 日志备份期间,遇到的可以重试或可以忽略的错误。
`type :: ErrorType` | -| **tikv_log_backup_fatal_errors** | Counter | 日志备份期间,遇到的不可重试或不可忽略的错误。当该类错误出现的时候,日志备份任务会被暂停。
`type :: ErrorType` | -| **tikv_log_backup_heap_memory** | Gauge | 日志备份期间,增量扫发现的、尚未被消费的事件占用的内存。 | -| **tikv_log_backup_on_event_duration_seconds** | Histogram | 将 KV Event 保存到临时文件各个阶段的耗时。
`stage :: {"write_to_tempfile", "syscall_write"}` | -| **tikv_log_backup_store_checkpoint_ts** | Gauge | Store 级别的 Checkpoint TS,已经弃用。其含义更加接近于 Store 当前注册的 GC Safepoint。
`task :: string` | -| **tidb_log_backup_last_checkpoint** | Gauge | 全局 Checkpoint TS,表示日志备份功能中已经备份的时间点。
`task :: string` | -| **tikv_log_backup_flush_duration_sec** | Histogram | 将本地临时文件移动到外部存储的耗时。
`stage :: {"generate_metadata", "save_files", "clear_temp_files"}` | -| **tikv_log_backup_flush_file_size** | Histogram | 备份产生的文件的大小统计。 | -| **tikv_log_backup_initial_scan_duration_sec** | Histogram | 增量扫的整体耗时统计。 | -| **tikv_log_backup_skip_retry_observe** | Counter | 在日志备份过程中,遇到的可忽略错误的统计,即放弃 retry 的原因。
`reason :: {"region-absent", "not-leader", "stale-command"}` | -| **tikv_log_backup_initial_scan_operations** | Counter | 增量扫过程中,RocksDB 相关的操作统计。
`cf :: {"default", "write", "lock"}, op :: RocksDBOP` | -| **tikv_log_backup_enabled** | Counter | 日志备份功能是否开启,若值大于 0,表示开启 | -| **tikv_log_backup_observed_region** | Gauge | 被监听的 Region 数量 | -| **tikv_log_backup_task_status** | Gauge | 日志备份任务状态,0-Running 1-Paused 2-Error
`task :: string` | -| **tikv_log_backup_pending_initial_scan** | Gauge | 尚未执行的增量扫的统计。
`stage :: {"queuing", "executing"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 指标 | 类型 | 说明 | ++=======================================================+=======================+=================================================================================================================================================================================+ +| **tikv_log_backup_interal_actor_acting_duration_sec** | Histogram | 处理内部各种消息事件的耗时。 | +| | | `message :: TaskType` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_initial_scan_reason** | Counter | 触发增量扫的原因统计。主要是 Leader 迁移或者 Region Version 变更。 | +| | | `reason :: {"leader-changed", "region-changed", "retry"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_event_handle_duration_sec** | Histogram | 处理 KV Event 的耗时。和 `tikv_log_backup_on_event_duration_seconds` 相比,这个指标还包含了一些内部转化消耗的时间。 | +| | | `stage :: {"to_stream_event", "save_to_temp_file"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_handle_kv_batch** | Histogram | 由 RaftStore 发送的 KV 对的 Batch 大小统计,统计数据为 Region 级别。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_initial_scan_disk_read** | Counter | 增量扫期间,从硬盘读取的数据量的大小。在 Linux 系统下,这个信息来自于 procfs,是实际从 block device 读取的数据量的大小;配置项 `initial-scan-rate-limit` 也是施加于这个数值上。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_incremental_scan_bytes** | Histogram | 增量扫期间,实际产生的 KV 对的大小。因为压缩和读放大的缘故,这个数值和 `tikv_log_backup_initial_scan_disk_read` 不一定相同。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_skip_kv_count** | Counter | 日志备份期间,因为对备份没有帮助而被跳过的 Raft Event 数量。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_errors** | Counter | 日志备份期间,遇到的可以重试或可以忽略的错误。 | +| | | `type :: ErrorType` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_fatal_errors** | Counter | 日志备份期间,遇到的不可重试或不可忽略的错误。当该类错误出现的时候,日志备份任务会被暂停。 | +| | | `type :: ErrorType` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_heap_memory** | Gauge | 日志备份期间,增量扫发现的、尚未被消费的事件占用的内存。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_on_event_duration_seconds** | Histogram | 将 KV Event 保存到临时文件各个阶段的耗时。 | +| | | `stage :: {"write_to_tempfile", "syscall_write"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_store_checkpoint_ts** | Gauge | Store 级别的 Checkpoint TS,已经弃用。其含义更加接近于 Store 当前注册的 GC Safepoint。 | +| | | `task :: string` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tidb_log_backup_last_checkpoint** | Gauge | 全局 Checkpoint TS,表示日志备份功能中已经备份的时间点。 | +| | | `task :: string` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_flush_duration_sec** | Histogram | 将本地临时文件移动到外部存储的耗时。 | +| | | `stage :: {"generate_metadata", "save_files", "clear_temp_files"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_flush_file_size** | Histogram | 备份产生的文件的大小统计。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_initial_scan_duration_sec** | Histogram | 增量扫的整体耗时统计。 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_skip_retry_observe** | Counter | 在日志备份过程中,遇到的可忽略错误的统计,即放弃 retry 的原因。 | +| | | `reason :: {"region-absent", "not-leader", "stale-command"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_initial_scan_operations** | Counter | 增量扫过程中,RocksDB 相关的操作统计。 | +| | | `cf :: {"default", "write", "lock"}, op :: RocksDBOP` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_enabled** | Counter | 日志备份功能是否开启,若值大于 0,表示开启 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_observed_region** | Gauge | 被监听的 Region 数量 | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_task_status** | Gauge | 日志备份任务状态,0-Running 1-Paused 2-Error | +| | | `task :: string` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **tikv_log_backup_pending_initial_scan** | Gauge | 尚未执行的增量扫的统计。 | +| | | `stage :: {"queuing", "executing"}` | ++-------------------------------------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ### 日志备份告警 diff --git a/character-set-gbk.md b/character-set-gbk.md index 57017167bafa..677287c70800 100644 --- a/character-set-gbk.md +++ b/character-set-gbk.md @@ -66,10 +66,21 @@ SHOW COLLATION WHERE CHARSET = 'gbk'; 例如,当 `SET NAMES gbk` 时,如果分别在 MySQL 和 TiDB 上通过 `CREATE TABLE gbk_table(a VARCHAR(32) CHARACTER SET gbk)` 语句建表,然后按照下表中的 SQL 语句进行操作,就能看到具体的区别。 -| 数据库 | 如果设置的 SQL 模式包含 `STRICT_ALL_TABLES` 或 `STRICT_TRANS_TABLES` | 如果设置的 SQL 模式不包含 `STRICT_ALL_TABLES` 和 `STRICT_TRANS_TABLES` | -|-------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| -| MySQL | `SELECT HEX('一a');`
`e4b88061`

`INSERT INTO gbk_table values('一a');`
`Incorrect Error` | `SELECT HEX('一a');`
`e4b88061`

`INSERT INTO gbk_table VALUES('一a');`
`SELECT HEX(a) FROM gbk_table;`
`e4b8` | -| TiDB | `SELECT HEX('一a');`
`Incorrect Error`

`INSERT INTO gbk_table VALUES('一a');`
`Incorrect Error` | `SELECT HEX('一a');`
`e4b83f`

`INSERT INTO gbk_table VALUES('一a');`
`SELECT HEX(a) FROM gbk_table;`
`e4b83f` | ++-----------------------+----------------------------------------------------------------------+------------------------------------------------------------------------+ +| 数据库 | 如果设置的 SQL 模式包含 `STRICT_ALL_TABLES` 或 `STRICT_TRANS_TABLES` | 如果设置的 SQL 模式不包含 `STRICT_ALL_TABLES` 和 `STRICT_TRANS_TABLES` | ++=======================+======================================================================+========================================================================+ +| MySQL | `SELECT HEX('一a');` | `SELECT HEX('一a');` | +| | `e4b88061` | `e4b88061` | +| | `INSERT INTO gbk_table values('一a');` | `INSERT INTO gbk_table VALUES('一a');` | +| | `Incorrect Error` | `SELECT HEX(a) FROM gbk_table;` | +| | | `e4b8` | ++-----------------------+----------------------------------------------------------------------+------------------------------------------------------------------------+ +| TiDB | `SELECT HEX('一a');` | `SELECT HEX('一a');` | +| | `Incorrect Error` | `e4b83f` | +| | `INSERT INTO gbk_table VALUES('一a');` | `INSERT INTO gbk_table VALUES('一a');` | +| | `Incorrect Error` | `SELECT HEX(a) FROM gbk_table;` | +| | | `e4b83f` | ++-----------------------+----------------------------------------------------------------------+------------------------------------------------------------------------+ 说明:该表中 `SELECT HEX('一a');` 在 `utf8mb4` 字节集下的结果为 `e4b88061`。 diff --git a/clinic/clinic-collect-sql-query-plan.md b/clinic/clinic-collect-sql-query-plan.md index cc095633c149..4a7aa34d8c31 100644 --- a/clinic/clinic-collect-sql-query-plan.md +++ b/clinic/clinic-collect-sql-query-plan.md @@ -77,15 +77,26 @@ SELECT * FROM test.t1;SELECT * FROM test.t2; 全量数据采集的输出结果包含以下集群现场信息: -| 序号 | 采集内容 | 调用的 Diag collector | 输出文件 | -| :--- | :--- | :--- | :--- | -| 1 | TiDB 配置信息 | `config` | `tidb.toml` | -| 2 | TiDB Session 系统变量 | `plan_replayer` | `plan_replayer.zip/variables.toml` | -| 3 | TiDB 执行计划绑定信息 (SQL Binding) | `sql_bind` | `sql_bind/global_bind.csv` | -| 4 | `sql-statement` 中所包含的表结构 | `plan_replayer` | `plan_replayer.zip/schema/.schema.txt` | -| 5 | `sql-statement` 中所包含表的统计信息 | `plan_replayer` | `plan_replayer.zip/stats/.json` | -| 6 | `EXPLAIN sql-statement` 的结果 | `explain` | `explain/sql0` | -| 7 | 默认采集的集群信息 | default | `cluster.json`,`meta.yaml`,`$collectid_diag_audit.log` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 序号 | 采集内容 | 调用的 Diag collector | 输出文件 | ++:================+:=====================================+:======================+:=========================================================+ +| 1 | TiDB 配置信息 | `config` | `tidb.toml` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 2 | TiDB Session 系统变量 | `plan_replayer` | `plan_replayer.zip/variables.toml` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 3 | TiDB 执行计划绑定信息 (SQL Binding) | `sql_bind` | `sql_bind/global_bind.csv` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 4 | `sql-statement` 中所包含的表结构 | `plan_replayer` | `plan_replayer.zip/schema/.schema.txt` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 5 | `sql-statement` 中所包含表的统计信息 | `plan_replayer` | `plan_replayer.zip/stats/.json` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 6 | `EXPLAIN sql-statement` 的结果 | `explain` | `explain/sql0` | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ +| 7 | 默认采集的集群信息 | default | `cluster.json`,`meta.yaml`,`$collectid_diag_audit.log` | +| | | | | +| | - 集群基础信息 | | | +| | - Diag 本次采集记录 | | | ++-----------------+--------------------------------------+-----------------------+----------------------------------------------------------+ ### 自定义数据采集 diff --git a/develop/dev-guide-connect-to-tidb.md b/develop/dev-guide-connect-to-tidb.md index 4d71c844ad2f..74fed736cb4f 100644 --- a/develop/dev-guide-connect-to-tidb.md +++ b/develop/dev-guide-connect-to-tidb.md @@ -58,13 +58,19 @@ mysqlDataSource.setURL("jdbc:mysql://{host}:{port}/{database}?user={username}&pa **连接参数** -| 参数名 | 描述 | -| :----------: | :------------------------------------------------------------------------------------------------: | -| `{username}` | 需要连接到 TiDB 集群的 [SQL 用户](/user-account-management.md) | -| `{password}` | 需要连接到 TiDB 集群的 SQL 用户的密码 | -| `{host}` | TiDB 节点运行的 [Host]() | -| `{port}` | TiDB 节点正在监听的端口 | -| `{database}` | (已经存在的)数据库的名称 | ++--------------+----------------------------------------------------------------------+ +| 参数名 | 描述 | ++:============:+:====================================================================:+ +| `{username}` | 需要连接到 TiDB 集群的 [SQL 用户](/user-account-management.md) | ++--------------+----------------------------------------------------------------------+ +| `{password}` | 需要连接到 TiDB 集群的 SQL 用户的密码 | ++--------------+----------------------------------------------------------------------+ +| `{host}` | TiDB 节点运行的 [Host](https://en.wikipedia.org/wiki/Host_(network)) | ++--------------+----------------------------------------------------------------------+ +| `{port}` | TiDB 节点正在监听的端口 | ++--------------+----------------------------------------------------------------------+ +| `{database}` | (已经存在的)数据库的名称 | ++--------------+----------------------------------------------------------------------+ ## Hibernate @@ -102,10 +108,16 @@ SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml **连接参数** -| 参数名 | 描述 | -| :----------: | :------------------------------------------------------------------------------------------------: | -| `{username}` | 需要连接到 TiDB 集群的 [SQL 用户](/user-account-management.md) | -| `{password}` | 需要连接到 TiDB 集群的 SQL 用户的密码 | -| `{host}` | TiDB 节点运行的 [Host]() | -| `{port}` | TiDB 节点正在监听的端口 | -| `{database}` | (已经存在的)数据库的名称 | ++--------------+----------------------------------------------------------------------+ +| 参数名 | 描述 | ++:============:+:====================================================================:+ +| `{username}` | 需要连接到 TiDB 集群的 [SQL 用户](/user-account-management.md) | ++--------------+----------------------------------------------------------------------+ +| `{password}` | 需要连接到 TiDB 集群的 SQL 用户的密码 | ++--------------+----------------------------------------------------------------------+ +| `{host}` | TiDB 节点运行的 [Host](https://en.wikipedia.org/wiki/Host_(network)) | ++--------------+----------------------------------------------------------------------+ +| `{port}` | TiDB 节点正在监听的端口 | ++--------------+----------------------------------------------------------------------+ +| `{database}` | (已经存在的)数据库的名称 | ++--------------+----------------------------------------------------------------------+ diff --git a/develop/dev-guide-third-party-support.md b/develop/dev-guide-third-party-support.md index 472ffffa2de0..6f1558c92397 100644 --- a/develop/dev-guide-third-party-support.md +++ b/develop/dev-guide-third-party-support.md @@ -25,161 +25,48 @@ PingCAP 与开源社区合作,通过三方工具提供以下支持: ## Driver - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
编程语言驱动最新已测试版本支持等级TiDB 适配器教程
GoGo-MySQL-Driverv1.6.0FullN/A使用 Go-MySQL-Driver 连接到 TiDB
JavaJDBC8.0Full - - 使用 JDBC 连接到 TiDB
++-----------+-----------------------------------------------------------+----------------+-----------+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+ +| 编程语言 | 驱动 | 最新已测试版本 | 支持等级 | TiDB 适配器 | 教程 | ++===========+===========================================================+================+===========+=======================================================================================================================+==========================================================================================================================+ +| Go | [Go-MySQL-Driver](https://github.com/go-sql-driver/mysql) | v1.6.0 | Full | N/A | [使用 Go-MySQL-Driver 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-golang-sql-driver) | ++-----------+-----------------------------------------------------------+----------------+-----------+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+ +| Java | [JDBC](https://dev.mysql.com/downloads/connector/j/) | 8.0 | Full | - [pingcap/mysql-connector-j](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-choose-driver-or-orm#java-drivers) | [使用 JDBC 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-java-jdbc) | +| | | | | - [pingcap/tidb-loadbalance](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-choose-driver-or-orm#tidb-loadbalance) | | ++-----------+-----------------------------------------------------------+----------------+-----------+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+ ## ORM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
编程语言ORM 框架最新已测试版本支持等级TiDB 适配器教程
Gogormv1.23.5FullN/A使用 GORM 连接到 TiDB
beegov2.0.3FullN/AN/A
upper/dbv4.5.2FullN/AN/A
xormv1.3.1FullN/AN/A
JavaHibernate6.1.0.FinalFullN/A使用 Hibernate 连接到 TiDB
MyBatisv3.5.10FullN/A使用 MyBatis 连接到 TiDB
Spring Data JPA2.7.2FullN/A使用 Spring Boot 连接到 TiDB
jOOQv3.16.7 (Open Source)FullN/AN/A
RubyActive Recordv7.0FullN/A使用 Rails 框架和 ActiveRecord ORM 连接到 TiDB
JavaScript / TypeScriptSequelizev6.20.1FullN/AN/A
Prisma4.16.2FullN/A使用 Prisma 连接到 TiDB
TypeORMv0.3.17FullN/A使用 TypeORM 连接到 TiDB
PythonDjangov4.2Fulldjango-tidb使用 Django 连接到 TiDB
SQLAlchemyv1.4.37FullN/A使用 SQLAlchemy 连接到 TiDB
++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| 编程语言 | ORM 框架 | 最新已测试版本 | 支持等级 | TiDB 适配器 | 教程 | ++=========================+===========================================================================+=======================+==========+=======================================================+=================================================================================================================================+ +| Go | [gorm](https://github.com/go-gorm/gorm) | v1.23.5 | Full | N/A | [使用 GORM 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-golang-gorm) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [beego](https://github.com/beego/beego) | v2.0.3 | Full | N/A | N/A | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [upper/db](https://github.com/upper/db) | v4.5.2 | Full | N/A | N/A | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [xorm](https://gitea.com/xorm/xorm) | v1.3.1 | Full | N/A | N/A | ++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| Java | [Hibernate](https://hibernate.org/orm/) | 6.1.0.Final | Full | N/A | [使用 Hibernate 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-java-hibernate) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [MyBatis](https://mybatis.org/mybatis-3/) | v3.5.10 | Full | N/A | [使用 MyBatis 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-java-mybatis) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [Spring Data JPA](https://spring.io/projects/spring-data-jpa/) | 2.7.2 | Full | N/A | [使用 Spring Boot 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-java-spring-boot) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [jOOQ](https://github.com/jOOQ/jOOQ) | v3.16.7 (Open Source) | Full | N/A | N/A | ++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| Ruby | [Active Record](https://guides.rubyonrails.org/active_record_basics.html) | v7.0 | Full | N/A | [使用 Rails 框架和 ActiveRecord ORM 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-ruby-rails) | ++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| JavaScript / TypeScript | [Sequelize](https://sequelize.org/) | v6.20.1 | Full | N/A | N/A | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [Prisma](https://www.prisma.io/) | 4.16.2 | Full | N/A | [使用 Prisma 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-nodejs-prisma) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [TypeORM](https://typeorm.io/) | v0.3.17 | Full | N/A | [使用 TypeORM 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-nodejs-typeorm) | ++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| Python | [Django](https://pypi.org/project/Django/) | v4.2 | Full | [django-tidb](https://github.com/pingcap/django-tidb) | [使用 Django 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-python-django) | +| +---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ +| | [SQLAlchemy](https://www.sqlalchemy.org/) | v1.4.37 | Full | N/A | [使用 SQLAlchemy 连接到 TiDB](https://docs.pingcap.com/zh/tidb/v6.5/dev-guide-sample-application-python-sqlalchemy) | ++-------------------------+---------------------------------------------------------------------------+-----------------------+----------+-------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------+ ## GUI diff --git a/dm/dm-block-allow-table-lists.md b/dm/dm-block-allow-table-lists.md index c8e5b8890806..583020f3988f 100644 --- a/dm/dm-block-allow-table-lists.md +++ b/dm/dm-block-allow-table-lists.md @@ -130,13 +130,25 @@ block-allow-list: # 如果 DM 版本早于 v2.0.0-beta.2 则使用 black-white- 应用 `bw-rule` 规则后: -| table | 是否过滤| 过滤的原因 | -|:----|:----|:--------------| -| `logs`.`messages_2016` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | -| `logs`.`messages_2017` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | -| `logs`.`messages_2018` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | -| `forum_backup_2016`.`messages` | 是 | schema `forum_backup_2016` 没有匹配到 `do-dbs` 任意一项 | -| `forum_backup_2017`.`messages` | 是 | schema `forum_backup_2017` 没有匹配到 `do-dbs` 任意一项 | -| `forum`.`users` | 是 | 1. schema `forum` 匹配到 `do-dbs`,进入 table 过滤判断
2. schema 和 table 没有匹配到 `do-tables` 和 `ignore-tables` 中任意一项,并且 `do-tables` 不为空,因此过滤 | -| `forum`.`messages` | 否 | 1. schema `forum` 匹配到 `do-dbs`,进入 table 过滤判断
2. schema 和 table 匹配到 `do-tables` 的 `db-name: "~^forum.*",tbl-name: "messages"` | -| `forum_backup_2018`.`messages` | 否 | 1. schema `forum_backup_2018` 匹配到 `do-dbs`,进入 table 过滤判断
2. schema 和 table 匹配到 `do-tables` 的 `db-name: "~^forum.*",tbl-name: "messages"` | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| table | 是否过滤 | 过滤的原因 | ++:===============================+:======================+:===========================================================================================================+ +| `logs`.`messages_2016` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `logs`.`messages_2017` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `logs`.`messages_2018` | 是 | schema `logs` 没有匹配到 `do-dbs` 任意一项 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `forum_backup_2016`.`messages` | 是 | schema `forum_backup_2016` 没有匹配到 `do-dbs` 任意一项 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `forum_backup_2017`.`messages` | 是 | schema `forum_backup_2017` 没有匹配到 `do-dbs` 任意一项 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `forum`.`users` | 是 | 1\. schema `forum` 匹配到 `do-dbs`,进入 table 过滤判断 | +| | | 2. schema 和 table 没有匹配到 `do-tables` 和 `ignore-tables` 中任意一项,并且 `do-tables` 不为空,因此过滤 | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `forum`.`messages` | 否 | 1\. schema `forum` 匹配到 `do-dbs`,进入 table 过滤判断 | +| | | 2. schema 和 table 匹配到 `do-tables` 的 `db-name: "~^forum.*",tbl-name: "messages"` | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ +| `forum_backup_2018`.`messages` | 否 | 1\. schema `forum_backup_2018` 匹配到 `do-dbs`,进入 table 过滤判断 | +| | | 2. schema 和 table 匹配到 `do-tables` 的 `db-name: "~^forum.*",tbl-name: "messages"` | ++--------------------------------+-----------------------+------------------------------------------------------------------------------------------------------------+ diff --git a/dm/dm-config-overview.md b/dm/dm-config-overview.md index 23dea59f0231..486a62d6aa71 100644 --- a/dm/dm-config-overview.md +++ b/dm/dm-config-overview.md @@ -26,8 +26,13 @@ title: DM 配置简介 DM 配置的关键概念如下: -| 概念 | 解释 | 配置文件 | -| :------------ | :------------ | :------------------ | -| source-id | 唯一确定一个 MySQL 或 MariaDB 实例,或者一个具有主从结构的复制组,字符串长度不大于 32 | `source.yaml` 的 `source-id`;
`task.yaml` 的 `source-id` | -| DM-master ID | 唯一确定一个 DM-master(取值于 `dm-master.toml` 的 `master-addr` 参数) | `dm-master.toml` 的 `master-addr` | -| DM-worker ID | 唯一确定一个 DM-worker(取值于 `dm-worker.toml` 的 `worker-addr` 参数) | `dm-worker.toml` 的 `worker-addr` | ++-----------------------+---------------------------------------------------------------------------------------+-----------------------------------+ +| 概念 | 解释 | 配置文件 | ++:======================+:======================================================================================+:==================================+ +| source-id | 唯一确定一个 MySQL 或 MariaDB 实例,或者一个具有主从结构的复制组,字符串长度不大于 32 | `source.yaml` 的 `source-id`; | +| | | `task.yaml` 的 `source-id` | ++-----------------------+---------------------------------------------------------------------------------------+-----------------------------------+ +| DM-master ID | 唯一确定一个 DM-master(取值于 `dm-master.toml` 的 `master-addr` 参数) | `dm-master.toml` 的 `master-addr` | ++-----------------------+---------------------------------------------------------------------------------------+-----------------------------------+ +| DM-worker ID | 唯一确定一个 DM-worker(取值于 `dm-worker.toml` 的 `worker-addr` 参数) | `dm-worker.toml` 的 `worker-addr` | ++-----------------------+---------------------------------------------------------------------------------------+-----------------------------------+ diff --git a/dm/dm-ddl-compatible.md b/dm/dm-ddl-compatible.md index 9c17bba976dd..8d693feefff1 100644 --- a/dm/dm-ddl-compatible.md +++ b/dm/dm-ddl-compatible.md @@ -10,116 +10,71 @@ DM 同步过程中,根据 DDL 语句以及所处场景的不同,将采用不 以下语句 DM 并未支持,因此解析之后直接跳过。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
描述SQL
transaction^SAVEPOINT
skip all flush sqls^FLUSH
table maintenance^OPTIMIZE\\s+TABLE
^ANALYZE\\s+TABLE
^REPAIR\\s+TABLE
temporary table^DROP\\s+(\\/\\*\\!40005\\s+)?TEMPORARY\\s+(\\*\\/\\s+)?TABLE
trigger^CREATE\\s+(DEFINER\\s?=.+?)?TRIGGER
^DROP\\s+TRIGGER
procedure^DROP\\s+PROCEDURE
^CREATE\\s+(DEFINER\\s?=.+?)?PROCEDURE
^ALTER\\s+PROCEDURE
view^CREATE\\s*(OR REPLACE)?\\s+(ALGORITHM\\s?=.+?)?(DEFINER\\s?=.+?)?\\s+(SQL SECURITY DEFINER)?VIEW
^DROP\\s+VIEW
^ALTER\\s+(ALGORITHM\\s?=.+?)?(DEFINER\\s?=.+?)?(SQL SECURITY DEFINER)?VIEW
function^CREATE\\s+(AGGREGATE)?\\s*?FUNCTION
^CREATE\\s+(DEFINER\\s?=.+?)?FUNCTION
^ALTER\\s+FUNCTION
^DROP\\s+FUNCTION
tableSpace^CREATE\\s+TABLESPACE
^ALTER\\s+TABLESPACE
^DROP\\s+TABLESPACE
event^CREATE\\s+(DEFINER\\s?=.+?)?EVENT
^ALTER\\s+(DEFINER\\s?=.+?)?EVENT
^DROP\\s+EVENT
account management^GRANT
^REVOKE
^CREATE\\s+USER
^ALTER\\s+USER
^RENAME\\s+USER
^DROP\\s+USER
^DROP\\s+USER
++---------------------+-----------------------------------------------------------------------------------------------------+ +| 描述 | SQL | ++=====================+=====================================================================================================+ +| transaction | `^SAVEPOINT` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| skip all flush sqls | `^FLUSH` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| table maintenance | `^OPTIMIZE\\s+TABLE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ANALYZE\\s+TABLE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^REPAIR\\s+TABLE` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| temporary table | `^DROP\\s+(\\/\\*\\!40005\\s+)?TEMPORARY\\s+(\\*\\/\\s+)?TABLE` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| trigger | `^CREATE\\s+(DEFINER\\s?=.+?)?TRIGGER` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+TRIGGER` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| procedure | `^DROP\\s+PROCEDURE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^CREATE\\s+(DEFINER\\s?=.+?)?PROCEDURE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+PROCEDURE` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| view | `^CREATE\\s*(OR REPLACE)?\\s+(ALGORITHM\\s?=.+?)?(DEFINER\\s?=.+?)?\\s+(SQL SECURITY DEFINER)?VIEW` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+VIEW` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+(ALGORITHM\\s?=.+?)?(DEFINER\\s?=.+?)?(SQL SECURITY DEFINER)?VIEW` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| function | `^CREATE\\s+(AGGREGATE)?\\s*?FUNCTION` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^CREATE\\s+(DEFINER\\s?=.+?)?FUNCTION` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+FUNCTION` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+FUNCTION` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| tableSpace | `^CREATE\\s+TABLESPACE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+TABLESPACE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+TABLESPACE` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| event | `^CREATE\\s+(DEFINER\\s?=.+?)?EVENT` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+(DEFINER\\s?=.+?)?EVENT` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+EVENT` | ++---------------------+-----------------------------------------------------------------------------------------------------+ +| account management | `^GRANT` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^REVOKE` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^CREATE\\s+USER` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^ALTER\\s+USER` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^RENAME\\s+USER` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+USER` | +| +-----------------------------------------------------------------------------------------------------+ +| | `^DROP\\s+USER` | ++---------------------+-----------------------------------------------------------------------------------------------------+ ## 改写的 DDL 语句 diff --git a/dm/dm-error-handling.md b/dm/dm-error-handling.md index 690ad5deed9f..1a3b06639fab 100644 --- a/dm/dm-error-handling.md +++ b/dm/dm-error-handling.md @@ -23,25 +23,47 @@ summary: 了解 DM 的错误系统及常见故障的处理方法。 下表展示所有的错误类别、错误对应的系统子模块、错误样例: - |
错误类别
| 错误对应的系统子模块 | 错误样例 | - | :-------------- | :------------------------------ | :------------------------------------------------------------ | - | `database` | 执行数据库操作出现错误 | `[code=10003:class=database:scope=downstream:level=medium] database driver: invalid connection` | - | `functional` | 系统底层的基础函数错误 | `[code=11005:class=functional:scope=internal:level=high] not allowed operation: alter multiple tables in one statement` | - | `config` | 配置错误 | `[code=20005:class=config:scope=internal:level=medium] empty source-id not valid` | - | `binlog-op` | binlog 操作出现错误 | `[code=22001:class=binlog-op:scope=internal:level=high] empty UUIDs not valid` | - | `checkpoint` | checkpoint 相关操作出现错误 | `[code=24002:class=checkpoint:scope=internal:level=high] save point bin.1234 is older than current pos bin.1371` | - | `task-check` | 进行任务检查时出现错误 | `[code=26003:class=task-check:scope=internal:level=medium] new table router error` | - | `relay-event-lib`| 执行 relay 模块基础功能时出现错误 | `[code=28001:class=relay-event-lib:scope=internal:level=high] parse server-uuid.index` | - | `relay-unit` | relay 处理单元内出现错误 | `[code=30015:class=relay-unit:scope=upstream:level=high] TCPReader get event: ERROR 1236 (HY000): Could not open log file` | - | `dump-unit` | dump 处理单元内出现错误 | `[code=32001:class=dump-unit:scope=internal:level=high] mydumper runs with error: CRITICAL **: 15:12:17.559: Error connecting to database: Access denied for user 'root'@'172.17.0.1' (using password: NO)` | - | `load-unit` | load 处理单元内出现错误 | `[code=34002:class=load-unit:scope=internal:level=high] corresponding ending of sql: ')' not found` | - | `sync-unit` | sync 处理单元内出现错误 | `[code=36027:class=sync-unit:scope=internal:level=high] Column count doesn't match value count: 9 (columns) vs 10 (values)` | - | `dm-master` | DM-master 服务内部出现错误 | `[code=38008:class=dm-master:scope=internal:level=high] grpc request error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 172.17.0.2:8262: connect: connection refused"` | - | `dm-worker` | DM-worker 服务内部出现错误 | `[code=40066:class=dm-worker:scope=internal:level=high] ExecuteDDL timeout, try use query-status to query whether the DDL is still blocking` | - | `dm-tracer` | DM-tracer 服务内部出现错误 | `[code=42004:class=dm-tracer:scope=internal:level=medium] trace event test.1 not found` | - | `schema-tracker` | 增量复制时记录 schema 变更出现错误 | `[code=44006:class=schema-tracker:scope=internal:level=high],"cannot track DDL: ALTER TABLE test DROP COLUMN col1"` | - | `scheduler` | 数据迁移任务调度相关操作出错操作 | `[code=46001:class=scheduler:scope=internal:level=high],"the scheduler has not started"` | - | `dmctl` | dmctl 内部或与其他组件交互出现错误 | `[code=48001:class=dmctl:scope=internal:level=high],"can not create grpc connection"` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + |
| 错误对应的系统子模块 | 错误样例 | + | | | | + | 错误类别 | | | + | | | | + |
| | | + +:======================+:===================================+:=================================================================================================================================================================================================================================================================================================+ + | `database` | 执行数据库操作出现错误 | `[code=10003:class=database:scope=downstream:level=medium] database driver: invalid connection` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `functional` | 系统底层的基础函数错误 | `[code=11005:class=functional:scope=internal:level=high] not allowed operation: alter multiple tables in one statement` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `config` | 配置错误 | `[code=20005:class=config:scope=internal:level=medium] empty source-id not valid` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `binlog-op` | binlog 操作出现错误 | `[code=22001:class=binlog-op:scope=internal:level=high] empty UUIDs not valid` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `checkpoint` | checkpoint 相关操作出现错误 | `[code=24002:class=checkpoint:scope=internal:level=high] save point bin.1234 is older than current pos bin.1371` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `task-check` | 进行任务检查时出现错误 | `[code=26003:class=task-check:scope=internal:level=medium] new table router error` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `relay-event-lib` | 执行 relay 模块基础功能时出现错误 | `[code=28001:class=relay-event-lib:scope=internal:level=high] parse server-uuid.index` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `relay-unit` | relay 处理单元内出现错误 | `[code=30015:class=relay-unit:scope=upstream:level=high] TCPReader get event: ERROR 1236 (HY000): Could not open log file` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `dump-unit` | dump 处理单元内出现错误 | `[code=32001:class=dump-unit:scope=internal:level=high] mydumper runs with error: CRITICAL **: 15:12:17.559: Error connecting to database: Access denied for user 'root'@'172.17.0.1' (using password: NO)` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `load-unit` | load 处理单元内出现错误 | `[code=34002:class=load-unit:scope=internal:level=high] corresponding ending of sql: ')' not found` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `sync-unit` | sync 处理单元内出现错误 | `[code=36027:class=sync-unit:scope=internal:level=high] Column count doesn't match value count: 9 (columns) vs 10 (values)` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `dm-master` | DM-master 服务内部出现错误 | `[code=38008:class=dm-master:scope=internal:level=high] grpc request error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 172.17.0.2:8262: connect: connection refused"` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `dm-worker` | DM-worker 服务内部出现错误 | `[code=40066:class=dm-worker:scope=internal:level=high] ExecuteDDL timeout, try use query-status to query whether the DDL is still blocking` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `dm-tracer` | DM-tracer 服务内部出现错误 | `[code=42004:class=dm-tracer:scope=internal:level=medium] trace event test.1 not found` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `schema-tracker` | 增量复制时记录 schema 变更出现错误 | `[code=44006:class=schema-tracker:scope=internal:level=high],"cannot track DDL: ALTER TABLE test DROP COLUMN col1"` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `scheduler` | 数据迁移任务调度相关操作出错操作 | `[code=46001:class=scheduler:scope=internal:level=high],"the scheduler has not started"` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | `dmctl` | dmctl 内部或与其他组件交互出现错误 | `[code=48001:class=dmctl:scope=internal:level=high],"can not create grpc connection"` | + +-----------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - `scope`:错误作用域。 @@ -91,18 +113,33 @@ summary: 了解 DM 的错误系统及常见故障的处理方法。 ## 常见故障处理方法 -|
错误码
| 错误说明 | 解决方法 | -| :----------- | :------------------------------------------------------------ | :----------------------------------------------------------- | -| `code=10001` | 数据库操作异常 | 进一步分析错误信息和错误堆栈 | -| `code=10002` | 数据库底层的 `bad connection` 错误,通常表示 DM 到下游 TiDB 的数据库连接出现了异常(如网络故障、TiDB 重启等)且当前请求的数据暂时未能发送到 TiDB。 | DM 提供针对此类错误的自动恢复。如果长时间未恢复,需要用户检查网络或 TiDB 状态。 | -| `code=10003` | 数据库底层 `invalid connection` 错误,通常表示 DM 到下游 TiDB 的数据库连接出现了异常(如网络故障、TiDB 重启、TiKV busy 等)且当前请求已有部分数据发送到了 TiDB。 | DM 提供针对此类错误的自动恢复。如果未能正常恢复,需要用户进一步检查错误信息并根据具体场景进行分析。 | -| `code=10005` | 数据库查询类语句出错 | | -| `code=10006` | 数据库 `EXECUTE` 类型语句出错,包括 DDL 和 `INSERT`/`UPDATE`/`DELETE` 类型的 DML。更详细的错误信息可通过错误 message 获取。错误 message 中通常包含操作数据库所返回的错误码和错误信息。 | | -| `code=11006` | DM 内置的 parser 解析不兼容的 DDL 时出错 | 可参考 [Data Migration 故障诊断-处理不兼容的 DDL 语句](/dm/dm-faq.md#如何处理不兼容的-ddl-语句) 提供的解决方案 | -| `code=20010` | 处理任务配置时,解密数据库的密码出错 | 检查任务配置中提供的下游数据库密码是否有[使用 dmctl 正确加密](/dm/dm-manage-source.md#加密数据库密码) | -| `code=26002` | 任务检查创建数据库连接失败。更详细的错误信息可通过错误 message 获取。错误 message 中包含操作数据库所返回的错误码和错误信息。 | 检查 DM-master 所在的机器是否有权限访问上游 | -| `code=32001` | dump 处理单元异常 | 如果报错 `msg` 包含 `mydumper: argument list too long.`,则需要用户根据 block-allow-list,在 `task.yaml` 的 dump 处理单元的 `extra-args` 参数中手动加上 `--regex` 正则表达式设置要导出的库表。例如,如果要导出所有库中表名字为 `hello` 的表,可加上 `--regex '.*\\.hello$'`,如果要导出所有表,可加上 `--regex '.*'`。 | -| `code=38008` | DM 组件间的 gRPC 通信出错 | 检查 `class`,定位错误发生在哪些组件的交互环节,根据错误 message 判断是哪类通信错误。如果是 gRPC 建立连接出错,可检查通信服务端是否运行正常。 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +|
| 错误说明 | 解决方法 | +| | | | +| 错误码 | | | +| | | | +|
| | | ++:======================+:=======================================================================================================================================================================================+:=======================================================================================================================================================================================================================================================================================================================+ +| `code=10001` | 数据库操作异常 | 进一步分析错误信息和错误堆栈 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=10002` | 数据库底层的 `bad connection` 错误,通常表示 DM 到下游 TiDB 的数据库连接出现了异常(如网络故障、TiDB 重启等)且当前请求的数据暂时未能发送到 TiDB。 | DM 提供针对此类错误的自动恢复。如果长时间未恢复,需要用户检查网络或 TiDB 状态。 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=10003` | 数据库底层 `invalid connection` 错误,通常表示 DM 到下游 TiDB 的数据库连接出现了异常(如网络故障、TiDB 重启、TiKV busy 等)且当前请求已有部分数据发送到了 TiDB。 | DM 提供针对此类错误的自动恢复。如果未能正常恢复,需要用户进一步检查错误信息并根据具体场景进行分析。 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=10005` | 数据库查询类语句出错 | | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=10006` | 数据库 `EXECUTE` 类型语句出错,包括 DDL 和 `INSERT`/`UPDATE`/`DELETE` 类型的 DML。更详细的错误信息可通过错误 message 获取。错误 message 中通常包含操作数据库所返回的错误码和错误信息。 | | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=11006` | DM 内置的 parser 解析不兼容的 DDL 时出错 | 可参考 [Data Migration 故障诊断-处理不兼容的 DDL 语句](/dm/dm-faq.md#如何处理不兼容的-ddl-语句) 提供的解决方案 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=20010` | 处理任务配置时,解密数据库的密码出错 | 检查任务配置中提供的下游数据库密码是否有[使用 dmctl 正确加密](/dm/dm-manage-source.md#加密数据库密码) | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=26002` | 任务检查创建数据库连接失败。更详细的错误信息可通过错误 message 获取。错误 message 中包含操作数据库所返回的错误码和错误信息。 | 检查 DM-master 所在的机器是否有权限访问上游 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=32001` | dump 处理单元异常 | 如果报错 `msg` 包含 `mydumper: argument list too long.`,则需要用户根据 block-allow-list,在 `task.yaml` 的 dump 处理单元的 `extra-args` 参数中手动加上 `--regex` 正则表达式设置要导出的库表。例如,如果要导出所有库中表名字为 `hello` 的表,可加上 `--regex '.*\\.hello$'`,如果要导出所有表,可加上 `--regex '.*'`。 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `code=38008` | DM 组件间的 gRPC 通信出错 | 检查 `class`,定位错误发生在哪些组件的交互环节,根据错误 message 判断是哪类通信错误。如果是 gRPC 建立连接出错,可检查通信服务端是否运行正常。 | ++-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ### 迁移任务中断并包含 `invalid connection` 错误 diff --git a/dm/dm-worker-intro.md b/dm/dm-worker-intro.md index b71aa0cf88bf..aea30569bca0 100644 --- a/dm/dm-worker-intro.md +++ b/dm/dm-worker-intro.md @@ -87,12 +87,29 @@ GRANT ALL ON dm_meta.* TO 'your_user'@'your_wildcard_of_host'; ### 处理单元所需的最小权限 -| 处理单元 | 最小上游 (MySQL/MariaDB) 权限 | 最小下游 (TiDB) 权限 | 最小系统权限 | -|:----|:--------------------|:------------|:----| -| Relay log | `REPLICATION SLAVE` (读取 binlog)
`REPLICATION CLIENT` (`show master status`, `show slave status`) | 无 | 本地读/写磁盘 | -| Dump | `SELECT`
`RELOAD`(获取读锁将表数据刷到磁盘,进行一些操作后,再释放读锁对表进行解锁)| 无 | 本地写磁盘 | -| Load | 无 | `SELECT`(查询 checkpoint 历史)
`CREATE`(创建数据库或表)
`DELETE`(删除 checkpoint)
`INSERT`(插入 dump 数据)| 读/写本地文件 | -| Binlog replication | `REPLICATION SLAVE`(读 binlog)
`REPLICATION CLIENT` (`show master status`, `show slave status`) | `SELECT`(显示索引和列)
`INSERT` (DML)
`UPDATE` (DML)
`DELETE` (DML)
`CREATE`(创建数据库或表)
`DROP`(删除数据库或表)
`ALTER`(修改表)
`INDEX`(创建或删除索引)| 本地读/写磁盘 | ++--------------------+------------------------------------------------------------------------------+----------------------------------+-----------------+ +| 处理单元 | 最小上游 (MySQL/MariaDB) 权限 | 最小下游 (TiDB) 权限 | 最小系统权限 | ++:===================+:=============================================================================+:=================================+:================+ +| Relay log | `REPLICATION SLAVE` (读取 binlog) | 无 | 本地读/写磁盘 | +| | `REPLICATION CLIENT` (`show master status`, `show slave status`) | | | ++--------------------+------------------------------------------------------------------------------+----------------------------------+-----------------+ +| Dump | `SELECT` | 无 | 本地写磁盘 | +| | `RELOAD`(获取读锁将表数据刷到磁盘,进行一些操作后,再释放读锁对表进行解锁) | | | ++--------------------+------------------------------------------------------------------------------+----------------------------------+-----------------+ +| Load | 无 | `SELECT`(查询 checkpoint 历史) | 读/写本地文件 | +| | | `CREATE`(创建数据库或表) | | +| | | `DELETE`(删除 checkpoint) | | +| | | `INSERT`(插入 dump 数据) | | ++--------------------+------------------------------------------------------------------------------+----------------------------------+-----------------+ +| Binlog replication | `REPLICATION SLAVE`(读 binlog) | `SELECT`(显示索引和列) | 本地读/写磁盘 | +| | `REPLICATION CLIENT` (`show master status`, `show slave status`) | `INSERT` (DML) | | +| | | `UPDATE` (DML) | | +| | | `DELETE` (DML) | | +| | | `CREATE`(创建数据库或表) | | +| | | `DROP`(删除数据库或表) | | +| | | `ALTER`(修改表) | | +| | | `INDEX`(创建或删除索引) | | ++--------------------+------------------------------------------------------------------------------+----------------------------------+-----------------+ > **注意:** > diff --git a/download-ecosystem-tools.md b/download-ecosystem-tools.md index a9b5131917dc..538cd3d5a116 100644 --- a/download-ecosystem-tools.md +++ b/download-ecosystem-tools.md @@ -34,18 +34,39 @@ TiDB 工具包中包含了一些常用的 TiDB 工具,例如数据导出工具 在 TiDB 工具包中,你可以依据要使用的工具,选择安装对应的离线包。 -| 工具 | 离线包名称 | -|:------|:----------| -| [TiUP](/tiup/tiup-overview.md) | `tiup-linux-{arch}.tar.gz`
`tiup-{tiup-version}-linux-{arch}.tar.gz`
`dm-{tiup-version}-linux-{arch}.tar.gz`
`server-{version}-linux-{arch}.tar.gz` | -| [Dumpling](/dumpling-overview.md) | `dumpling-{version}-linux-{arch}.tar.gz` | -| [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) | `tidb-lightning-ctl`
`tidb-lightning-{version}-linux-{arch}.tar.gz` | -| [TiDB DM (Data Migration)](/dm/dm-overview.md) | `dm-worker-{version}-linux-{arch}.tar.gz`
`dm-master-{version}-linux-{arch}.tar.gz`
`dmctl-{version}-linux-{arch}.tar.gz` | -| [TiCDC](/ticdc/ticdc-overview.md) | `cdc-{version}-linux-{arch}.tar.gz` | -| [TiDB Binlog](/tidb-binlog/tidb-binlog-overview.md) | `pump-{version}-linux-{arch}.tar.gz`
`drainer-{version}-linux-{arch}.tar.gz`
`binlogctl`
`reparo` | -| [Backup & Restore (BR)](/br/backup-and-restore-overview.md) | `br-{version}-linux-{arch}.tar.gz` | -| [sync-diff-inspector](/sync-diff-inspector/sync-diff-inspector-overview.md) | `sync_diff_inspector` | -| [TiSpark](/tispark-overview.md) | `tispark-{tispark-version}-any-any.tar.gz`
`spark-{spark-version}-any-any.tar.gz` | -| [PD Recover](/pd-recover.md) | `pd-recover-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| 工具 | 离线包名称 | ++:============================================================================+:===============================================+ +| [TiUP](/tiup/tiup-overview.md) | `tiup-linux-{arch}.tar.gz` | +| | `tiup-{tiup-version}-linux-{arch}.tar.gz` | +| | `dm-{tiup-version}-linux-{arch}.tar.gz` | +| | `server-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [Dumpling](/dumpling-overview.md) | `dumpling-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) | `tidb-lightning-ctl` | +| | `tidb-lightning-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [TiDB DM (Data Migration)](/dm/dm-overview.md) | `dm-worker-{version}-linux-{arch}.tar.gz` | +| | `dm-master-{version}-linux-{arch}.tar.gz` | +| | `dmctl-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [TiCDC](/ticdc/ticdc-overview.md) | `cdc-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [TiDB Binlog](/tidb-binlog/tidb-binlog-overview.md) | `pump-{version}-linux-{arch}.tar.gz` | +| | `drainer-{version}-linux-{arch}.tar.gz` | +| | `binlogctl` | +| | `reparo` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [Backup & Restore (BR)](/br/backup-and-restore-overview.md) | `br-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [sync-diff-inspector](/sync-diff-inspector/sync-diff-inspector-overview.md) | `sync_diff_inspector` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [TiSpark](/tispark-overview.md) | `tispark-{tispark-version}-any-any.tar.gz` | +| | `spark-{spark-version}-any-any.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ +| [PD Recover](/pd-recover.md) | `pd-recover-{version}-linux-{arch}.tar.gz` | ++-----------------------------------------------------------------------------+------------------------------------------------+ > **注意:** > diff --git a/dumpling-overview.md b/dumpling-overview.md index c397213c093c..11d1bc07325d 100644 --- a/dumpling-overview.md +++ b/dumpling-overview.md @@ -324,44 +324,90 @@ SET GLOBAL tidb_gc_life_time = '10m'; ## Dumpling 主要选项表 -| 主要选项 | 用途 | 默认值 | -| --------| --- | --- | -| -V 或 --version | 输出 Dumpling 版本并直接退出 | -| -B 或 --database | 导出指定数据库 | -| -T 或 --tables-list | 导出指定数据表 | -| -f 或 --filter | 导出能匹配模式的表,语法可参考 [table-filter](/table-filter.md) | `[\*.\*,!/^(mysql|sys|INFORMATION_SCHEMA|PERFORMANCE_SCHEMA|METRICS_SCHEMA|INSPECTION_SCHEMA)$/.\*]`(导出除系统库外的所有库表) | -| --case-sensitive | table-filter 是否大小写敏感 | false,大小写不敏感 | -| -h 或 --host| 连接的数据库主机的地址 | "127.0.0.1" | -| -t 或 --threads | 备份并发线程数| 4 | -| -r 或 --rows | 用于开启表内并发加速导出。默认值是 `0`,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 `-r` 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。 | -| -L 或 --logfile | 日志输出地址,为空时会输出到控制台 | "" | -| --loglevel | 日志级别 {debug,info,warn,error,dpanic,panic,fatal} | "info" | -| --logfmt | 日志输出格式 {text,json} | "text" | -| -d 或 --no-data | 不导出数据,适用于只导出 schema 场景 | -| --no-header | 导出 csv 格式的 table 数据,不生成 header | -| -W 或 --no-views| 不导出 view | true | -| -m 或 --no-schemas | 不导出 schema,只导出数据 | -| -s 或--statement-size | 控制 `INSERT` SQL 语句的大小,单位 bytes | -| -F 或 --filesize | 将 table 数据划分出来的文件大小,需指明单位(如 `128B`, `64KiB`, `32MiB`, `1.5GiB`) | -| --filetype| 导出文件类型(csv/sql) | "sql" | -| -o 或 --output | 导出本地文件路径或[外部存储 URL 格式](/br/backup-and-restore-storages.md#url-格式) | "./export-${time}" | -| -S 或 --sql | 根据指定的 sql 导出数据,该选项不支持并发导出 | -| --consistency | flush: dump 前用 FTWRL
snapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据
lock: 对需要 dump 的所有表执行 `lock tables read` 命令
none: 不加锁 dump,无法保证一致性
auto: 对 MySQL 使用 --consistency flush;对 TiDB 使用 --consistency snapshot | "auto" | -| --snapshot | snapshot tso,只在 consistency=snapshot 下生效 | -| --where | 对备份的数据表通过 where 条件指定范围 | -| -p 或 --password | 连接的数据库主机的密码 | -| -P 或 --port | 连接的数据库主机的端口 | 4000 | -| -u 或 --user | 连接的数据库主机的用户名 | "root" | -| --dump-empty-database | 导出空数据库的建库语句 | true | -| --ca | 用于 TLS 连接的 certificate authority 文件的地址 | -| --cert | 用于 TLS 连接的 client certificate 文件的地址 | -| --key | 用于 TLS 连接的 client private key 文件的地址 | -| --csv-delimiter | csv 文件中字符类型变量的定界符 | '"' | -| --csv-separator | csv 文件中各值的分隔符,如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符| ','| -| --csv-null-value | csv 文件空值的表示 | "\\N" | -| --escape-backslash | 使用反斜杠 (`\`) 来转义导出文件中的特殊字符 | true | -| --output-filename-template | 以 [golang template](https://golang.org/pkg/text/template/#hdr-Arguments) 格式表示的数据文件名格式
支持 `{{.DB}}`、`{{.Table}}`、`{{.Index}}` 三个参数
分别表示数据文件的库名、表名、分块 ID | '{{.DB}}.{{.Table}}.{{.Index}}' | -| --status-addr | Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址 | ":8281" | -| --tidb-mem-quota-query | 单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte。对于 v4.0.10 或以上版本,若不设置该参数,默认使用 TiDB 中的 `mem-quota-query` 配置项值作为内存限制值。对于 v4.0.10 以下版本,该参数值默认为 32 GB | 34359738368 | -| --params | 为需导出的数据库连接指定 session 变量,可接受的格式: "character_set_client=latin1,character_set_connection=latin1" | -| -c 或 --compress | 压缩 Dumpling 导出的 CSV、SQL 数据与表结构文件为指定格式,支持 "gzip"、"snappy" 和 "zstd" 压缩算法 | "" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 主要选项 | 用途 | 默认值 | ++============================+====================================================================================================================================================================================================================================================================================+===========================================================================================================================================================+ +| -V 或 --version | 输出 Dumpling 版本并直接退出 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -B 或 --database | 导出指定数据库 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -T 或 --tables-list | 导出指定数据表 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -f 或 --filter | 导出能匹配模式的表,语法可参考 [table-filter](/table-filter.md) | `[\*.\*,!/^(mysql|sys|INFORMATION_SCHEMA|PERFORMANCE_SCHEMA|METRICS_SCHEMA|INSPECTION_SCHEMA)$/.\*]`(导出除系统库外的所有库表) | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --case-sensitive | table-filter 是否大小写敏感 | false,大小写不敏感 | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -h 或 --host | 连接的数据库主机的地址 | "127.0.0.1" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -t 或 --threads | 备份并发线程数 | 4 | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -r 或 --rows | 用于开启表内并发加速导出。默认值是 `0`,表示不开启。取值大于 0 表示开启,取值是 INT 类型。当数据源为 TiDB 时,设置 `-r` 参数大于 0 表示使用 TiDB region 信息划分区间,同时减少内存使用。具体取值不影响划分算法。对数据源为 MySQL 且表的主键是 INT 的场景,该参数也有表内并发效果。 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -L 或 --logfile | 日志输出地址,为空时会输出到控制台 | "" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --loglevel | 日志级别 {debug,info,warn,error,dpanic,panic,fatal} | "info" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --logfmt | 日志输出格式 {text,json} | "text" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -d 或 --no-data | 不导出数据,适用于只导出 schema 场景 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --no-header | 导出 csv 格式的 table 数据,不生成 header | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -W 或 --no-views | 不导出 view | true | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -m 或 --no-schemas | 不导出 schema,只导出数据 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -s 或--statement-size | 控制 `INSERT` SQL 语句的大小,单位 bytes | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -F 或 --filesize | 将 table 数据划分出来的文件大小,需指明单位(如 `128B`, `64KiB`, `32MiB`, `1.5GiB`) | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --filetype | 导出文件类型(csv/sql) | "sql" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -o 或 --output | 导出本地文件路径或[外部存储 URL 格式](/br/backup-and-restore-storages.md#url-格式) | "./export-\${time}" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -S 或 --sql | 根据指定的 sql 导出数据,该选项不支持并发导出 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --consistency | flush: dump 前用 FTWRL | "auto" | +| | snapshot: 通过 TSO 来指定 dump 某个快照时间点的 TiDB 数据 | | +| | lock: 对需要 dump 的所有表执行 `lock tables read` 命令 | | +| | none: 不加锁 dump,无法保证一致性 | | +| | auto: 对 MySQL 使用 --consistency flush;对 TiDB 使用 --consistency snapshot | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --snapshot | snapshot tso,只在 consistency=snapshot 下生效 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --where | 对备份的数据表通过 where 条件指定范围 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -p 或 --password | 连接的数据库主机的密码 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -P 或 --port | 连接的数据库主机的端口 | 4000 | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -u 或 --user | 连接的数据库主机的用户名 | "root" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --dump-empty-database | 导出空数据库的建库语句 | true | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --ca | 用于 TLS 连接的 certificate authority 文件的地址 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --cert | 用于 TLS 连接的 client certificate 文件的地址 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --key | 用于 TLS 连接的 client private key 文件的地址 | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --csv-delimiter | csv 文件中字符类型变量的定界符 | '"' | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --csv-separator | csv 文件中各值的分隔符,如果数据中可能有逗号,建议源文件导出时分隔符使用非常见组合字符 | ',' | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --csv-null-value | csv 文件空值的表示 | "\\N" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --escape-backslash | 使用反斜杠 (`\`) 来转义导出文件中的特殊字符 | true | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --output-filename-template | 以 [golang template](https://golang.org/pkg/text/template/#hdr-Arguments) 格式表示的数据文件名格式 | '{{.DB}}.{{.Table}}.{{.Index}}' | +| | 支持 `{{.DB}}`、`{{.Table}}`、`{{.Index}}` 三个参数 | | +| | 分别表示数据文件的库名、表名、分块 ID | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --status-addr | Dumpling 的服务地址,包含了 Prometheus 拉取 metrics 信息及 pprof 调试的地址 | ":8281" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --tidb-mem-quota-query | 单条 dumpling 命令导出 SQL 语句的内存限制,单位为 byte。对于 v4.0.10 或以上版本,若不设置该参数,默认使用 TiDB 中的 `mem-quota-query` 配置项值作为内存限制值。对于 v4.0.10 以下版本,该参数值默认为 32 GB | 34359738368 | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| --params | 为需导出的数据库连接指定 session 变量,可接受的格式: "character_set_client=latin1,character_set_connection=latin1" | | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ +| -c 或 --compress | 压缩 Dumpling 导出的 CSV、SQL 数据与表结构文件为指定格式,支持 "gzip"、"snappy" 和 "zstd" 压缩算法 | "" | ++----------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/ecosystem-tool-user-case.md b/ecosystem-tool-user-case.md index 843975f121cf..be7939a4dcfb 100644 --- a/ecosystem-tool-user-case.md +++ b/ecosystem-tool-user-case.md @@ -1,44 +1,44 @@ ---- -title: TiDB 工具的使用场景 -summary: 本文档介绍 TiDB 工具的常见使用场景与工具选择。 ---- - -# TiDB 工具的使用场景 - -本文档从数据迁移工具的使用场景出发,介绍部分常见场景下的迁移工具的选择。 - -## 在物理机或虚拟机上部署运维 TiDB - -当需要在物理机或虚拟机上部署运维 TiDB 时,你可以先安装 [TiUP](/tiup/tiup-overview.md),再通过 TiUP 管理 TiDB 的众多组件,如 TiDB、PD、TiKV 等。 - -## 在 Kubernetes 上部署运维 TiDB - -当需要在 Kubernetes 上部署运维 TiDB 时,你可以先创建 Kubernetes 集群,部署[TiDB Operator](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable),然后使用 TiDB Operator 部署运维 TiDB 集群。 - -## 从 CSV 导入数据到 TiDB - -当需要将其他工具导出的格式兼容的 CSV files 导入到 TiDB 时,可使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md)。 - -## 从 MySQL/Aurora 导入全量数据 - -当需要从 MySQL/Aurora 导入全量数据时,可先使用 [Dumpling](/dumpling-overview.md) 将数据导出为 SQL dump files,然后再使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 将数据导入到 TiDB 集群。 - -## 从 MySQL/Aurora 迁移数据 - -当既需要从 MySQL/Aurora 导入全量数据,又需要迁移增量数据时,可使用 [TiDB Data Migration (DM)](/dm/dm-overview.md) 完成[从 Amazon Aurora 迁移数据到 TiDB](/migrate-aurora-to-tidb.md)。 - -如果全量数据量较大(TB 级别),则可先使用 [Dumpling](/dumpling-overview.md) 与 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 完成全量数据的迁移,再使用 DM 完成增量数据的迁移。 - -## TiDB 集群备份与恢复 - -当需要对 TiDB 集群进行备份或在之后对 TiDB 集群进行恢复时,可使用 [BR](/br/backup-and-restore-overview.md)。 - -## 迁出数据到 TiDB - -当需要将 TiDB 集群的数据迁出到其他 TiDB 集群时,可使用 [Dumpling](/dumpling-overview.md) 从 TiDB 将全量数据导出为 SQL dump files,然后再使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 将数据导入到 TiDB。 - -如果还需要执行增量数据的迁移,则可使用 [TiCDC](/ticdc/ticdc-overview.md)。 - -## TiDB 增量数据订阅 - -当需要订阅 TiDB 增量数据的变更时,可使用 [TiCDC](/ticdc/ticdc-overview.md)。 +--- +title: TiDB 工具的使用场景 +summary: 本文档介绍 TiDB 工具的常见使用场景与工具选择。 +--- + +# TiDB 工具的使用场景 + +本文档从数据迁移工具的使用场景出发,介绍部分常见场景下的迁移工具的选择。 + +## 在物理机或虚拟机上部署运维 TiDB + +当需要在物理机或虚拟机上部署运维 TiDB 时,你可以先安装 [TiUP](/tiup/tiup-overview.md),再通过 TiUP 管理 TiDB 的众多组件,如 TiDB、PD、TiKV 等。 + +## 在 Kubernetes 上部署运维 TiDB + +当需要在 Kubernetes 上部署运维 TiDB 时,你可以先创建 Kubernetes 集群,部署[TiDB Operator](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable),然后使用 TiDB Operator 部署运维 TiDB 集群。 + +## 从 CSV 导入数据到 TiDB + +当需要将其他工具导出的格式兼容的 CSV files 导入到 TiDB 时,可使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md)。 + +## 从 MySQL/Aurora 导入全量数据 + +当需要从 MySQL/Aurora 导入全量数据时,可先使用 [Dumpling](/dumpling-overview.md) 将数据导出为 SQL dump files,然后再使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 将数据导入到 TiDB 集群。 + +## 从 MySQL/Aurora 迁移数据 + +当既需要从 MySQL/Aurora 导入全量数据,又需要迁移增量数据时,可使用 [TiDB Data Migration (DM)](/dm/dm-overview.md) 完成[从 Amazon Aurora 迁移数据到 TiDB](/migrate-aurora-to-tidb.md)。 + +如果全量数据量较大(TB 级别),则可先使用 [Dumpling](/dumpling-overview.md) 与 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 完成全量数据的迁移,再使用 DM 完成增量数据的迁移。 + +## TiDB 集群备份与恢复 + +当需要对 TiDB 集群进行备份或在之后对 TiDB 集群进行恢复时,可使用 [BR](/br/backup-and-restore-overview.md)。 + +## 迁出数据到 TiDB + +当需要将 TiDB 集群的数据迁出到其他 TiDB 集群时,可使用 [Dumpling](/dumpling-overview.md) 从 TiDB 将全量数据导出为 SQL dump files,然后再使用 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) 将数据导入到 TiDB。 + +如果还需要执行增量数据的迁移,则可使用 [TiCDC](/ticdc/ticdc-overview.md)。 + +## TiDB 增量数据订阅 + +当需要订阅 TiDB 增量数据的变更时,可使用 [TiCDC](/ticdc/ticdc-overview.md)。 diff --git a/faq/faq-overview.md b/faq/faq-overview.md index 6b21f7110f18..52273586ff34 100644 --- a/faq/faq-overview.md +++ b/faq/faq-overview.md @@ -7,15 +7,37 @@ summary: 汇总 TiDB 产品的常见问题解答。 本文整合汇总了 TiDB 使用过程中常见问题解答的 (FAQ) 文档。 -| 分类 | 相关文档 | -| :------- | :------------------- | -| 产品架构和原理 | [产品架构常见问题](/faq/tidb-faq.md) | -| 安装部署 |
  • [安装部署常见问题](/faq/deploy-and-maintain-faq.md)
  • [TiUP 常见问题](/tiup/tiup-faq.md)
  • [Kubernetes 上的 TiDB 集群常见问题](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/faq)
| -| 数据迁移 |
  • [数据迁移常见问题](/faq/migration-tidb-faq.md)
  • 数据导入
    • [TiDB Lightning 常见问题](/tidb-lightning/tidb-lightning-faq.md)
    • [TiDB Data Migration 常见问题](/dm/dm-faq.md)
  • 增量数据同步
    • [TiCDC 常见问题解答](/ticdc/ticdc-faq.md)
    • [TiDB Binlog 常见问题](/tidb-binlog/tidb-binlog-faq.md)
| -| 数据备份与恢复 | [备份与恢复常见问题](/faq/backup-and-restore-faq.md) | -| SQL 使用 | [SQL 操作常见问题](/faq/sql-faq.md) | -| 集群升级 | [TiDB 集群升级常见问题](/faq/upgrade-faq.md) | -| 集群管理 | [TiDB 集群管理常见问题](/faq/manage-cluster-faq.md) | -| 监控报警 |
  • [TiDB 监控常见问题](/faq/monitor-faq.md)
  • [TiDB Dashboard 常见问题](/dashboard/dashboard-faq.md)
  • [TiDB 集群报警规则](/alert-rules.md)
| -| 高可用和高可靠 |
  • [TiDB 高可用常见问题](/faq/high-availability-faq.md)
  • [TiDB 高可靠常见问题](/faq/high-reliability-faq.md)
| -| 常见错误码 | [错误码与故障诊断](/error-codes.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 分类 | 相关文档 | ++:==================================+:===================================================================================================+ +| 产品架构和原理 | [产品架构常见问题](/faq/tidb-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 安装部署 | - [安装部署常见问题](/faq/deploy-and-maintain-faq.md) | +| | - [TiUP 常见问题](/tiup/tiup-faq.md) | +| | - [Kubernetes 上的 TiDB 集群常见问题](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/faq) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 数据迁移 | - [数据迁移常见问题](/faq/migration-tidb-faq.md) | +| | - 数据导入 | +| | - [TiDB Lightning 常见问题](/tidb-lightning/tidb-lightning-faq.md) | +| | - [TiDB Data Migration 常见问题](/dm/dm-faq.md) | +| | - 增量数据同步 | +| | - [TiCDC 常见问题解答](/ticdc/ticdc-faq.md) | +| | - [TiDB Binlog 常见问题](/tidb-binlog/tidb-binlog-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 数据备份与恢复 | [备份与恢复常见问题](/faq/backup-and-restore-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| SQL 使用 | [SQL 操作常见问题](/faq/sql-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 集群升级 | [TiDB 集群升级常见问题](/faq/upgrade-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 集群管理 | [TiDB 集群管理常见问题](/faq/manage-cluster-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 监控报警 | - [TiDB 监控常见问题](/faq/monitor-faq.md) | +| | - [TiDB Dashboard 常见问题](/dashboard/dashboard-faq.md) | +| | - [TiDB 集群报警规则](/alert-rules.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 高可用和高可靠 | - [TiDB 高可用常见问题](/faq/high-availability-faq.md) | +| | - [TiDB 高可靠常见问题](/faq/high-reliability-faq.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ +| 常见错误码 | [错误码与故障诊断](/error-codes.md) | ++-----------------------------------+----------------------------------------------------------------------------------------------------+ diff --git a/faq/high-reliability-faq.md b/faq/high-reliability-faq.md index 6685e2912d39..f36d72f37ade 100644 --- a/faq/high-reliability-faq.md +++ b/faq/high-reliability-faq.md @@ -1,43 +1,43 @@ ---- -title: 高可靠常见问题 -summary: 介绍高可靠相关的常见问题。 ---- - -# 高可靠常见问题 - -本文档介绍高可靠相关的常见问题。 - -## TiDB 是否支持数据加密? - -支持。要加密传输中的数据,可以[在 TiDB 客户端和服务器之间启用 TLS](/enable-tls-between-clients-and-servers.md)。要加密存储引擎中的数据,可以启用[透明数据加密 (TDE)](/encryption-at-rest.md)。 - -## 我们的安全漏洞扫描工具对 MySQL version 有要求,TiDB 是否支持修改 server 版本号呢? - -TiDB 在 v3.0.8 后支持通过 TiDB 配置文件中的 [`server-version`](/tidb-configuration-file.md#server-version) 配置项来修改 server 版本号。 - -对于 v4.0 及以上版本的集群,如果使用 TiUP 部署集群,可以通过 `tiup cluster edit-config ` 修改配置文件中以下部分来设置合适的版本号: - -``` -server_configs: - tidb: - server-version: 'YOUR_VERSION_STRING' -``` - -修改完成后,使用 `tiup cluster reload -R tidb` 命令使得以上修改生效,以避免出现安全漏洞扫描不通过的问题。 - -## TiDB 支持哪些认证协议?过程是怎样的? - -TiDB 和 MySQL 一样,在用户登录认证时使用 SASL 认证协议对密码进行处理。 - -客户端连接 TiDB 的时候,使用 challenge-response(挑战-应答)的认证模式,过程如下: - -1. 客户端连接服务器。 -2. 服务器发送随机字符串 `challenge` 给客户端。 -3. 客户端发送 `username` + `response` 给服务器。 -4. 服务器验证 `response`。 - -## 如何修改用户名密码和权限? - -因为 TiDB 是分布式数据库,想要在 TiDB 中修改用户密码,建议使用 `ALTER USER` 的方法,例如 `ALTER USER 'test'@'localhost' IDENTIFIED BY 'mypass';`。 - -不推荐使用 `UPDATE mysql.user` 的方法,因为这种方法可能会造成其它节点刷新不及时的情况。修改权限也一样,建议参考 [TiDB 用户账户管理](/user-account-management.md)文档中的方法。 +--- +title: 高可靠常见问题 +summary: 介绍高可靠相关的常见问题。 +--- + +# 高可靠常见问题 + +本文档介绍高可靠相关的常见问题。 + +## TiDB 是否支持数据加密? + +支持。要加密传输中的数据,可以[在 TiDB 客户端和服务器之间启用 TLS](/enable-tls-between-clients-and-servers.md)。要加密存储引擎中的数据,可以启用[透明数据加密 (TDE)](/encryption-at-rest.md)。 + +## 我们的安全漏洞扫描工具对 MySQL version 有要求,TiDB 是否支持修改 server 版本号呢? + +TiDB 在 v3.0.8 后支持通过 TiDB 配置文件中的 [`server-version`](/tidb-configuration-file.md#server-version) 配置项来修改 server 版本号。 + +对于 v4.0 及以上版本的集群,如果使用 TiUP 部署集群,可以通过 `tiup cluster edit-config ` 修改配置文件中以下部分来设置合适的版本号: + +``` +server_configs: + tidb: + server-version: 'YOUR_VERSION_STRING' +``` + +修改完成后,使用 `tiup cluster reload -R tidb` 命令使得以上修改生效,以避免出现安全漏洞扫描不通过的问题。 + +## TiDB 支持哪些认证协议?过程是怎样的? + +TiDB 和 MySQL 一样,在用户登录认证时使用 SASL 认证协议对密码进行处理。 + +客户端连接 TiDB 的时候,使用 challenge-response(挑战-应答)的认证模式,过程如下: + +1. 客户端连接服务器。 +2. 服务器发送随机字符串 `challenge` 给客户端。 +3. 客户端发送 `username` + `response` 给服务器。 +4. 服务器验证 `response`。 + +## 如何修改用户名密码和权限? + +因为 TiDB 是分布式数据库,想要在 TiDB 中修改用户密码,建议使用 `ALTER USER` 的方法,例如 `ALTER USER 'test'@'localhost' IDENTIFIED BY 'mypass';`。 + +不推荐使用 `UPDATE mysql.user` 的方法,因为这种方法可能会造成其它节点刷新不及时的情况。修改权限也一样,建议参考 [TiDB 用户账户管理](/user-account-management.md)文档中的方法。 diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 7f8b450deeda..f44cef1f5246 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -1,408 +1,408 @@ ---- -title: SQL 操作常见问题 -summary: 介绍 SQL 操作相关的常见问题。 ---- - -# SQL 操作常见问题 - -本文档介绍 TiDB 中常见的 SQL 操作问题。 - -## TiDB 是否支持二级键? - -支持。你可以在具有唯一[二级索引](/develop/dev-guide-create-secondary-indexes.md)的非主键列上设置 [`NOT NULL` 约束](/constraints.md#非空约束)。在这种情况下,该列用作二级键。 - -## TiDB 在对大表执行 DDL 操作时,性能表现如何? - -TiDB 在对大表执行 DDL 操作时,一般不会有什么问题。TiDB 支持在线 DDL 操作,且这些 DDL 操作不会阻塞 DML 操作。 - -对于添加列、删除列或删除索引等 DDL 操作,TiDB 可以快速完成这些操作。 - -对于添加索引等 DDL 操作,TiDB 需要进行回填 (backfill) 操作,这个过程需要较长的时间(取决于表的大小)和额外的资源消耗。对在线业务的影响可调节。TiDB 可以通过多线程进行 backfill,资源消耗可通过以下系统变量进行设置: - -- [`tidb_ddl_reorg_worker_cnt`](/system-variables.md#tidb_ddl_reorg_worker_cnt) -- [`tidb_ddl_reorg_priority`](/system-variables.md#tidb_ddl_reorg_priority) -- [`tidb_ddl_error_count_limit`](/system-variables.md#tidb_ddl_error_count_limit) -- [`tidb_ddl_reorg_batch_size`](/system-variables.md#tidb_ddl_reorg_batch_size) - -## 如何选择正确的查询计划?是否需要使用优化器提示?还是可以使用提示? - -TiDB 包含一个基于成本的优化器。在大多数情况下,优化器会为你选择最优的查询计划。如果优化器工作欠佳,你可以使用[优化器提示](/optimizer-hints.md)来干预优化器。 - -另外,你还可以使用[执行计划绑定](/sql-plan-management.md#执行计划绑定-sql-binding)来为特定的 SQL 语句固定查询计划。 - -## 如何阻止特定的 SQL 语句执行(或者将某个 SQL 语句加入黑名单)? - -你可以使用 [`MAX_EXECUTION_TIME`](/optimizer-hints.md#max_execution_timen) Hint 来创建 [SQL 绑定](/sql-plan-management.md#执行计划绑定-sql-binding),将特定语句的执行时间限制为一个较小的值(例如 1ms)。这样,语句就会在超过限制时自动终止。 - -例如,要阻止执行 `SELECT * FROM t1, t2 WHERE t1.id = t2.id`,可以使用以下 SQL 绑定将语句的执行时间限制为 1ms: - -```sql -CREATE GLOBAL BINDING for - SELECT * FROM t1, t2 WHERE t1.id = t2.id -USING - SELECT /*+ MAX_EXECUTION_TIME(1) */ * FROM t1, t2 WHERE t1.id = t2.id; -``` - -> **注意:** -> -> `MAX_EXECUTION_TIME` 的精度大约为 100ms。在 TiDB 终止 SQL 语句之前,TiKV 中的任务可能已经开始执行。为了减少这种情况下 TiKV 的资源消耗,建议将系统变量 [`tidb_enable_paging`](/system-variables.md#tidb_enable_paging-从-v540-版本开始引入) 的值设置为 `ON`。 - -删除该 SQL 绑定可以移除限制。 - -```sql -DROP GLOBAL BINDING for - SELECT * FROM t1, t2 WHERE t1.id = t2.id; -``` - -## TiDB 对哪些 MySQL variables 兼容? - -详细可参考[系统变量](/system-variables.md)。 - -## 省略 `ORDER BY` 条件时 TiDB 中返回结果的顺序与 MySQL 中的不一致 - -这不是 bug。返回结果的顺序视不同情况而定,不保证顺序统一。 - -MySQL 中,返回结果的顺序可能较为固定,因为查询是通过单线程执行的。但升级到新版本后,查询计划也可能变化。无论是否期待返回结果有序,都推荐使用 `ORDER BY` 条件。 - -[ISO/IEC 9075:1992, Database Language SQL- July 30, 1992](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 对此有如下表述: - -> If an `` is not specified, then the table specified by the `` is T and the ordering of rows in T is implementation-dependent.(如果未指定 ``,通过 `` 指定的表为 T,那么 T 表中的行顺序视执行情况而定。) - -以下两条查询的结果都是合法的: - -```sql -> select * from t; -+------+------+ -| a | b | -+------+------+ -| 1 | 1 | -| 2 | 2 | -+------+------+ -2 rows in set (0.00 sec) -``` - -```sql -> select * from t; -- 不确定返回结果的顺序 -+------+------+ -| a | b | -+------+------+ -| 2 | 2 | -| 1 | 1 | -+------+------+ -2 rows in set (0.00 sec) -``` - -如果 `ORDER BY` 中使用的列不是唯一列,就无法确定该语句返回结果的顺序。在以下示例中,`a` 列有重复值,因此只有 `ORDER BY a, b` 能确定返回结果的顺序。 - -```sql -> select * from t order by a; -+------+------+ -| a | b | -+------+------+ -| 1 | 1 | -| 2 | 1 | -| 2 | 2 | -+------+------+ -3 rows in set (0.00 sec) -``` - -在以下示例中,`order by a` 能确定 a 列的顺序,但不能确定 b 列的顺序。 - -```sql -> select * from t order by a; -+------+------+ -| a | b | -+------+------+ -| 1 | 1 | -| 2 | 2 | -| 2 | 1 | -+------+------+ -3 rows in set (0.00 sec) -``` - -在 TiDB 中,你还可以使用系统变量 [`tidb_enable_ordered_result_mode`](/system-variables.md#tidb_enable_ordered_result_mode) 来指定是否对最终的输出结果进行自动排序。 - -## TiDB 是否支持 `SELECT FOR UPDATE`? - -支持。当 TiDB 使用悲观锁(自 TiDB v3.0.8 起默认使用)时,TiDB 中 `SELECT FOR UPDATE` 的行为与 MySQL 中的基本一致。 - -当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时对数据加锁,而是在提交事务时检查冲突。如果检查出冲突,会回滚待提交的事务。 - -详情参考 [SELECT 语句语法元素说明](/sql-statements/sql-statement-select.md#语法元素说明)。 - -## TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? - -TiDB 字符集默认就是 UTF8 而且目前只支持 UTF8,字符串就是 memcomparable 格式的。 - -## 一个事务中的语句数量最大是多少? - -一个事务中的语句数量,默认限制最大为 5000 条。 - -在使用乐观事务并开启事务重试的情况下,默认限制 5000,可通过 [`stmt-count-limit`](/tidb-configuration-file.md#stmt-count-limit) 调整。 - -## TiDB 中,为什么出现后插入数据的自增 ID 反而小? - -TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB server 上同时插入数据,分配的自增 ID 会不连续。当多个线程并发往不同的 TiDB server 插入数据的时候,有可能会出现后插入的数据自增 ID 小的情况。此外,TiDB 允许给整型类型的字段指定 AUTO_INCREMENT,且一个表只允许一个属性为 `AUTO_INCREMENT` 的字段。详情可参考[自增 ID](/mysql-compatibility.md#自增-id)和 [AUTO_INCREMENT](/auto-increment.md)。 - -## 如何在 TiDB 中修改 `sql_mode`? - -TiDB 支持在会话或全局作用域上修改 [`sql_mode`](/system-variables.md#sql_mode) 系统变量。 - -- 对全局作用域变量的修改,设置后将作用于集群中的其它服务器,并且重启后更改依然有效。因此,你无需在每台 TiDB 服务器上都更改 `sql_mode` 的值。 -- 对会话作用域变量的修改,设置后只影响当前会话,重启后更改消失。 - -## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? - -问题原因:在 Sqoop 中,`--batch` 是指每个批次提交 100 条 statement,但是默认每个 statement 包含 100 条 SQL 语句,所以此时 100 * 100 = 10000 条 SQL 语句,超出了 TiDB 的事务限制 5000 条。 - -解决办法: - -- 增加选项 `-Dsqoop.export.records.per.statement=10`,完整的用法如下: - - ```bash - sqoop export \ - -Dsqoop.export.records.per.statement=10 \ - --connect jdbc:mysql://mysql.example.com/sqoop \ - --username sqoop ${user} \ - --password ${passwd} \ - --table ${tab_name} \ - --export-dir ${dir} \ - --batch - ``` - -- 也可以选择增大 TiDB 的单个事物语句数量限制,不过此操作会导致内存增加。详情参见 [SQL 语句的限制](/tidb-limitations.md#sql-statements-的限制)。 - -## TiDB 有像 Oracle 那样的 Flashback Query 功能么,DDL 支持么? - -有,也支持 DDL。详细参考[使用 AS OF TIMESTAMP 语法读取历史数据](/as-of-timestamp.md)。 - -## TiDB 中删除数据后会立即释放空间吗? - -在 TiDB 中使用 `DELETE`,`TRUNCATE` 和 `DROP` 语句删除数据都不会立即释放空间。对于 `TRUNCATE` 和 `DROP` 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作,TiDB 的 GC 机制会删除数据,但不会立即释放空间,而是等到后续进行 compaction 时释放空间。 - -## 删除数据后查询速度为何会变慢? - -删除大量数据后,会有很多无用的 key 存在,影响查询效率。要解决该问题,可以尝试开启 [Region Merge](/best-practices/massive-regions-best-practices.md#方法五开启-region-merge) 功能,具体可参考[最佳实践](https://pingcap.com/blog-cn/tidb-best-practice/)中的删除数据部分。 - -## 对数据做删除操作之后,空间回收比较慢,如何处理? - -TiDB 采用了多版本并发控制 (MVCC) 机制,当新写入的数据覆盖旧的数据时,旧的数据不会被替换掉,而是与新写入的数据同时保留,并以时间戳来区分版本。为了使并发事务能查看到早期版本的数据,删除数据时 TiDB 不会立即回收空间,而是等待一段时间后再进行垃圾回收 (GC)。要配置历史数据的保留时限,你可以修改系统变量 [`tidb_gc_life_time`](/system-variables.md#tidb_gc_life_time-从-v50-版本开始引入)的值(默认值为 `10m0s`)。 - -## `SHOW PROCESSLIST` 是否显示系统进程号? - -TiDB 中的 `SHOW PROCESSLIST` 与 MySQL 中的 `SHOW PROCESSLIST` 显示内容基本一致,不会显示系统进程号。而返回结果中的 ID 表示当前的 session ID。其中 TiDB 的 `SHOW PROCESSLIST` 和 MySQL 的 `SHOW PROCESSLIST` 区别如下: - -+ 由于 TiDB 是分布式数据库,TiDB server 实例是无状态的 SQL 解析和执行引擎(详情可参考 [TiDB 整体架构](/tidb-architecture.md)),用户使用 MySQL 客户端登录的是哪个 TiDB server,`SHOW PROCESSLIST` 就会显示当前连接的这个 TiDB server 中执行的 session 列表,不是整个集群中运行的全部 session 列表;而 MySQL 是单机数据库,`SHOW PROCESSLIST` 列出的是当前整个 MySQL 数据库的全部执行 SQL 列表。 - -+ 在查询执行期间,TiDB 中的 `State` 列不会持续更新。由于 TiDB 支持并行查询,每个语句可能同时处于多个状态,因此很难显示为某一种状态。 - -## 在 TiDB 中如何控制或改变 SQL 提交的执行优先级? - -TiDB 支持改变[全局](/system-variables.md#tidb_force_priority)或单个语句的优先级。优先级包括: - -- `HIGH_PRIORITY`:该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句 -- `LOW_PRIORITY`:该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级 -- `DELAYED`:该语句为正常优先级语句,TiDB 不强制改变这条语句的优先级,与 `tidb_force_priority` 设置为 `NO_PRIORITY` 相同 - -以上两种参数可以结合 TiDB 的 DML 语言进行使用,使用方法举例如下: - -1. 通过在数据库中写 SQL 的方式来调整优先级: - - ```sql - SELECT HIGH_PRIORITY | LOW_PRIORITY | DELAYED COUNT(*) FROM table_name; - INSERT HIGH_PRIORITY | LOW_PRIORITY | DELAYED INTO table_name insert_values; - DELETE HIGH_PRIORITY | LOW_PRIORITY | DELAYED FROM table_name; - UPDATE HIGH_PRIORITY | LOW_PRIORITY | DELAYED table_reference SET assignment_list WHERE where_condition; - REPLACE HIGH_PRIORITY | LOW_PRIORITY | DELAYED INTO table_name; - ``` - -2. 全表扫会自动调整为低优先级,[`ANALYZE`](/sql-statements/sql-statement-analyze-table.md) 也是默认低优先级。 - -## 在 TiDB 中 auto analyze 的触发策略是怎样的? - -触发策略:如果一张新表达到 1000 条记录,并且在 1 分钟内没有写入,会自动触发。 - -当表的(修改数/当前总行数)比例大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启触发 auto analyze。为了保险起见,在开启 auto analyze 的时候,`tidb_auto_analyze_ratio` 的最小值为 0.3。但是该变量值不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 - -你可以用系统变量 [`tidb_enable_auto_analyze`](/system-variables.md#tidb_enable_auto_analyze-从-v610-版本开始引入) 关闭 auto analyze。 - -## 可以使用 Optimizer Hints 控制优化器行为吗? - -在 TiDB 中,你可以用多种方法控制查询优化器的默认行为,包括使用 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行计划管理 (SPM)](/sql-plan-management.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,例如:`select column_name from table_name use index(index_name)where where_condition;`。 - -## DDL 执行 - -本节列出了 DDL 语句执行的相关问题。DDL 执行原理的详细说明,参见 [TiDB 中 DDL 执行原理及最佳实践](/ddl-introduction.md)。 - -### 各类 DDL 操作的预估耗时是多长? - -假设 DDL 操作没有被阻塞,各个 TiDB server 能够正常更新 Schema 版本,DDL Owner 节点正常运行。在此情况下,各类 DDL 操作的预估耗时如下: - -| DDL 操作类型 | 预估耗时 | -|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------| -| Reorg DDL:例如 `ADD INDEX`、`MODIFY COLUMN`(Reorg 类型的数据更改) | 取决于数据量、系统负载以及 DDL 参数的设置 | -| General DDL(除 Reorg DDL 外的 DDL 类型):例如 `CREATE DATABASE`、`CREATE TABLE`、`DROP DATABASE`、`DROP TABLE`、`TRUNCATE TABLE`、`ALTER TABLE ADD`、`ALTER TABLE DROP`、`MODIFY COLUMN`(只更改元数据)、`DROP INDEX` | 1 秒左右 | - -> **注意:** -> -> 以上为各类操作的预估耗时,请以实际操作耗时为准。 - -## 执行 DDL 会慢的可能原因 - -- 在一个用户会话中,DDL 语句之前有非 auto-commit 的 DML 语句,并且该 DML 语句的提交操作比较慢,会导致 DDL 语句执行慢。即执行 DDL 语句前,会先提交之前没有提交的 DML 语句。 -- 多个 DDL 语句一起执行的时候,后面的几个 DDL 语句可能会比较慢,因为可能需要排队等待。排队场景包括: - - 同一类型 DDL 语句需要排队(例如 `CREATE TABLE` 和 `CREATE DATABASE` 都是 General DDL,两个操作同时执行时,需要排队)。自 TiDB v6.2.0 起,支持并行 DDL 语句,但为了避免 DDL 使用过多 TiDB 的计算资源,也有并发度限制,因此会有一定的排队情况。 - - 对同一张表上执行的 DDL 操作存在依赖关系,后面的 DDL 语句需要等待前面的 DDL 操作完成。 -- 在集群正常启动后,第一个 DDL 操作的执行时间可能会比较久,可能是因为 DDL 模块在进行 DDL Owner 的选举。 - -- 终止 TiDB 时,TiDB 不能与 PD 正常通信(包括停电的情况),或者用 `kill -9` 命令终止 TiDB 导致 TiDB 没有及时从 PD 清理注册数据。 -- 集群中某个 TiDB 与 PD 或者 TiKV 之间发生通信问题,即 TiDB 不能及时获取最新版本信息。 - -### 触发 Information schema is changed 错误的原因? - -TiDB 在执行 SQL 语句时,会根据隔离级别确定一个对象的 `schema` 版本来处理该 SQL 语句,而且 TiDB 支持在线异步变更 DDL。那么,在执行 DML 的时候可能有 DDL 语句也在执行,而你需要确保每个 SQL 语句在同一个 `schema` 上执行。所以当执行 DML 时,如果遇到正在执行中的 DDL 操作,TiDB 可能会报 `Information schema is changed` 的错误。 - -从 v6.4.0 开始,TiDB 实现了[元数据锁机制](/metadata-lock.md),可以让 DML 语句的执行和 DDL Schema 变更协同进行,可以避免大部分 `Information schema is changed` 错误的发生。 - -报错的可能原因如下: - -- 原因 1:正在执行的 DML 所涉及的表和集群中正在执行的 DDL 的表有相同的,那么这个 DML 语句就会报此错。可以通过命令 `admin show ddl job` 查看正在执行的 DDL 操作。 -- 原因 2:这个 DML 执行时间很久,而这段时间内执行了很多 DDL 语句,导致中间 `schema` 版本变更次数超过 1024 (此为默认值,可以通过 `tidb_max_delta_schema_count` 变量修改)。 -- 原因 3:接受 DML 请求的 TiDB 长时间不能加载到 `schema information`(TiDB 与 PD 或 TiKV 之间的网络连接故障等会导致此问题),而这段时间内执行了很多 DDL 语句,导致中间 `schema` 版本变更次数超过 100。 -- 原因 4:TiDB 重启后执行第一个 DDL 操作前,执行 DML 操作,并且在执行过程中遇到了第 1 个 DDL 操作(即在执行第 1 个 DDL 操作前,启动该 DML 对应的事务,且在该 DDL 变更第一个 `schema` 版本后,提交该 DML 对应的事务),那么这个 DML 会报此错。 - -以上原因中,只有原因 1 与表有关。原因 1 和原因 2 都不会导致业务问题,相应的 DML 会在失败后重试。对于原因 3,需要检查 TiDB 实例和 PD 及 TiKV 的网络情况。 - -> **注意:** -> -> + 目前 TiDB 未缓存所有的 `schema` 版本信息。 -> + 对于每个 DDL 操作,`schema` 版本变更的数量与对应 `schema state` 变更的次数一致。 -> + 不同的 DDL 操作版本变更次数不一样。例如,`create table` 操作会有 1 次 `schema` 版本变更;`add column` 操作有 4 次 `schema` 版本变更。 - -### 触发 Information schema is out of date 错误的原因? - -在 v6.5.0 之前,当执行 DML 时,TiDB 超过一个 DDL lease 时间(默认 45s)没能加载到最新的 schema 就可能会报 `Information schema is out of date` 的错误。遇到此错的可能原因如下: - -- 执行此 DML 的 TiDB 被 kill 后准备退出,且此 DML 对应的事务执行时间超过一个 DDL lease,在事务提交时会报这个错误。 -- TiDB 在执行此 DML 时,有一段时间内连不上 PD 或者 TiKV,导致 TiDB 超过一个 DDL lease 时间没有 load schema,或者导致 TiDB 断开与 PD 之间带 keep alive 设置的连接。 - -### 高并发情况下执行 DDL 时报错的原因? - -高并发场景下执行 DDL 语句(比如批量建表)时,极少部分的 DDL 语句可能会由于并发执行时 key 冲突而执行失败。 - -并发执行 DDL 语句时,建议将 DDL 语句数量保持在 20 以下,否则你需要在应用端重试失败的 DDL 语句。 - -### DDL 执行被阻塞的原因 - -在 TiDB v6.2.0 前,TiDB 按照 DDL 语句类型将 DDL 分配到两个先入先出的队列中,即 Reorg DDL 进入 Reorg 队列中,General DDL 进入 general 队列中。由于先入先出以及同一张表上的 DDL 语句需要串行执行,多个 DDL 语句在执行过程中可能会出现阻塞的问题。 - -例如对于以下 DDL 语句: - -- DDL 1:`CREATE INDEX idx on t(a int);` -- DDL 2:`ALTER TABLE t ADD COLUMN b int;` -- DDL 3:`CREATE TABLE t1(a int);` - -由于队列先入先出的限制,DDL 3 需要等待 DDL 2 执行。同时又因为同一张表上的 DDL 语句需要串行执行,DDL 2 需要等待 DDL 1 执行。因此,DDL 3 需要等待 DDL 1 先执行完,即使它们操作在不同的表上。 - -在 TiDB v6.2.0 及之后的版本中,TiDB DDL 模块采用了并发框架。在并发的框架下,不再有同一个队列先进先出的问题,而是从所有 DDL 任务中选出可以执行的 DDL 来执行。并且对 Reorg worker 的数量进行了扩充,大概为节点 `CPU/4`,这使得在并发框架中 TiDB 可以同时为多张表建索引。 - -无论是新集群还是从旧版本升级的集群,在 TiDB v6.2 及以上版本中,TiDB 都会自动使用并发框架,用户无需进行调整。 - -### 定位 DDL 执行卡住的问题 - -1. 先排除 DDL 语句通常执行慢的可能原因。 -2. 使用以下任一方法找出 DDL owner 节点: - + 通过 `curl http://{TiDBIP}:10080/info/all` 获取当前集群的 Owner - + 通过监控 **DDL** > **DDL META OPM** 查看某个时间段的 Owner - -- 如果 Owner 不存在,尝试手动触发 Owner 选举:`curl -X POST http://{TiDBIP}:10080/ddl/owner/resign`。 -- 如果 Owner 存在,导出 Goroutine 堆栈并检查可能卡住的地方。 - -## SQL 优化 - -### TiDB 执行计划解读 - -详细解读[理解 TiDB 执行计划](/explain-overview.md)。 - -### 统计信息收集 - -详细解读[统计信息](/statistics.md)。 - -### Count 如何加速? - -Count 就是暴力扫表,提高并发度能显著提升扫表速度。如要调整并发度,可以使用 `tidb_distsql_scan_concurrency` 变量,但调整并发度需要同时考虑 CPU 和 I/O 资源。TiDB 每次执行查询时,都要访问 TiKV。在数据量小的情况下,MySQL 的数据都在内存里,而 TiDB 还需要进行一次网络访问。 - -加速建议: - -- 提升硬件配置,可以参考[部署建议](/hardware-and-software-requirements.md)。 -- 提升并发度,默认是 10,可以尝试提升到 50,但是一般提升幅度在 2-4 倍之间。 -- 测试大数据量的 count。 -- 调优 TiKV 配置,可以参考[性能调优](/tune-tikv-memory-performance.md)。 -- 参考[下推计算结果缓存](/coprocessor-cache.md)。 - -### 查看当前 DDL 的进度? - -通过 `ADMIN SHOW DDL` 语句查看当前 job 进度。操作如下: - -```sql -ADMIN SHOW DDL; -``` - -```sql -*************************** 1. row *************************** - SCHEMA_VER: 140 - OWNER: 1a1c4174-0fcd-4ba0-add9-12d08c4077dc -RUNNING_JOBS: ID:121, Type:add index, State:running, SchemaState:write reorganization, SchemaID:1, TableID:118, RowCount:77312, ArgLen:0, start time: 2018-12-05 16:26:10.652 +0800 CST, Err:, ErrCount:0, SnapshotVersion:404749908941733890 - SELF_ID: 1a1c4174-0fcd-4ba0-add9-12d08c4077dc -``` - -从以上返回结果可知,当前正在处理的是 `ADD INDEX` 操作。且从 `RUNNING_JOBS` 列的 `RowCount` 字段可以知道当前 `ADD INDEX` 操作已经添加了 77312 行索引。 - -### 如何查看 DDL job? - -可以使用 `ADMIN SHOW DDL` 语句查看正在运行的 DDL 作业。 - -- `ADMIN SHOW DDL JOBS`:用于查看当前 DDL 作业队列中的所有结果(包括正在运行以及等待运行的任务)以及已执行完成的 DDL 作业队列中的最近十条结果。 -- `ADMIN SHOW DDL JOBS QUERIES 'job_id' [, 'job_id'] ...`:用于显示 `job_id` 对应的 DDL 任务的原始 SQL 语句。此 `job_id` 只搜索正在执行中的任务以及 DDL 历史作业队列中的最近十条结果。 - -### TiDB 是否支持基于 COST 的优化 (CBO)?如果支持,实现到什么程度? - -是的,TiDB 基于成本的优化器 (CBO) 对代价模型、统计信息进行持续优化。除此之外,TiDB 还支持 hash join、sort-merge join 等 join 算法。 - -### 如何确定某张表是否需要做 analyze ? - -可以通过 `SHOW STATS_HEALTHY` 来查看 Healthy 字段,一般该字段值小于等于 60 的表需要做 analyze。 - -### SQL 的执行计划展开成了树,ID 的序号有什么规律吗?这棵树的执行顺序会是怎么样的? - -ID 没什么规律,只要是唯一就行。不过在生成执行计划时,有一个计数器,生成一个计划 ID 后序号就加 1,执行的顺序和序号无关。整个执行计划是一颗树,执行时从根节点开始,不断地向上返回数据。要理解执行计划,请参考[理解 TiDB 执行计划](/explain-overview.md)。 - -### TiDB 执行计划中,task cop 在一个 root 下,这个是并行的吗? - -目前 TiDB 的计算任务隶属于两种不同的 task:cop task 和 root task。cop task 是指被下推到 KV 端分布式执行的计算任务,root task 是指在 TiDB 端单点执行的计算任务。 - -一般来讲 root task 的输入数据是来自于 cop task 的,但是 root task 在处理数据的时候,TiKV 上的 cop task 也可以同时处理数据,等待 TiDB 的 root task 拉取。所以从这个过程来看,root task 和 cop task 是并行的,同时存在数据上下游关系。 - -在执行的过程中,某些时间段也可能是并行的,第一个 cop task 在处理 [100, 200] 的数据,第二个 cop task 在处理 [1, 100] 的数据。执行计划的理解,请参考[理解 TiDB 执行计划](/explain-overview.md)。 - -## 数据库优化 - -### TiDB 参数及调整 - -详情参考 [TiDB 配置参数](/command-line-flags-for-tidb-configuration.md)。 - -### 如何避免热点问题并实现负载均衡?TiDB 中是否有热分区或热范围问题? - -要了解热点问题的场景,请参考[常见热点问题](/troubleshoot-hot-spot-issues.md#常见热点场景)。TiDB 的以下特性旨在帮助解决热点问题: - -- [`SHARD_ROW_ID_BITS`](/troubleshoot-hot-spot-issues.md#使用-shard_row_id_bits-处理热点表) 属性。设置该属性后,行 ID 会被打散并写入多个 Region,以缓解写入热点问题。 -- [`AUTO_RANDOM`](/troubleshoot-hot-spot-issues.md#使用-auto_random-处理自增主键热点表) 属性,用于解决自增主键带来的热点问题。 -- [Coprocessor Cache](/coprocessor-cache.md),针对小表的读热点问题。 -- [Load Base Split](/configure-load-base-split.md),针对因 Region 访问不均衡(例如小表全表扫)而导致的热点问题。 -- [缓存表](/cached-tables.md),针对被频繁访问但更新较少的小热点表。 - -如果你遇到因热点引起的性能问题,可参考[处理热点问题](/troubleshoot-hot-spot-issues.md)。 - -### TiKV 性能参数调优 - -详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 +--- +title: SQL 操作常见问题 +summary: 介绍 SQL 操作相关的常见问题。 +--- + +# SQL 操作常见问题 + +本文档介绍 TiDB 中常见的 SQL 操作问题。 + +## TiDB 是否支持二级键? + +支持。你可以在具有唯一[二级索引](/develop/dev-guide-create-secondary-indexes.md)的非主键列上设置 [`NOT NULL` 约束](/constraints.md#非空约束)。在这种情况下,该列用作二级键。 + +## TiDB 在对大表执行 DDL 操作时,性能表现如何? + +TiDB 在对大表执行 DDL 操作时,一般不会有什么问题。TiDB 支持在线 DDL 操作,且这些 DDL 操作不会阻塞 DML 操作。 + +对于添加列、删除列或删除索引等 DDL 操作,TiDB 可以快速完成这些操作。 + +对于添加索引等 DDL 操作,TiDB 需要进行回填 (backfill) 操作,这个过程需要较长的时间(取决于表的大小)和额外的资源消耗。对在线业务的影响可调节。TiDB 可以通过多线程进行 backfill,资源消耗可通过以下系统变量进行设置: + +- [`tidb_ddl_reorg_worker_cnt`](/system-variables.md#tidb_ddl_reorg_worker_cnt) +- [`tidb_ddl_reorg_priority`](/system-variables.md#tidb_ddl_reorg_priority) +- [`tidb_ddl_error_count_limit`](/system-variables.md#tidb_ddl_error_count_limit) +- [`tidb_ddl_reorg_batch_size`](/system-variables.md#tidb_ddl_reorg_batch_size) + +## 如何选择正确的查询计划?是否需要使用优化器提示?还是可以使用提示? + +TiDB 包含一个基于成本的优化器。在大多数情况下,优化器会为你选择最优的查询计划。如果优化器工作欠佳,你可以使用[优化器提示](/optimizer-hints.md)来干预优化器。 + +另外,你还可以使用[执行计划绑定](/sql-plan-management.md#执行计划绑定-sql-binding)来为特定的 SQL 语句固定查询计划。 + +## 如何阻止特定的 SQL 语句执行(或者将某个 SQL 语句加入黑名单)? + +你可以使用 [`MAX_EXECUTION_TIME`](/optimizer-hints.md#max_execution_timen) Hint 来创建 [SQL 绑定](/sql-plan-management.md#执行计划绑定-sql-binding),将特定语句的执行时间限制为一个较小的值(例如 1ms)。这样,语句就会在超过限制时自动终止。 + +例如,要阻止执行 `SELECT * FROM t1, t2 WHERE t1.id = t2.id`,可以使用以下 SQL 绑定将语句的执行时间限制为 1ms: + +```sql +CREATE GLOBAL BINDING for + SELECT * FROM t1, t2 WHERE t1.id = t2.id +USING + SELECT /*+ MAX_EXECUTION_TIME(1) */ * FROM t1, t2 WHERE t1.id = t2.id; +``` + +> **注意:** +> +> `MAX_EXECUTION_TIME` 的精度大约为 100ms。在 TiDB 终止 SQL 语句之前,TiKV 中的任务可能已经开始执行。为了减少这种情况下 TiKV 的资源消耗,建议将系统变量 [`tidb_enable_paging`](/system-variables.md#tidb_enable_paging-从-v540-版本开始引入) 的值设置为 `ON`。 + +删除该 SQL 绑定可以移除限制。 + +```sql +DROP GLOBAL BINDING for + SELECT * FROM t1, t2 WHERE t1.id = t2.id; +``` + +## TiDB 对哪些 MySQL variables 兼容? + +详细可参考[系统变量](/system-variables.md)。 + +## 省略 `ORDER BY` 条件时 TiDB 中返回结果的顺序与 MySQL 中的不一致 + +这不是 bug。返回结果的顺序视不同情况而定,不保证顺序统一。 + +MySQL 中,返回结果的顺序可能较为固定,因为查询是通过单线程执行的。但升级到新版本后,查询计划也可能变化。无论是否期待返回结果有序,都推荐使用 `ORDER BY` 条件。 + +[ISO/IEC 9075:1992, Database Language SQL- July 30, 1992](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 对此有如下表述: + +> If an `` is not specified, then the table specified by the `` is T and the ordering of rows in T is implementation-dependent.(如果未指定 ``,通过 `` 指定的表为 T,那么 T 表中的行顺序视执行情况而定。) + +以下两条查询的结果都是合法的: + +```sql +> select * from t; ++------+------+ +| a | b | ++------+------+ +| 1 | 1 | +| 2 | 2 | ++------+------+ +2 rows in set (0.00 sec) +``` + +```sql +> select * from t; -- 不确定返回结果的顺序 ++------+------+ +| a | b | ++------+------+ +| 2 | 2 | +| 1 | 1 | ++------+------+ +2 rows in set (0.00 sec) +``` + +如果 `ORDER BY` 中使用的列不是唯一列,就无法确定该语句返回结果的顺序。在以下示例中,`a` 列有重复值,因此只有 `ORDER BY a, b` 能确定返回结果的顺序。 + +```sql +> select * from t order by a; ++------+------+ +| a | b | ++------+------+ +| 1 | 1 | +| 2 | 1 | +| 2 | 2 | ++------+------+ +3 rows in set (0.00 sec) +``` + +在以下示例中,`order by a` 能确定 a 列的顺序,但不能确定 b 列的顺序。 + +```sql +> select * from t order by a; ++------+------+ +| a | b | ++------+------+ +| 1 | 1 | +| 2 | 2 | +| 2 | 1 | ++------+------+ +3 rows in set (0.00 sec) +``` + +在 TiDB 中,你还可以使用系统变量 [`tidb_enable_ordered_result_mode`](/system-variables.md#tidb_enable_ordered_result_mode) 来指定是否对最终的输出结果进行自动排序。 + +## TiDB 是否支持 `SELECT FOR UPDATE`? + +支持。当 TiDB 使用悲观锁(自 TiDB v3.0.8 起默认使用)时,TiDB 中 `SELECT FOR UPDATE` 的行为与 MySQL 中的基本一致。 + +当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时对数据加锁,而是在提交事务时检查冲突。如果检查出冲突,会回滚待提交的事务。 + +详情参考 [SELECT 语句语法元素说明](/sql-statements/sql-statement-select.md#语法元素说明)。 + +## TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? + +TiDB 字符集默认就是 UTF8 而且目前只支持 UTF8,字符串就是 memcomparable 格式的。 + +## 一个事务中的语句数量最大是多少? + +一个事务中的语句数量,默认限制最大为 5000 条。 + +在使用乐观事务并开启事务重试的情况下,默认限制 5000,可通过 [`stmt-count-limit`](/tidb-configuration-file.md#stmt-count-limit) 调整。 + +## TiDB 中,为什么出现后插入数据的自增 ID 反而小? + +TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB server 上同时插入数据,分配的自增 ID 会不连续。当多个线程并发往不同的 TiDB server 插入数据的时候,有可能会出现后插入的数据自增 ID 小的情况。此外,TiDB 允许给整型类型的字段指定 AUTO_INCREMENT,且一个表只允许一个属性为 `AUTO_INCREMENT` 的字段。详情可参考[自增 ID](/mysql-compatibility.md#自增-id)和 [AUTO_INCREMENT](/auto-increment.md)。 + +## 如何在 TiDB 中修改 `sql_mode`? + +TiDB 支持在会话或全局作用域上修改 [`sql_mode`](/system-variables.md#sql_mode) 系统变量。 + +- 对全局作用域变量的修改,设置后将作用于集群中的其它服务器,并且重启后更改依然有效。因此,你无需在每台 TiDB 服务器上都更改 `sql_mode` 的值。 +- 对会话作用域变量的修改,设置后只影响当前会话,重启后更改消失。 + +## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? + +问题原因:在 Sqoop 中,`--batch` 是指每个批次提交 100 条 statement,但是默认每个 statement 包含 100 条 SQL 语句,所以此时 100 * 100 = 10000 条 SQL 语句,超出了 TiDB 的事务限制 5000 条。 + +解决办法: + +- 增加选项 `-Dsqoop.export.records.per.statement=10`,完整的用法如下: + + ```bash + sqoop export \ + -Dsqoop.export.records.per.statement=10 \ + --connect jdbc:mysql://mysql.example.com/sqoop \ + --username sqoop ${user} \ + --password ${passwd} \ + --table ${tab_name} \ + --export-dir ${dir} \ + --batch + ``` + +- 也可以选择增大 TiDB 的单个事物语句数量限制,不过此操作会导致内存增加。详情参见 [SQL 语句的限制](/tidb-limitations.md#sql-statements-的限制)。 + +## TiDB 有像 Oracle 那样的 Flashback Query 功能么,DDL 支持么? + +有,也支持 DDL。详细参考[使用 AS OF TIMESTAMP 语法读取历史数据](/as-of-timestamp.md)。 + +## TiDB 中删除数据后会立即释放空间吗? + +在 TiDB 中使用 `DELETE`,`TRUNCATE` 和 `DROP` 语句删除数据都不会立即释放空间。对于 `TRUNCATE` 和 `DROP` 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作,TiDB 的 GC 机制会删除数据,但不会立即释放空间,而是等到后续进行 compaction 时释放空间。 + +## 删除数据后查询速度为何会变慢? + +删除大量数据后,会有很多无用的 key 存在,影响查询效率。要解决该问题,可以尝试开启 [Region Merge](/best-practices/massive-regions-best-practices.md#方法五开启-region-merge) 功能,具体可参考[最佳实践](https://pingcap.com/blog-cn/tidb-best-practice/)中的删除数据部分。 + +## 对数据做删除操作之后,空间回收比较慢,如何处理? + +TiDB 采用了多版本并发控制 (MVCC) 机制,当新写入的数据覆盖旧的数据时,旧的数据不会被替换掉,而是与新写入的数据同时保留,并以时间戳来区分版本。为了使并发事务能查看到早期版本的数据,删除数据时 TiDB 不会立即回收空间,而是等待一段时间后再进行垃圾回收 (GC)。要配置历史数据的保留时限,你可以修改系统变量 [`tidb_gc_life_time`](/system-variables.md#tidb_gc_life_time-从-v50-版本开始引入)的值(默认值为 `10m0s`)。 + +## `SHOW PROCESSLIST` 是否显示系统进程号? + +TiDB 中的 `SHOW PROCESSLIST` 与 MySQL 中的 `SHOW PROCESSLIST` 显示内容基本一致,不会显示系统进程号。而返回结果中的 ID 表示当前的 session ID。其中 TiDB 的 `SHOW PROCESSLIST` 和 MySQL 的 `SHOW PROCESSLIST` 区别如下: + ++ 由于 TiDB 是分布式数据库,TiDB server 实例是无状态的 SQL 解析和执行引擎(详情可参考 [TiDB 整体架构](/tidb-architecture.md)),用户使用 MySQL 客户端登录的是哪个 TiDB server,`SHOW PROCESSLIST` 就会显示当前连接的这个 TiDB server 中执行的 session 列表,不是整个集群中运行的全部 session 列表;而 MySQL 是单机数据库,`SHOW PROCESSLIST` 列出的是当前整个 MySQL 数据库的全部执行 SQL 列表。 + ++ 在查询执行期间,TiDB 中的 `State` 列不会持续更新。由于 TiDB 支持并行查询,每个语句可能同时处于多个状态,因此很难显示为某一种状态。 + +## 在 TiDB 中如何控制或改变 SQL 提交的执行优先级? + +TiDB 支持改变[全局](/system-variables.md#tidb_force_priority)或单个语句的优先级。优先级包括: + +- `HIGH_PRIORITY`:该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句 +- `LOW_PRIORITY`:该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级 +- `DELAYED`:该语句为正常优先级语句,TiDB 不强制改变这条语句的优先级,与 `tidb_force_priority` 设置为 `NO_PRIORITY` 相同 + +以上两种参数可以结合 TiDB 的 DML 语言进行使用,使用方法举例如下: + +1. 通过在数据库中写 SQL 的方式来调整优先级: + + ```sql + SELECT HIGH_PRIORITY | LOW_PRIORITY | DELAYED COUNT(*) FROM table_name; + INSERT HIGH_PRIORITY | LOW_PRIORITY | DELAYED INTO table_name insert_values; + DELETE HIGH_PRIORITY | LOW_PRIORITY | DELAYED FROM table_name; + UPDATE HIGH_PRIORITY | LOW_PRIORITY | DELAYED table_reference SET assignment_list WHERE where_condition; + REPLACE HIGH_PRIORITY | LOW_PRIORITY | DELAYED INTO table_name; + ``` + +2. 全表扫会自动调整为低优先级,[`ANALYZE`](/sql-statements/sql-statement-analyze-table.md) 也是默认低优先级。 + +## 在 TiDB 中 auto analyze 的触发策略是怎样的? + +触发策略:如果一张新表达到 1000 条记录,并且在 1 分钟内没有写入,会自动触发。 + +当表的(修改数/当前总行数)比例大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启触发 auto analyze。为了保险起见,在开启 auto analyze 的时候,`tidb_auto_analyze_ratio` 的最小值为 0.3。但是该变量值不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 + +你可以用系统变量 [`tidb_enable_auto_analyze`](/system-variables.md#tidb_enable_auto_analyze-从-v610-版本开始引入) 关闭 auto analyze。 + +## 可以使用 Optimizer Hints 控制优化器行为吗? + +在 TiDB 中,你可以用多种方法控制查询优化器的默认行为,包括使用 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行计划管理 (SPM)](/sql-plan-management.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,例如:`select column_name from table_name use index(index_name)where where_condition;`。 + +## DDL 执行 + +本节列出了 DDL 语句执行的相关问题。DDL 执行原理的详细说明,参见 [TiDB 中 DDL 执行原理及最佳实践](/ddl-introduction.md)。 + +### 各类 DDL 操作的预估耗时是多长? + +假设 DDL 操作没有被阻塞,各个 TiDB server 能够正常更新 Schema 版本,DDL Owner 节点正常运行。在此情况下,各类 DDL 操作的预估耗时如下: + +| DDL 操作类型 | 预估耗时 | +|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------| +| Reorg DDL:例如 `ADD INDEX`、`MODIFY COLUMN`(Reorg 类型的数据更改) | 取决于数据量、系统负载以及 DDL 参数的设置 | +| General DDL(除 Reorg DDL 外的 DDL 类型):例如 `CREATE DATABASE`、`CREATE TABLE`、`DROP DATABASE`、`DROP TABLE`、`TRUNCATE TABLE`、`ALTER TABLE ADD`、`ALTER TABLE DROP`、`MODIFY COLUMN`(只更改元数据)、`DROP INDEX` | 1 秒左右 | + +> **注意:** +> +> 以上为各类操作的预估耗时,请以实际操作耗时为准。 + +## 执行 DDL 会慢的可能原因 + +- 在一个用户会话中,DDL 语句之前有非 auto-commit 的 DML 语句,并且该 DML 语句的提交操作比较慢,会导致 DDL 语句执行慢。即执行 DDL 语句前,会先提交之前没有提交的 DML 语句。 +- 多个 DDL 语句一起执行的时候,后面的几个 DDL 语句可能会比较慢,因为可能需要排队等待。排队场景包括: + - 同一类型 DDL 语句需要排队(例如 `CREATE TABLE` 和 `CREATE DATABASE` 都是 General DDL,两个操作同时执行时,需要排队)。自 TiDB v6.2.0 起,支持并行 DDL 语句,但为了避免 DDL 使用过多 TiDB 的计算资源,也有并发度限制,因此会有一定的排队情况。 + - 对同一张表上执行的 DDL 操作存在依赖关系,后面的 DDL 语句需要等待前面的 DDL 操作完成。 +- 在集群正常启动后,第一个 DDL 操作的执行时间可能会比较久,可能是因为 DDL 模块在进行 DDL Owner 的选举。 + +- 终止 TiDB 时,TiDB 不能与 PD 正常通信(包括停电的情况),或者用 `kill -9` 命令终止 TiDB 导致 TiDB 没有及时从 PD 清理注册数据。 +- 集群中某个 TiDB 与 PD 或者 TiKV 之间发生通信问题,即 TiDB 不能及时获取最新版本信息。 + +### 触发 Information schema is changed 错误的原因? + +TiDB 在执行 SQL 语句时,会根据隔离级别确定一个对象的 `schema` 版本来处理该 SQL 语句,而且 TiDB 支持在线异步变更 DDL。那么,在执行 DML 的时候可能有 DDL 语句也在执行,而你需要确保每个 SQL 语句在同一个 `schema` 上执行。所以当执行 DML 时,如果遇到正在执行中的 DDL 操作,TiDB 可能会报 `Information schema is changed` 的错误。 + +从 v6.4.0 开始,TiDB 实现了[元数据锁机制](/metadata-lock.md),可以让 DML 语句的执行和 DDL Schema 变更协同进行,可以避免大部分 `Information schema is changed` 错误的发生。 + +报错的可能原因如下: + +- 原因 1:正在执行的 DML 所涉及的表和集群中正在执行的 DDL 的表有相同的,那么这个 DML 语句就会报此错。可以通过命令 `admin show ddl job` 查看正在执行的 DDL 操作。 +- 原因 2:这个 DML 执行时间很久,而这段时间内执行了很多 DDL 语句,导致中间 `schema` 版本变更次数超过 1024 (此为默认值,可以通过 `tidb_max_delta_schema_count` 变量修改)。 +- 原因 3:接受 DML 请求的 TiDB 长时间不能加载到 `schema information`(TiDB 与 PD 或 TiKV 之间的网络连接故障等会导致此问题),而这段时间内执行了很多 DDL 语句,导致中间 `schema` 版本变更次数超过 100。 +- 原因 4:TiDB 重启后执行第一个 DDL 操作前,执行 DML 操作,并且在执行过程中遇到了第 1 个 DDL 操作(即在执行第 1 个 DDL 操作前,启动该 DML 对应的事务,且在该 DDL 变更第一个 `schema` 版本后,提交该 DML 对应的事务),那么这个 DML 会报此错。 + +以上原因中,只有原因 1 与表有关。原因 1 和原因 2 都不会导致业务问题,相应的 DML 会在失败后重试。对于原因 3,需要检查 TiDB 实例和 PD 及 TiKV 的网络情况。 + +> **注意:** +> +> + 目前 TiDB 未缓存所有的 `schema` 版本信息。 +> + 对于每个 DDL 操作,`schema` 版本变更的数量与对应 `schema state` 变更的次数一致。 +> + 不同的 DDL 操作版本变更次数不一样。例如,`create table` 操作会有 1 次 `schema` 版本变更;`add column` 操作有 4 次 `schema` 版本变更。 + +### 触发 Information schema is out of date 错误的原因? + +在 v6.5.0 之前,当执行 DML 时,TiDB 超过一个 DDL lease 时间(默认 45s)没能加载到最新的 schema 就可能会报 `Information schema is out of date` 的错误。遇到此错的可能原因如下: + +- 执行此 DML 的 TiDB 被 kill 后准备退出,且此 DML 对应的事务执行时间超过一个 DDL lease,在事务提交时会报这个错误。 +- TiDB 在执行此 DML 时,有一段时间内连不上 PD 或者 TiKV,导致 TiDB 超过一个 DDL lease 时间没有 load schema,或者导致 TiDB 断开与 PD 之间带 keep alive 设置的连接。 + +### 高并发情况下执行 DDL 时报错的原因? + +高并发场景下执行 DDL 语句(比如批量建表)时,极少部分的 DDL 语句可能会由于并发执行时 key 冲突而执行失败。 + +并发执行 DDL 语句时,建议将 DDL 语句数量保持在 20 以下,否则你需要在应用端重试失败的 DDL 语句。 + +### DDL 执行被阻塞的原因 + +在 TiDB v6.2.0 前,TiDB 按照 DDL 语句类型将 DDL 分配到两个先入先出的队列中,即 Reorg DDL 进入 Reorg 队列中,General DDL 进入 general 队列中。由于先入先出以及同一张表上的 DDL 语句需要串行执行,多个 DDL 语句在执行过程中可能会出现阻塞的问题。 + +例如对于以下 DDL 语句: + +- DDL 1:`CREATE INDEX idx on t(a int);` +- DDL 2:`ALTER TABLE t ADD COLUMN b int;` +- DDL 3:`CREATE TABLE t1(a int);` + +由于队列先入先出的限制,DDL 3 需要等待 DDL 2 执行。同时又因为同一张表上的 DDL 语句需要串行执行,DDL 2 需要等待 DDL 1 执行。因此,DDL 3 需要等待 DDL 1 先执行完,即使它们操作在不同的表上。 + +在 TiDB v6.2.0 及之后的版本中,TiDB DDL 模块采用了并发框架。在并发的框架下,不再有同一个队列先进先出的问题,而是从所有 DDL 任务中选出可以执行的 DDL 来执行。并且对 Reorg worker 的数量进行了扩充,大概为节点 `CPU/4`,这使得在并发框架中 TiDB 可以同时为多张表建索引。 + +无论是新集群还是从旧版本升级的集群,在 TiDB v6.2 及以上版本中,TiDB 都会自动使用并发框架,用户无需进行调整。 + +### 定位 DDL 执行卡住的问题 + +1. 先排除 DDL 语句通常执行慢的可能原因。 +2. 使用以下任一方法找出 DDL owner 节点: + + 通过 `curl http://{TiDBIP}:10080/info/all` 获取当前集群的 Owner + + 通过监控 **DDL** > **DDL META OPM** 查看某个时间段的 Owner + +- 如果 Owner 不存在,尝试手动触发 Owner 选举:`curl -X POST http://{TiDBIP}:10080/ddl/owner/resign`。 +- 如果 Owner 存在,导出 Goroutine 堆栈并检查可能卡住的地方。 + +## SQL 优化 + +### TiDB 执行计划解读 + +详细解读[理解 TiDB 执行计划](/explain-overview.md)。 + +### 统计信息收集 + +详细解读[统计信息](/statistics.md)。 + +### Count 如何加速? + +Count 就是暴力扫表,提高并发度能显著提升扫表速度。如要调整并发度,可以使用 `tidb_distsql_scan_concurrency` 变量,但调整并发度需要同时考虑 CPU 和 I/O 资源。TiDB 每次执行查询时,都要访问 TiKV。在数据量小的情况下,MySQL 的数据都在内存里,而 TiDB 还需要进行一次网络访问。 + +加速建议: + +- 提升硬件配置,可以参考[部署建议](/hardware-and-software-requirements.md)。 +- 提升并发度,默认是 10,可以尝试提升到 50,但是一般提升幅度在 2-4 倍之间。 +- 测试大数据量的 count。 +- 调优 TiKV 配置,可以参考[性能调优](/tune-tikv-memory-performance.md)。 +- 参考[下推计算结果缓存](/coprocessor-cache.md)。 + +### 查看当前 DDL 的进度? + +通过 `ADMIN SHOW DDL` 语句查看当前 job 进度。操作如下: + +```sql +ADMIN SHOW DDL; +``` + +```sql +*************************** 1. row *************************** + SCHEMA_VER: 140 + OWNER: 1a1c4174-0fcd-4ba0-add9-12d08c4077dc +RUNNING_JOBS: ID:121, Type:add index, State:running, SchemaState:write reorganization, SchemaID:1, TableID:118, RowCount:77312, ArgLen:0, start time: 2018-12-05 16:26:10.652 +0800 CST, Err:, ErrCount:0, SnapshotVersion:404749908941733890 + SELF_ID: 1a1c4174-0fcd-4ba0-add9-12d08c4077dc +``` + +从以上返回结果可知,当前正在处理的是 `ADD INDEX` 操作。且从 `RUNNING_JOBS` 列的 `RowCount` 字段可以知道当前 `ADD INDEX` 操作已经添加了 77312 行索引。 + +### 如何查看 DDL job? + +可以使用 `ADMIN SHOW DDL` 语句查看正在运行的 DDL 作业。 + +- `ADMIN SHOW DDL JOBS`:用于查看当前 DDL 作业队列中的所有结果(包括正在运行以及等待运行的任务)以及已执行完成的 DDL 作业队列中的最近十条结果。 +- `ADMIN SHOW DDL JOBS QUERIES 'job_id' [, 'job_id'] ...`:用于显示 `job_id` 对应的 DDL 任务的原始 SQL 语句。此 `job_id` 只搜索正在执行中的任务以及 DDL 历史作业队列中的最近十条结果。 + +### TiDB 是否支持基于 COST 的优化 (CBO)?如果支持,实现到什么程度? + +是的,TiDB 基于成本的优化器 (CBO) 对代价模型、统计信息进行持续优化。除此之外,TiDB 还支持 hash join、sort-merge join 等 join 算法。 + +### 如何确定某张表是否需要做 analyze ? + +可以通过 `SHOW STATS_HEALTHY` 来查看 Healthy 字段,一般该字段值小于等于 60 的表需要做 analyze。 + +### SQL 的执行计划展开成了树,ID 的序号有什么规律吗?这棵树的执行顺序会是怎么样的? + +ID 没什么规律,只要是唯一就行。不过在生成执行计划时,有一个计数器,生成一个计划 ID 后序号就加 1,执行的顺序和序号无关。整个执行计划是一颗树,执行时从根节点开始,不断地向上返回数据。要理解执行计划,请参考[理解 TiDB 执行计划](/explain-overview.md)。 + +### TiDB 执行计划中,task cop 在一个 root 下,这个是并行的吗? + +目前 TiDB 的计算任务隶属于两种不同的 task:cop task 和 root task。cop task 是指被下推到 KV 端分布式执行的计算任务,root task 是指在 TiDB 端单点执行的计算任务。 + +一般来讲 root task 的输入数据是来自于 cop task 的,但是 root task 在处理数据的时候,TiKV 上的 cop task 也可以同时处理数据,等待 TiDB 的 root task 拉取。所以从这个过程来看,root task 和 cop task 是并行的,同时存在数据上下游关系。 + +在执行的过程中,某些时间段也可能是并行的,第一个 cop task 在处理 [100, 200] 的数据,第二个 cop task 在处理 [1, 100] 的数据。执行计划的理解,请参考[理解 TiDB 执行计划](/explain-overview.md)。 + +## 数据库优化 + +### TiDB 参数及调整 + +详情参考 [TiDB 配置参数](/command-line-flags-for-tidb-configuration.md)。 + +### 如何避免热点问题并实现负载均衡?TiDB 中是否有热分区或热范围问题? + +要了解热点问题的场景,请参考[常见热点问题](/troubleshoot-hot-spot-issues.md#常见热点场景)。TiDB 的以下特性旨在帮助解决热点问题: + +- [`SHARD_ROW_ID_BITS`](/troubleshoot-hot-spot-issues.md#使用-shard_row_id_bits-处理热点表) 属性。设置该属性后,行 ID 会被打散并写入多个 Region,以缓解写入热点问题。 +- [`AUTO_RANDOM`](/troubleshoot-hot-spot-issues.md#使用-auto_random-处理自增主键热点表) 属性,用于解决自增主键带来的热点问题。 +- [Coprocessor Cache](/coprocessor-cache.md),针对小表的读热点问题。 +- [Load Base Split](/configure-load-base-split.md),针对因 Region 访问不均衡(例如小表全表扫)而导致的热点问题。 +- [缓存表](/cached-tables.md),针对被频繁访问但更新较少的小热点表。 + +如果你遇到因热点引起的性能问题,可参考[处理热点问题](/troubleshoot-hot-spot-issues.md)。 + +### TiKV 性能参数调优 + +详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 diff --git a/functions-and-operators/expressions-pushed-down.md b/functions-and-operators/expressions-pushed-down.md index 9c8ed8046a62..666c9e043fcb 100644 --- a/functions-and-operators/expressions-pushed-down.md +++ b/functions-and-operators/expressions-pushed-down.md @@ -11,20 +11,45 @@ TiFlash 也支持[本页](/tiflash/tiflash-supported-pushdown-calculations.md) ## 已支持下推的表达式列表 -| 表达式分类 | 具体操作 | -| :-------------- | :------------------------------------- | -| [逻辑运算](/functions-and-operators/operators.md#逻辑操作符) | AND (&&), OR (||), NOT (!), XOR | -| [位运算](/functions-and-operators/operators.md#操作符) | [&][operator_bitwise-and], [~][operator_bitwise-invert], [\|][operator_bitwise-or], [^][operator_bitwise-xor], [<<][operator_left-shift], [>>][operator_right-shift] | -| [比较运算](/functions-and-operators/operators.md#比较方法和操作符) | [<][operator_less-than], [<=][operator_less-than-or-equal], [=][operator_equal], [!= (<\>)][operator_not-equal], [>][operator_greater-than], [>=][operator_greater-than-or-equal], [<=>][operator_equal-to], [BETWEEN ... AND ...][operator_between], [COALESCE()][function_coalesce], [IN()][operator_in], [INTERVAL()][function_interval], [IS NOT NULL][operator_is-not-null], [IS NOT][operator_is-not], [IS NULL][operator_is-null], [IS][operator_is], [ISNULL()][function_isnull], [LIKE][operator_like], [NOT BETWEEN ... AND ...][operator_not-between], [NOT IN()][operator_not-in], [NOT LIKE][operator_not-like], [STRCMP()][function_strcmp] | -| [数值运算](/functions-and-operators/numeric-functions-and-operators.md) | [+][operator_plus], [-][operator_minus], [*][operator_times], [/][operator_divide], [DIV][operator_div], [% (MOD)][operator_mod], [-][operator_unary-minus], [ABS()][function_abs], [ACOS()][function_acos], [ASIN()][function_asin], [ATAN()][function_atan], [ATAN2(), ATAN()][function_atan2], [CEIL()][function_ceil], [CEILING()][function_ceiling], [CONV()][function_conv], [COS()][function_cos], [COT()][function_cot], [CRC32()][function_crc32], [DEGREES()][function_degrees], [EXP()][function_exp], [FLOOR()][function_floor], [LN()][function_ln], [LOG()][function_log], [LOG10()][function_log10], [LOG2()][function_log2], [MOD()][function_mod], [PI()][function_pi], [POW()][function_pow], [POWER()][function_power], [RADIANS()][function_radians], [RAND()][function_rand], [ROUND()][function_round], [SIGN()][function_sign], [SIN()][function_sin], [SQRT()][function_sqrt] | -| [控制流运算](/functions-and-operators/control-flow-functions.md) | [CASE][operator_case], [IF()][function_if], [IFNULL()][function_ifnull] | -| [JSON 运算](/functions-and-operators/json-functions.md) | [JSON_ARRAY([val[, val] ...])][json_array],
[JSON_CONTAINS(target, candidate[, path])][json_contains],
[JSON_EXTRACT(json_doc, path[, path] ...)][json_extract],
[JSON_INSERT(json_doc, path, val[, path, val] ...)][json_insert],
[JSON_LENGTH(json_doc[, path])][json_length],
[JSON_MERGE(json_doc, json_doc[, json_doc] ...)][json_merge],
[JSON_OBJECT([key, val[, key, val] ...])][json_object],
[JSON_REMOVE(json_doc, path[, path] ...)][json_remove],
[JSON_REPLACE(json_doc, path, val[, path, val] ...)][json_replace],
[JSON_SET(json_doc, path, val[, path, val] ...)][json_set],
[JSON_TYPE(json_val)][json_type],
[JSON_UNQUOTE(json_val)][json_unquote],
[JSON_VALID(val)][json_valid] | -| [日期运算](/functions-and-operators/date-and-time-functions.md) | [DATE()][function_date], [DATE_FORMAT()][function_date-format], [DATEDIFF()][function_datediff], [DAYOFMONTH()][function_dayofmonth], [DAYOFWEEK()][function_dayofweek], [DAYOFYEAR()][function_dayofyear], [FROM_DAYS()][function_from-days], [HOUR()][function_hour], [MAKEDATE()][function_makedate], [MAKETIME()][function_maketime], [MICROSECOND()][function_microsecond], [MINUTE()][function_minute], [MONTH()][function_month], [MONTHNAME()][function_monthname], [PERIOD_ADD()][function_period-add], [PERIOD_DIFF()][function_period-diff], [SEC_TO_TIME()][function_sec-to-time], [SECOND()][function_second], [SYSDATE()][function_sysdate], [TIME_TO_SEC()][function_time-to-sec], [TIMEDIFF()][function_timediff], [WEEK()][function_week], [WEEKOFYEAR()][function_weekofyear], [YEAR()][function_year] | -| [字符串函数](/functions-and-operators/string-functions.md) | [ASCII()][function_ascii], [BIT_LENGTH()][function_bit-length], [CHAR()][function_char], [CHAR_LENGTH()][function_char-length], [CONCAT()][function_concat], [CONCAT_WS()][function_concat-ws], [ELT()][function_elt], [FIELD()][function_field], [HEX()][function_hex], [LENGTH()][function_length], [LIKE][operator_like], [LTRIM()][function_ltrim], [MID()][function_mid], [NOT LIKE][operator_not-like], [NOT REGEXP][operator_not-regexp], [REGEXP][operator_regexp], [REPLACE()][function_replace], [REVERSE()][function_reverse], [RIGHT()][function_right], [RTRIM()][function_rtrim], [SPACE()][function_space], [STRCMP()][function_strcmp], [SUBSTR()][function_substr], [SUBSTRING()][function_substring] | -| [聚合函数](/functions-and-operators/aggregate-group-by-functions.md#group-by-聚合函数) | [COUNT()][function_count], [COUNT(DISTINCT)][function_count-distinct], [SUM()][function_sum], [AVG()][function_avg], [MAX()][function_max], [MIN()][function_min], [VARIANCE()][function_variance], [VAR_POP()][function_var-pop], [STD()][function_std], [STDDEV()][function_stddev], [STDDEV_POP][function_stddev-pop], [VAR_SAMP()][function_var-samp], [STDDEV_SAMP()][function_stddev-samp], [JSON_ARRAYAGG(key)][json_arrayagg], [JSON_OBJECTAGG(key, value)][function_json-objectagg] | -| [加密和压缩函数](/functions-and-operators/encryption-and-compression-functions.md#加密和压缩函数) | [MD5()][function_md5], [SHA1(), SHA()][function_sha1], [UNCOMPRESSED_LENGTH()][function_uncompressed-length] | -| [Cast 函数](/functions-and-operators/cast-functions-and-operators.md#cast-函数和操作符) | [CAST()][function_cast], [CONVERT()][function_convert] | -| [其他函数](/functions-and-operators/miscellaneous-functions.md#支持的函数) | [UUID()][function_uuid] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 表达式分类 | 具体操作 | ++:==================================================================================================+:===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ +| [逻辑运算](/functions-and-operators/operators.md#逻辑操作符) | AND (&&), OR (||), NOT (!), XOR | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [位运算](/functions-and-operators/operators.md#操作符) | \[&\]\[operator_bitwise-and\], \[\~\]\[operator_bitwise-invert\], \[|\]\[operator_bitwise-or\], \[`^`\]\[operator_bitwise-xor\], \[\<\<\]\[operator_left-shift\], \[\>\>\]\[operator_right-shift\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [比较运算](/functions-and-operators/operators.md#比较方法和操作符) | \[\<\]\[operator_less-than\], \[\<=\]\[operator_less-than-or-equal\], \[=\]\[operator_equal\], \[!= (\<\>)\]\[operator_not-equal\], \[\>\]\[operator_greater-than\], \[\>=\]\[operator_greater-than-or-equal\], \[\<=\>\]\[operator_equal-to\], \[BETWEEN ... AND ...\]\[operator_between\], \[COALESCE()\]\[function_coalesce\], \[IN()\]\[operator_in\], \[INTERVAL()\]\[function_interval\], \[IS NOT NULL\]\[operator_is-not-null\], \[IS NOT\]\[operator_is-not\], \[IS NULL\]\[operator_is-null\], \[IS\]\[operator_is\], \[ISNULL()\]\[function_isnull\], \[LIKE\]\[operator_like\], \[NOT BETWEEN ... AND ...\]\[operator_not-between\], \[NOT IN()\]\[operator_not-in\], \[NOT LIKE\]\[operator_not-like\], \[STRCMP()\]\[function_strcmp\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [数值运算](/functions-and-operators/numeric-functions-and-operators.md) | \[+\]\[operator_plus\], \[-\]\[operator_minus\], \[\*\]\[operator_times\], \[/\]\[operator_divide\], \[DIV\]\[operator_div\], \[% (MOD)\]\[operator_mod\], \[-\]\[operator_unary-minus\], \[ABS()\]\[function_abs\], \[ACOS()\]\[function_acos\], \[ASIN()\]\[function_asin\], \[ATAN()\]\[function_atan\], \[ATAN2(), ATAN()\]\[function_atan2\], \[CEIL()\]\[function_ceil\], \[CEILING()\]\[function_ceiling\], \[CONV()\]\[function_conv\], \[COS()\]\[function_cos\], \[COT()\]\[function_cot\], \[CRC32()\]\[function_crc32\], \[DEGREES()\]\[function_degrees\], \[EXP()\]\[function_exp\], \[FLOOR()\]\[function_floor\], \[LN()\]\[function_ln\], \[LOG()\]\[function_log\], \[LOG10()\]\[function_log10\], \[LOG2()\]\[function_log2\], \[MOD()\]\[function_mod\], \[PI()\]\[function_pi\], \[POW()\]\[function_pow\], \[POWER()\]\[function_power\], \[RADIANS()\]\[function_radians\], \[RAND()\]\[function_rand\], \[ROUND()\]\[function_round\], \[SIGN()\]\[function_sign\], \[SIN()\]\[function_sin\], \[SQRT()\]\[function_sqrt\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [控制流运算](/functions-and-operators/control-flow-functions.md) | \[CASE\]\[operator_case\], \[IF()\]\[function_if\], \[IFNULL()\]\[function_ifnull\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [JSON 运算](/functions-and-operators/json-functions.md) | \[JSON_ARRAY(\[val\[, val\] ...\])\]\[json_array\], | +| | \[JSON_CONTAINS(target, candidate\[, path\])\]\[json_contains\], | +| | \[JSON_EXTRACT(json_doc, path\[, path\] ...)\]\[json_extract\], | +| | \[JSON_INSERT(json_doc, path, val\[, path, val\] ...)\]\[json_insert\], | +| | \[JSON_LENGTH(json_doc\[, path\])\]\[json_length\], | +| | \[JSON_MERGE(json_doc, json_doc\[, json_doc\] ...)\]\[json_merge\], | +| | \[JSON_OBJECT(\[key, val\[, key, val\] ...\])\]\[json_object\], | +| | \[JSON_REMOVE(json_doc, path\[, path\] ...)\]\[json_remove\], | +| | \[JSON_REPLACE(json_doc, path, val\[, path, val\] ...)\]\[json_replace\], | +| | \[JSON_SET(json_doc, path, val\[, path, val\] ...)\]\[json_set\], | +| | \[JSON_TYPE(json_val)\]\[json_type\], | +| | \[JSON_UNQUOTE(json_val)\]\[json_unquote\], | +| | \[JSON_VALID(val)\]\[json_valid\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [日期运算](/functions-and-operators/date-and-time-functions.md) | \[DATE()\]\[function_date\], \[DATE_FORMAT()\]\[function_date-format\], \[DATEDIFF()\]\[function_datediff\], \[DAYOFMONTH()\]\[function_dayofmonth\], \[DAYOFWEEK()\]\[function_dayofweek\], \[DAYOFYEAR()\]\[function_dayofyear\], \[FROM_DAYS()\]\[function_from-days\], \[HOUR()\]\[function_hour\], \[MAKEDATE()\]\[function_makedate\], \[MAKETIME()\]\[function_maketime\], \[MICROSECOND()\]\[function_microsecond\], \[MINUTE()\]\[function_minute\], \[MONTH()\]\[function_month\], \[MONTHNAME()\]\[function_monthname\], \[PERIOD_ADD()\]\[function_period-add\], \[PERIOD_DIFF()\]\[function_period-diff\], \[SEC_TO_TIME()\]\[function_sec-to-time\], \[SECOND()\]\[function_second\], \[SYSDATE()\]\[function_sysdate\], \[TIME_TO_SEC()\]\[function_time-to-sec\], \[TIMEDIFF()\]\[function_timediff\], \[WEEK()\]\[function_week\], \[WEEKOFYEAR()\]\[function_weekofyear\], \[YEAR()\]\[function_year\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [字符串函数](/functions-and-operators/string-functions.md) | \[ASCII()\]\[function_ascii\], \[BIT_LENGTH()\]\[function_bit-length\], \[CHAR()\]\[function_char\], \[CHAR_LENGTH()\]\[function_char-length\], \[CONCAT()\]\[function_concat\], \[CONCAT_WS()\]\[function_concat-ws\], \[ELT()\]\[function_elt\], \[FIELD()\]\[function_field\], \[HEX()\]\[function_hex\], \[LENGTH()\]\[function_length\], \[LIKE\]\[operator_like\], \[LTRIM()\]\[function_ltrim\], \[MID()\]\[function_mid\], \[NOT LIKE\]\[operator_not-like\], \[NOT REGEXP\]\[operator_not-regexp\], \[REGEXP\]\[operator_regexp\], \[REPLACE()\]\[function_replace\], \[REVERSE()\]\[function_reverse\], \[RIGHT()\]\[function_right\], \[RTRIM()\]\[function_rtrim\], \[SPACE()\]\[function_space\], \[STRCMP()\]\[function_strcmp\], \[SUBSTR()\]\[function_substr\], \[SUBSTRING()\]\[function_substring\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [聚合函数](/functions-and-operators/aggregate-group-by-functions.md#group-by-聚合函数) | \[COUNT()\]\[function_count\], \[COUNT(DISTINCT)\]\[function_count-distinct\], \[SUM()\]\[function_sum\], \[AVG()\]\[function_avg\], \[MAX()\]\[function_max\], \[MIN()\]\[function_min\], \[VARIANCE()\]\[function_variance\], \[VAR_POP()\]\[function_var-pop\], \[STD()\]\[function_std\], \[STDDEV()\]\[function_stddev\], \[STDDEV_POP\]\[function_stddev-pop\], \[VAR_SAMP()\]\[function_var-samp\], \[STDDEV_SAMP()\]\[function_stddev-samp\], \[JSON_ARRAYAGG(key)\]\[json_arrayagg\], \[JSON_OBJECTAGG(key, value)\]\[function_json-objectagg\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [加密和压缩函数](/functions-and-operators/encryption-and-compression-functions.md#加密和压缩函数) | \[MD5()\]\[function_md5\], \[SHA1(), SHA()\]\[function_sha1\], \[UNCOMPRESSED_LENGTH()\]\[function_uncompressed-length\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [Cast 函数](/functions-and-operators/cast-functions-and-operators.md#cast-函数和操作符) | \[CAST()\]\[function_cast\], \[CONVERT()\]\[function_convert\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [其他函数](/functions-and-operators/miscellaneous-functions.md#支持的函数) | \[UUID()\]\[function_uuid\] | ++---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## 禁止特定表达式下推 diff --git a/geo-distributed-deployment-topology.md b/geo-distributed-deployment-topology.md index 7bfd166e0009..a6a9d16ac116 100644 --- a/geo-distributed-deployment-topology.md +++ b/geo-distributed-deployment-topology.md @@ -9,12 +9,27 @@ summary: 介绍跨数据中心部署 TiDB 集群的拓扑结构。 ## 拓扑信息 -|实例 | 个数 | 物理机配置 | BJ IP | SH IP |配置 | -| :-- | :-- | :-- | :-- | :-- | :-- | -| TiDB |5 | 16 VCore 32GB * 1 | 10.0.1.1
10.0.1.2
10.0.1.3
10.0.1.4 | 10.0.1.5 | 默认端口
全局目录配置 | -| PD | 5 | 4 VCore 8GB * 1 |10.0.1.6
10.0.1.7
10.0.1.8
10.0.1.9 | 10.0.1.10 | 默认端口
全局目录配置 | -| TiKV | 5 | 16 VCore 32GB 2TB (nvme ssd) * 1 | 10.0.1.11
10.0.1.12
10.0.1.13
10.0.1.14 | 10.0.1.15 | 默认端口
全局目录配置 | -| Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.16 || 默认端口
全局目录配置 | ++----------------------+-----------+-----------------------------------+-----------+-----------+--------------+ +| 实例 | 个数 | 物理机配置 | BJ IP | SH IP | 配置 | ++:=====================+:==========+:==================================+:==========+:==========+:=============+ +| TiDB | 5 | 16 VCore 32GB \* 1 | 10.0.1.1 | 10.0.1.5 | 默认端口 | +| | | | 10.0.1.2 | | 全局目录配置 | +| | | | 10.0.1.3 | | | +| | | | 10.0.1.4 | | | ++----------------------+-----------+-----------------------------------+-----------+-----------+--------------+ +| PD | 5 | 4 VCore 8GB \* 1 | 10.0.1.6 | 10.0.1.10 | 默认端口 | +| | | | 10.0.1.7 | | 全局目录配置 | +| | | | 10.0.1.8 | | | +| | | | 10.0.1.9 | | | ++----------------------+-----------+-----------------------------------+-----------+-----------+--------------+ +| TiKV | 5 | 16 VCore 32GB 2TB (nvme ssd) \* 1 | 10.0.1.11 | 10.0.1.15 | 默认端口 | +| | | | 10.0.1.12 | | 全局目录配置 | +| | | | 10.0.1.13 | | | +| | | | 10.0.1.14 | | | ++----------------------+-----------+-----------------------------------+-----------+-----------+--------------+ +| Monitoring & Grafana | 1 | 4 VCore 8GB \* 1 500GB (ssd) | 10.0.1.16 | | 默认端口 | +| | | | | | 全局目录配置 | ++----------------------+-----------+-----------------------------------+-----------+-----------+--------------+ ### 拓扑模版 diff --git a/hardware-and-software-requirements.md b/hardware-and-software-requirements.md index 98da2c210a36..e355406bef1a 100644 --- a/hardware-and-software-requirements.md +++ b/hardware-and-software-requirements.md @@ -20,13 +20,24 @@ TiDB 作为一款开源一栈式实时 HTAP 数据库,可以很好地部署和 + 在以下操作系统以及对应的 CPU 架构组合上,TiDB 可**满足企业级生产质量的要求**,产品特性经过全面且系统化的验证: - | 操作系统 | 支持的 CPU 架构 | - | :--- | :--- | - | Red Hat Enterprise Linux 8.4 及以上的 8.x 版本 |
  • x86_64
  • ARM 64
| - |
  • Red Hat Enterprise Linux 7.3 及以上的 7.x 版本
  • CentOS 7.3 及以上的 7.x 版本
|
  • x86_64
  • ARM 64
| - | Amazon Linux 2 |
  • x86_64
  • ARM 64
| - | 麒麟欧拉版 V10 SP1/SP2 |
  • x86_64
  • ARM 64
| - | 统信操作系统 (UOS) V20 |
  • x86_64
  • ARM 64
| + +----------------------------------------------------+-----------------------------------+ + | 操作系统 | 支持的 CPU 架构 | + +:===================================================+:==================================+ + | Red Hat Enterprise Linux 8.4 及以上的 8.x 版本 | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | - Red Hat Enterprise Linux 7.3 及以上的 7.x 版本 | - x86_64 | + | - CentOS 7.3 及以上的 7.x 版本 | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | Amazon Linux 2 | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | 麒麟欧拉版 V10 SP1/SP2 | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | 统信操作系统 (UOS) V20 | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ > **注意:** > @@ -34,16 +45,27 @@ TiDB 作为一款开源一栈式实时 HTAP 数据库,可以很好地部署和 + 在以下操作系统以及对应的 CPU 架构组合上,你可以编译、构建和部署 TiDB,可使用 OLTP 和 OLAP 以及数据工具的基本功能。但是 TiDB **不保障企业级生产质量要求**: - | 操作系统 | 支持的 CPU 架构 | - | :--- | :--- | - | macOS 12 (Monterey) 及以上的版本 |
  • x86_64
  • ARM 64
| - | Oracle Enterprise Linux 7.3 及以上的 7.x 版本 | x86_64 | - | Ubuntu LTS 18.04 及以上的版本 | x86_64 | - | CentOS 8 Stream |
  • x86_64
  • ARM 64
| - | Debian 9 (Stretch) 及以上的版本 | x86_64 | - | Fedora 35 及以上的版本 | x86_64 | - | openSUSE Leap 15.3 以上的版本(不包含 Tumbleweed) | x86_64 | - | SUSE Linux Enterprise Server 15 | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | 操作系统 | 支持的 CPU 架构 | + +:===================================================+:==================================+ + | macOS 12 (Monterey) 及以上的版本 | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | Oracle Enterprise Linux 7.3 及以上的 7.x 版本 | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | Ubuntu LTS 18.04 及以上的版本 | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | CentOS 8 Stream | - x86_64 | + | | - ARM 64 | + +----------------------------------------------------+-----------------------------------+ + | Debian 9 (Stretch) 及以上的版本 | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | Fedora 35 及以上的版本 | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | openSUSE Leap 15.3 以上的版本(不包含 Tumbleweed) | x86_64 | + +----------------------------------------------------+-----------------------------------+ + | SUSE Linux Enterprise Server 15 | x86_64 | + +----------------------------------------------------+-----------------------------------+ > **注意:** > @@ -170,14 +192,25 @@ TiDB 作为开源一栈式实时 HTAP 数据库,其正常运行需要网络环 ## 磁盘空间要求 -| 组件 | 磁盘空间要求 | 健康水位使用率 | -| :-- | :-- | :-- | -| TiDB |
  • 日志盘建议最少预留 30 GB。
  • v6.5.0 及以上版本默认启用了 Fast Online DDL 对添加索引等 DDL 操作进行加速(通过变量 [`tidb_ddl_enable_fast_reorg`](/system-variables.md#tidb_ddl_enable_fast_reorg-从-v630-版本开始引入) 控制)。如果业务中可能存在针对大对象的 DDL 操作,推荐为 TiDB 准备额外的 SSD 磁盘空间(建议 100 GB+)。配置方式详见[设置 TiDB 节点的临时空间](/check-before-deployment.md#设置-tidb-节点的临时空间推荐)。
| 低于 90% | -| PD | 数据盘和日志盘建议最少各预留 20 GB | 低于 90% | -| TiKV | 数据盘和日志盘建议最少各预留 100 GB | 低于 80% | -| TiFlash | 数据盘建议最少预留 100 GB,日志盘建议最少预留 30 GB | 低于 80% | -| TiUP |
  • 中控机:部署一个版本的 TiDB 集群占用不超过 1 GB 空间,部署多个版本集群所占用的空间会相应增加
  • 部署服务器(实际运行 TiDB 各组件的机器):TiFlash 占用约 700 MB 空间,其他组件(PD、TiDB、TiKV 等)各占用约 200 MB 空间。同时,部署过程会占用小于 1 MB 临时空间(/tmp)存放临时文件
| 不涉及| -| Ngmonitoring |
  • Conprof:3 x 1 GB x 组件数量(表示每个组件每天占用约 1 GB,总共 3 天) + 20 GB 预留空间
  • Top SQL:30 x 50 MB x 组件数量(每个组件每天占用约 50 MB,总共 30 天)
  • Top SQL 和 Conprof 共享预留空间
| 不涉及 | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| 组件 | 磁盘空间要求 | 健康水位使用率 | ++:======================+:======================================================================================================================================================================================================================================================================================================================================================================================================+:======================+ +| TiDB | - 日志盘建议最少预留 30 GB。 | 低于 90% | +| | - v6.5.0 及以上版本默认启用了 Fast Online DDL 对添加索引等 DDL 操作进行加速(通过变量 [`tidb_ddl_enable_fast_reorg`](/system-variables.md#tidb_ddl_enable_fast_reorg-从-v630-版本开始引入) 控制)。如果业务中可能存在针对大对象的 DDL 操作,推荐为 TiDB 准备额外的 SSD 磁盘空间(建议 100 GB+)。配置方式详见[设置 TiDB 节点的临时空间](/check-before-deployment.md#设置-tidb-节点的临时空间推荐)。 | | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| PD | 数据盘和日志盘建议最少各预留 20 GB | 低于 90% | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| TiKV | 数据盘和日志盘建议最少各预留 100 GB | 低于 80% | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| TiFlash | 数据盘建议最少预留 100 GB,日志盘建议最少预留 30 GB | 低于 80% | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| TiUP | - 中控机:部署一个版本的 TiDB 集群占用不超过 1 GB 空间,部署多个版本集群所占用的空间会相应增加 | 不涉及 | +| | - 部署服务器(实际运行 TiDB 各组件的机器):TiFlash 占用约 700 MB 空间,其他组件(PD、TiDB、TiKV 等)各占用约 200 MB 空间。同时,部署过程会占用小于 1 MB 临时空间(/tmp)存放临时文件 | | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ +| Ngmonitoring | - Conprof:3 x 1 GB x 组件数量(表示每个组件每天占用约 1 GB,总共 3 天) + 20 GB 预留空间 | 不涉及 | +| | - Top SQL:30 x 50 MB x 组件数量(每个组件每天占用约 50 MB,总共 30 天) | | +| | - Top SQL 和 Conprof 共享预留空间 | | ++-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------+ ## 客户端 Web 浏览器要求 diff --git a/hybrid-deployment-topology.md b/hybrid-deployment-topology.md index 485452a538a3..cd23216fed45 100644 --- a/hybrid-deployment-topology.md +++ b/hybrid-deployment-topology.md @@ -9,12 +9,24 @@ summary: 介绍混合部署 TiDB 集群的拓扑结构。 ## 拓扑信息 -| 实例 | 个数 | 物理机配置 | IP | 配置 | -| :-- | :-- | :-- | :-- | :-- | -| TiDB | 6 | 32 VCore 64GB | 10.0.1.1
10.0.1.2
10.0.1.3 | 配置 numa 绑核操作 | -| PD | 3 | 16 VCore 32 GB | 10.0.1.4
10.0.1.5
10.0.1.6 | 配置 location_labels 参数 | -| TiKV | 6 | 32 VCore 64GB | 10.0.1.7
10.0.1.8
10.0.1.9 | 1. 区分实例级别的 port、status_port;
2. 配置全局参数 readpool、storage 以及 raftstore;
3. 配置实例级别 host 维度的 labels;
4. 配置 numa 绑核操作| -| Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.10 | 默认配置 | ++----------------------+-------------+------------------------------+-------------+----------------------------------------------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:=====================+:============+:=============================+:============+:===================================================+ +| TiDB | 6 | 32 VCore 64GB | 10.0.1.1 | 配置 numa 绑核操作 | +| | | | 10.0.1.2 | | +| | | | 10.0.1.3 | | ++----------------------+-------------+------------------------------+-------------+----------------------------------------------------+ +| PD | 3 | 16 VCore 32 GB | 10.0.1.4 | 配置 location_labels 参数 | +| | | | 10.0.1.5 | | +| | | | 10.0.1.6 | | ++----------------------+-------------+------------------------------+-------------+----------------------------------------------------+ +| TiKV | 6 | 32 VCore 64GB | 10.0.1.7 | 1\. 区分实例级别的 port、status_port; | +| | | | 10.0.1.8 | 2. 配置全局参数 readpool、storage 以及 raftstore; | +| | | | 10.0.1.9 | 3. 配置实例级别 host 维度的 labels; | +| | | | | 4. 配置 numa 绑核操作 | ++----------------------+-------------+------------------------------+-------------+----------------------------------------------------+ +| Monitoring & Grafana | 1 | 4 VCore 8GB \* 1 500GB (ssd) | 10.0.1.10 | 默认配置 | ++----------------------+-------------+------------------------------+-------------+----------------------------------------------------+ ### 拓扑模版 diff --git a/metadata-lock.md b/metadata-lock.md index 31d4204964d2..213f977dcea8 100644 --- a/metadata-lock.md +++ b/metadata-lock.md @@ -43,14 +43,22 @@ summary: 介绍 TiDB 中元数据锁的概念、原理、实现和影响。 - 开启元数据锁后,事务中某个元数据对象的元数据信息在第一次访问时确定,之后不再变化。 - 对于 DDL 语句来说,在进行元数据状态变更时,会被涉及相关元数据的旧事务所阻塞。例如以下的执行流程: - | Session 1 | Session 2 | - |:---------------------------|:----------| - | `CREATE TABLE t (a INT);` | | - | `INSERT INTO t VALUES(1);` | | - | `BEGIN;` | | - | | `ALTER TABLE t ADD COLUMN b INT;` | - | `SELECT * FROM t;`
(采用 `t` 表当前的元数据版本,返回 `(a=1,b=NULL)`,同时给表 `t` 加锁)| | - | | `ALTER TABLE t ADD COLUMN c INT;`(被 Session 1 阻塞)| + +--------------------------------------------------------------------------+--------------------------------------------------------+ + | Session 1 | Session 2 | + +:=========================================================================+:=======================================================+ + | `CREATE TABLE t (a INT);` | | + +--------------------------------------------------------------------------+--------------------------------------------------------+ + | `INSERT INTO t VALUES(1);` | | + +--------------------------------------------------------------------------+--------------------------------------------------------+ + | `BEGIN;` | | + | +--------------------------------------------------------+ + | | `ALTER TABLE t ADD COLUMN b INT;` | + +--------------------------------------------------------------------------+--------------------------------------------------------+ + | `SELECT * FROM t;` | | + | (采用 `t` 表当前的元数据版本,返回 `(a=1,b=NULL)`,同时给表 `t` 加锁) | | + | +--------------------------------------------------------+ + | | `ALTER TABLE t ADD COLUMN c INT;`(被 Session 1 阻塞) | + +--------------------------------------------------------------------------+--------------------------------------------------------+ 在可重复读隔离级别下,如果从事务开始到确定一个表的元数据过程中,执行了加索引或者变更列类型等需要更改数据的 DDL,则有以下表现: diff --git a/migration-tools.md b/migration-tools.md index 118f83c602d6..842a1deff7ad 100644 --- a/migration-tools.md +++ b/migration-tools.md @@ -11,57 +11,103 @@ TiDB 提供了丰富的数据迁移相关的工具,用于全量迁移、增量 ## [TiDB Data Migration (DM)](/dm/dm-overview.md) -| 使用场景 | 用于将数据从与 MySQL 协议兼容的数据库迁移到 TiDB | -|---|---| -| **上游** | MySQL,MariaDB,Aurora | -| **下游** | TiDB | -| **主要优势** |
  • 一体化的数据迁移任务管理工具,支持全量迁移和增量同步
  • 支持对表与操作进行过滤
  • 支持分库分表的合并迁移
| -| **使用限制** | 数据导入速度与 TiDB Lightning 的 [Logical Import Mode](/tidb-lightning/tidb-lightning-logical-import-mode.md) 大致相同,而比TiDB Lightning 的 [Physical Import Mode](/tidb-lightning/tidb-lightning-physical-import-mode.md) 低很多。建议用于 1 TB 以内的存量数据迁移。 | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 使用场景 | 用于将数据从与 MySQL 协议兼容的数据库迁移到 TiDB | ++===================================+=========================================================================================================================================================================================================================================================================+ +| **上游** | MySQL,MariaDB,Aurora | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **下游** | TiDB | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **主要优势** | - 一体化的数据迁移任务管理工具,支持全量迁移和增量同步 | +| | - 支持对表与操作进行过滤 | +| | - 支持分库分表的合并迁移 | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **使用限制** | 数据导入速度与 TiDB Lightning 的 [Logical Import Mode](/tidb-lightning/tidb-lightning-logical-import-mode.md) 大致相同,而比TiDB Lightning 的 [Physical Import Mode](/tidb-lightning/tidb-lightning-physical-import-mode.md) 低很多。建议用于 1 TB 以内的存量数据迁移。 | ++-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md) -| 使用场景 | 用于将数据全量导入到 TiDB | -|---|---| -| **上游(输入源文件)** |
  • Dumpling 输出的文件
  • 从 Amazon Aurora 或 Apache Hive 导出的 Parquet 文件
  • CSV 文件
  • 从本地盘或 Amazon S3 云盘读取数据
| -| **下游** | TiDB | -| **主要优势** |
  • 支持快速导入大量数据,实现快速初始化 TiDB 集群的指定表
  • 支持断点续传
  • 支持数据过滤
| -| **使用限制** |
  • 如果使用 [Physical Import Mode](/tidb-lightning/tidb-lightning-physical-import-mode.md) 进行数据导入,TiDB Lightning 运行后,TiDB 集群将无法正常对外提供服务。
  • 如果你不希望 TiDB 集群的对外服务受到影响,可以参考 TiDB Lightning [Logical Import Mode](/tidb-lightning/tidb-lightning-logical-import-mode.md) 中的硬件需求与部署方式进行数据导入。
| ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 使用场景 | 用于将数据全量导入到 TiDB | ++===================================+=========================================================================================================================================================================================+ +| **上游(输入源文件)** | - Dumpling 输出的文件 | +| | - 从 Amazon Aurora 或 Apache Hive 导出的 Parquet 文件 | +| | - CSV 文件 | +| | - 从本地盘或 Amazon S3 云盘读取数据 | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **下游** | TiDB | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **主要优势** | - 支持快速导入大量数据,实现快速初始化 TiDB 集群的指定表 | +| | - 支持断点续传 | +| | - 支持数据过滤 | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **使用限制** | - 如果使用 [Physical Import Mode](/tidb-lightning/tidb-lightning-physical-import-mode.md) 进行数据导入,TiDB Lightning 运行后,TiDB 集群将无法正常对外提供服务。 | +| | - 如果你不希望 TiDB 集群的对外服务受到影响,可以参考 TiDB Lightning [Logical Import Mode](/tidb-lightning/tidb-lightning-logical-import-mode.md) 中的硬件需求与部署方式进行数据导入。 | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## [Dumpling](/dumpling-overview.md) -| 使用场景 | 用于将数据从 MySQL/TiDB 进行全量导出 | -|---|---| -| **上游** | MySQL,TiDB | -| **下游(输出文件)** | SQL,CSV | -| **主要优势** |
  • 支持全新的 table-filter,筛选数据更加方便
  • 支持导出到 Amazon S3 云盘
| -| **使用限制** |
  • 如果导出后计划往非 TiDB 的数据库恢复,建议使用 Dumpling。
  • 如果导出后计划往另一个 TiDB 恢复,建议使用 [BR](/br/backup-and-restore-overview.md)。
| ++-----------------------------------+-------------------------------------------------------------------------------------------+ +| 使用场景 | 用于将数据从 MySQL/TiDB 进行全量导出 | ++===================================+===========================================================================================+ +| **上游** | MySQL,TiDB | ++-----------------------------------+-------------------------------------------------------------------------------------------+ +| **下游(输出文件)** | SQL,CSV | ++-----------------------------------+-------------------------------------------------------------------------------------------+ +| **主要优势** | - 支持全新的 table-filter,筛选数据更加方便 | +| | - 支持导出到 Amazon S3 云盘 | ++-----------------------------------+-------------------------------------------------------------------------------------------+ +| **使用限制** | - 如果导出后计划往非 TiDB 的数据库恢复,建议使用 Dumpling。 | +| | - 如果导出后计划往另一个 TiDB 恢复,建议使用 [BR](/br/backup-and-restore-overview.md)。 | ++-----------------------------------+-------------------------------------------------------------------------------------------+ ## [TiCDC](/ticdc/ticdc-overview.md) -| 使用场景 | 通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,支持其他系统订阅数据变更 | -|---|---| -| **上游** | TiDB | -| **下游** | TiDB,MySQL,Kafka,MQ,Confluent,存储服务(如 Amazon S3、GCS、Azure Blob Storage 和 NFS) | -| **主要优势** | 提供开放数据协议 (TiCDC Open Protocol)。| -| **使用限制** | TiCDC 只能同步至少存在一个有效索引的表。暂不支持以下场景:
  • 单独使用 RawKV 的 TiKV 集群。
  • 在 TiDB 中创建 SEQUENCE 的 DDL 操作和 SEQUENCE 函数。
| ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| 使用场景 | 通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,具有将数据还原到与上游任意 TSO 一致状态的能力,支持其他系统订阅数据变更 | ++===================================+=============================================================================================================================+ +| **上游** | TiDB | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| **下游** | TiDB,MySQL,Kafka,MQ,Confluent,存储服务(如 Amazon S3、GCS、Azure Blob Storage 和 NFS) | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| **主要优势** | 提供开放数据协议 (TiCDC Open Protocol)。 | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| **使用限制** | TiCDC 只能同步至少存在一个有效索引的表。暂不支持以下场景: | +| | | +| | - 单独使用 RawKV 的 TiKV 集群。 | +| | - 在 TiDB 中创建 SEQUENCE 的 DDL 操作和 SEQUENCE 函数。 | ++-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ ## [Backup & Restore (BR)](/br/backup-and-restore-overview.md) -| 使用场景 | 通过对大数据量的 TiDB 集群进行数据备份和恢复,实现数据迁移 | -|---|---| -| **上游** | TiDB | -| **下游(输出文件)** | SST,backup.meta 文件,backup.lock 文件 | -| **主要优势** |
  • 适用于向另一个 TiDB 迁移数据。
  • 支持数据冷备份到外部存储,可以用于灾备恢复。
| -| **使用限制** |
  • BR 恢复到 TiCDC / Drainer 的上游集群时,恢复数据无法由 TiCDC / Drainer 同步到下游。
  • BR 只支持在 `new_collations_enabled_on_first_bootstrap` 开关值相同的集群之间进行操作。
| ++-----------------------------------+--------------------------------------------------------------------------------------------+ +| 使用场景 | 通过对大数据量的 TiDB 集群进行数据备份和恢复,实现数据迁移 | ++===================================+============================================================================================+ +| **上游** | TiDB | ++-----------------------------------+--------------------------------------------------------------------------------------------+ +| **下游(输出文件)** | SST,backup.meta 文件,backup.lock 文件 | ++-----------------------------------+--------------------------------------------------------------------------------------------+ +| **主要优势** | - 适用于向另一个 TiDB 迁移数据。 | +| | - 支持数据冷备份到外部存储,可以用于灾备恢复。 | ++-----------------------------------+--------------------------------------------------------------------------------------------+ +| **使用限制** | - BR 恢复到 TiCDC / Drainer 的上游集群时,恢复数据无法由 TiCDC / Drainer 同步到下游。 | +| | - BR 只支持在 `new_collations_enabled_on_first_bootstrap` 开关值相同的集群之间进行操作。 | ++-----------------------------------+--------------------------------------------------------------------------------------------+ ## [sync-diff-inspector](/sync-diff-inspector/sync-diff-inspector-overview.md) -| 使用场景 | 用于校验 MySQL/TiDB 中两份数据的一致性 | -|---|---| -| **上游** | TiDB,MySQL | -| **下游** | TiDB,MySQL | -| **主要优势** | 提供了修复数据的功能,适用于修复少量不一致的数据。| -| **使用限制** |
  • 对于 MySQL 和 TiDB 之间的数据同步不支持在线校验。
  • 不支持 JSON、BIT、BINARY、BLOB 等类型的数据。
| ++-----------------------------------+-------------------------------------------------------+ +| 使用场景 | 用于校验 MySQL/TiDB 中两份数据的一致性 | ++===================================+=======================================================+ +| **上游** | TiDB,MySQL | ++-----------------------------------+-------------------------------------------------------+ +| **下游** | TiDB,MySQL | ++-----------------------------------+-------------------------------------------------------+ +| **主要优势** | 提供了修复数据的功能,适用于修复少量不一致的数据。 | ++-----------------------------------+-------------------------------------------------------+ +| **使用限制** | - 对于 MySQL 和 TiDB 之间的数据同步不支持在线校验。 | +| | - 不支持 JSON、BIT、BINARY、BLOB 等类型的数据。 | ++-----------------------------------+-------------------------------------------------------+ ## 使用 TiUP 快速安装 diff --git a/minimal-deployment-topology.md b/minimal-deployment-topology.md index 409d0d217a5b..d9c449f6891b 100644 --- a/minimal-deployment-topology.md +++ b/minimal-deployment-topology.md @@ -9,12 +9,23 @@ summary: 介绍 TiDB 集群的最小拓扑。 ## 拓扑信息 -|实例 | 个数 | 物理机配置 | IP |配置 | -| :-- | :-- | :-- | :-- | :-- | -| TiDB |2 | 16 VCore 32 GiB
100 GiB 用于存储| 10.0.1.1
10.0.1.2 | 默认端口
全局目录配置 | -| PD | 3 | 4 VCore 8 GiB
100 GiB 用于存储|10.0.1.4
10.0.1.5
10.0.1.6 | 默认端口
全局目录配置 | -| TiKV | 3 | 16 VCore 32 GiB
2 TiB (NVMe SSD) 用于存储 | 10.0.1.7
10.0.1.8
10.0.1.9 | 默认端口
全局目录配置 | -| Monitoring & Grafana | 1 | 4 VCore 8 GiB
500 GiB (SSD) 用于存储 | 10.0.1.10 | 默认端口
全局目录配置 | ++----------------------+-------------+---------------------------+-------------+--------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:=====================+:============+:==========================+:============+:=============+ +| TiDB | 2 | 16 VCore 32 GiB | 10.0.1.1 | 默认端口 | +| | | 100 GiB 用于存储 | 10.0.1.2 | 全局目录配置 | ++----------------------+-------------+---------------------------+-------------+--------------+ +| PD | 3 | 4 VCore 8 GiB | 10.0.1.4 | 默认端口 | +| | | 100 GiB 用于存储 | 10.0.1.5 | 全局目录配置 | +| | | | 10.0.1.6 | | ++----------------------+-------------+---------------------------+-------------+--------------+ +| TiKV | 3 | 16 VCore 32 GiB | 10.0.1.7 | 默认端口 | +| | | 2 TiB (NVMe SSD) 用于存储 | 10.0.1.8 | 全局目录配置 | +| | | | 10.0.1.9 | | ++----------------------+-------------+---------------------------+-------------+--------------+ +| Monitoring & Grafana | 1 | 4 VCore 8 GiB | 10.0.1.10 | 默认端口 | +| | | 500 GiB (SSD) 用于存储 | | 全局目录配置 | ++----------------------+-------------+---------------------------+-------------+--------------+ ### 拓扑模版 diff --git a/multi-data-centers-in-one-city-deployment.md b/multi-data-centers-in-one-city-deployment.md index db1550110a88..1c7a61429225 100644 --- a/multi-data-centers-in-one-city-deployment.md +++ b/multi-data-centers-in-one-city-deployment.md @@ -1,172 +1,172 @@ ---- -title: 单区域多 AZ 部署 TiDB -summary: 本文档介绍单个区域多个可用区部署 TiDB 的方案。 ---- - -# 单区域多 AZ 部署 TiDB - - - -作为一栈式实时 HTAP 数据库,TiDB 兼顾了传统关系型数据库的优秀特性、NoSQL 数据库可扩展性以及跨可用区 (Availability Zone, AZ) 场景下的高可用。本文档旨在介绍同区域多 AZ 部署 TiDB 的方案。 - -本文中的区域指的是地理隔离的不同位置,AZ 指的是区域内部划分的相互独立的资源集合。本文描述的方案同样适用于一个城市内多个数据中心(同城多中心)的场景。 - -## 了解 Raft 协议 - -Raft 是一种分布式一致性算法,在 TiDB 集群的多种组件中,PD 和 TiKV 都通过 Raft 实现了数据的容灾。Raft 的灾难恢复能力通过如下机制实现: - -- Raft 成员的本质是日志复制和状态机。Raft 成员之间通过复制日志来实现数据同步;Raft 成员在不同条件下切换自己的成员状态,其目标是选出 leader 以提供对外服务。 -- Raft 是一个表决系统,它遵循多数派协议,在一个 Raft Group 中,某成员获得大多数投票,它的成员状态就会转变为 leader。也就是说,当一个 Raft Group 还保有大多数节点 (majority) 时,它就能够选出 leader 以提供对外服务。 - -遵循 Raft 可靠性的特点,放到现实场景中: - -- 想克服任意 1 台服务器 (host) 的故障,应至少提供 3 台服务器。 -- 想克服任意 1 个机柜 (rack) 的故障,应至少提供 3 个机柜。 -- 想克服任意 1 个可用区(AZ,也可以是同城的多个机房)的故障,应至少提供 3 个 AZ。 - -- 想应对任意 1 个区域的灾难场景,应至少规划 3 个区域用于部署集群。 - -可见,原生 Raft 协议对于偶数副本的支持并不是很友好,考虑跨区域网络延迟影响,同区域三 AZ 可能是最适合部署 Raft 的高可用及容灾方案。 - -## 同区域三 AZ 方案 - -同区域三 AZ 方案,即同区域有三个机房部署 TiDB 集群,AZ 间的数据在集群内部(通过 Raft 协议)进行同步。同区域三 AZ 可同时对外进行读写服务,任意中心发生故障不影响数据一致性。 - -### 简易架构图 - -集群 TiDB、TiKV 和 PD 组件分别部署在 3 个不同的 AZ,这是最常规且高可用性最高的方案。 - -![三 AZ 部署](/media/deploy-3dc.png) - -**优点:** - -- 所有数据的副本分布在三个 AZ,具备高可用和容灾能力 -- 任何一个 AZ 失效后,不会产生任何数据丢失 (RPO = 0) -- 任何一个 AZ 失效后,其他两个 AZ 会自动发起 leader election,并在一定时间内(通常 20s 以内)自动恢复服务 - -![三 AZ 部署容灾](/media/deploy-3dc-dr.png) - -**缺点:** - -性能受网络延迟影响。具体影响如下: - -- 对于写入的场景,所有写入的数据需要同步复制到至少两个 AZ,由于 TiDB 写入过程使用两阶段提交,故写入延迟至少需要两倍 AZ 间的延迟。 - -- 对于读请求来说,如果数据 leader 与发起读取的 TiDB 节点不在同一个 AZ,也会受网络延迟影响。 -- TiDB 中的每个事务都需要向 PD leader 获取 TSO,当 TiDB 与 PD leader 不在同一个 AZ 时,TiDB 上运行的事务也会因此受网络延迟影响,每个有写入的事务会获取两次 TSO。 - -### 架构优化图 - -如果不需要每个 AZ 同时对外提供服务,可以将业务流量全部派发到一个 AZ,并通过调度策略把 Region leader 和 PD leader 都迁移到同一个 AZ。这样,不管是从 PD 获取 TSO,还是读取 Region,都不会受 AZ 间网络的影响。当该 AZ 失效时,PD leader 和 Region leader 会自动在其它 AZ 选出,只需要把业务流量转移至其他存活的 AZ 即可。 - -![三 AZ 部署读性能优化](/media/deploy-3dc-optimize.png) - -**优点:** - -集群 TSO 获取能力以及读取性能有所提升。具体调度策略设置模板参照如下: - -```shell --- 其他 AZ 将 leader 驱逐至承载业务流量的 AZ - -config set label-property reject-leader LabelName labelValue - --- 迁移 PD leader 并设置优先级 -member leader transfer pdName1 -member leader_priority pdName1 5 -member leader_priority pdName2 4 -member leader_priority pdName3 3 -``` - -> **注意:** -> -> TiDB 5.2 及以上版本默认不支持 `label-property` 配置。若要设置副本策略,请使用 [Placement Rules](/configure-placement-rules.md)。 - -**缺点:** - -- 写入场景仍受 AZ 网络延迟影响,这是因为遵循 Raft 多数派协议,所有写入的数据需要同步复制到至少两个 AZ - -- TiDB Server 是 AZ 级别单点 -- 业务流量纯走单 AZ,性能受限于单 AZ 网络带宽压力 -- TSO 获取能力以及读取性能受限于业务流量 AZ 集群 PD、TiKV 组件是否正常,否则仍受跨 AZ 网络交互影响 - -### 样例部署图 - -#### 样例拓扑架构 - -假设某区域有三个 AZ,AZ1、AZ2 和 AZ3。每个 AZ 中有两套机架,每个机架有三台服务器,不考虑混合布署以及单台机器多实例部署,同区域三 AZ 架构集群(3 副本)部署参考如下: - -![同区域三 AZ 集群部署](/media/multi-data-centers-in-one-city-deployment-sample.png) - -#### TiKV Labels 简介 - -TiKV 是一个 Multi-Raft 系统,其数据按 Region(默认 96M)切分,每个 Region 的 3 个副本构成了一个 Raft Group。假设一个 3 副本 TiDB 集群,由于 Region 的副本数与 TiKV 实例数量无关,则一个 Region 的 3 个副本只会被调度到其中 3 个 TiKV 实例上,也就是说即使集群扩容 N 个 TiKV 实例,其本质仍是一个 3 副本集群。 - -由于 3 副本的 Raft Group 只能容忍 1 副本故障,当集群被扩容到 N 个 TiKV 实例时,这个集群依然只能容忍一个 TiKV 实例的故障。2 个 TiKV 实例的故障可能会导致某些 Region 丢失多个副本,整个集群的数据也不再完整,访问到这些 Region 上的数据的 SQL 请求将会失败。而 N 个 TiKV 实例中同时有两个发生故障的概率是远远高于 3 个 TiKV 中同时有两个发生故障的概率的,也就是说 Multi-Raft 系统集群扩容 TiKV 实例越多,其可用性是逐渐降低的。 - -正因为 Multi-Raft TiKV 系统局限性,Labels 标签应运而出,其主要用于描述 TiKV 的位置信息。Label 信息随着部署或滚动更新操作刷新到 TiKV 的启动配置文件中,启动后的 TiKV 会将自己最新的 Label 信息上报给 PD,PD 根据用户登记的 Label 名称(也就是 Label 元信息),结合 TiKV 的拓扑进行 Region 副本的最优调度,从而提高系统可用性。 - -#### TiKV Labels 样例规划 - -针对 TiKV Labels 标签,你需要根据已有的物理资源、容灾能力容忍度等方面进行设计与规划,进而提升系统的可用性和容灾能力。并根据已规划的拓扑架构,在集群初始化配置文件中进行配置(此处省略其他非重点项): - -```ini -server_configs: - pd: - replication.location-labels: ["zone","az","rack","host"] - -tikv_servers: - - host: 10.63.10.30 - config: - server.labels: { zone: "z1", az: "az1", rack: "r1", host: "30" } - - host: 10.63.10.31 - config: - server.labels: { zone: "z1", az: "az1", rack: "r1", host: "31" } - - host: 10.63.10.32 - config: - server.labels: { zone: "z1", az: "az1", rack: "r2", host: "32" } - - host: 10.63.10.33 - config: - server.labels: { zone: "z1", az: "az1", rack: "r2", host: "33" } - - - host: 10.63.10.34 - config: - server.labels: { zone: "z2", az: "az2", rack: "r1", host: "34" } - - host: 10.63.10.35 - config: - server.labels: { zone: "z2", az: "az2", rack: "r1", host: "35" } - - host: 10.63.10.36 - config: - server.labels: { zone: "z2", az: "az2", rack: "r2", host: "36" } - - host: 10.63.10.37 - config: - server.labels: { zone: "z2", az: "az2", rack: "r2", host: "37" } - - - host: 10.63.10.38 - config: - server.labels: { zone: "z3", az: "az3", rack: "r1", host: "38" } - - host: 10.63.10.39 - config: - server.labels: { zone: "z3", az: "az3", rack: "r1", host: "39" } - - host: 10.63.10.40 - config: - server.labels: { zone: "z3", az: "az3", rack: "r2", host: "40" } - - host: 10.63.10.41 - config: - server.labels: { zone: "z3", az: "az3", rack: "r2", host: "41" } -``` - -本例中,zone 表示逻辑可用区层级,用于控制副本的隔离(当前集群 3 副本)。 - -不直接采用 az、rack 和 host 三层 Label 结构,是因为考虑到将来可能会扩容 AZ,假设新扩容的 AZ 编号是 AZ2、AZ3 和 AZ4,则只需在对应可用区下扩容 AZ,rack 也只需在对应 AZ 下扩容。 - -如果直接采用 AZ、rack 和 host 三层 Label 结构,那么扩容 AZ 操作可能需重新添加 Label,TiKV 数据整体需要 Rebalance。 - -### 高可用和容灾分析 - -采用区域多 AZ 方案,当任意一个 AZ 故障时,集群能自动恢复服务,不需要人工介入,并能保证数据一致性。注意,各种调度策略主要用于优化性能,当发生故障时,调度机制总是优先考虑可用性而不是性能。 +--- +title: 单区域多 AZ 部署 TiDB +summary: 本文档介绍单个区域多个可用区部署 TiDB 的方案。 +--- + +# 单区域多 AZ 部署 TiDB + + + +作为一栈式实时 HTAP 数据库,TiDB 兼顾了传统关系型数据库的优秀特性、NoSQL 数据库可扩展性以及跨可用区 (Availability Zone, AZ) 场景下的高可用。本文档旨在介绍同区域多 AZ 部署 TiDB 的方案。 + +本文中的区域指的是地理隔离的不同位置,AZ 指的是区域内部划分的相互独立的资源集合。本文描述的方案同样适用于一个城市内多个数据中心(同城多中心)的场景。 + +## 了解 Raft 协议 + +Raft 是一种分布式一致性算法,在 TiDB 集群的多种组件中,PD 和 TiKV 都通过 Raft 实现了数据的容灾。Raft 的灾难恢复能力通过如下机制实现: + +- Raft 成员的本质是日志复制和状态机。Raft 成员之间通过复制日志来实现数据同步;Raft 成员在不同条件下切换自己的成员状态,其目标是选出 leader 以提供对外服务。 +- Raft 是一个表决系统,它遵循多数派协议,在一个 Raft Group 中,某成员获得大多数投票,它的成员状态就会转变为 leader。也就是说,当一个 Raft Group 还保有大多数节点 (majority) 时,它就能够选出 leader 以提供对外服务。 + +遵循 Raft 可靠性的特点,放到现实场景中: + +- 想克服任意 1 台服务器 (host) 的故障,应至少提供 3 台服务器。 +- 想克服任意 1 个机柜 (rack) 的故障,应至少提供 3 个机柜。 +- 想克服任意 1 个可用区(AZ,也可以是同城的多个机房)的故障,应至少提供 3 个 AZ。 + +- 想应对任意 1 个区域的灾难场景,应至少规划 3 个区域用于部署集群。 + +可见,原生 Raft 协议对于偶数副本的支持并不是很友好,考虑跨区域网络延迟影响,同区域三 AZ 可能是最适合部署 Raft 的高可用及容灾方案。 + +## 同区域三 AZ 方案 + +同区域三 AZ 方案,即同区域有三个机房部署 TiDB 集群,AZ 间的数据在集群内部(通过 Raft 协议)进行同步。同区域三 AZ 可同时对外进行读写服务,任意中心发生故障不影响数据一致性。 + +### 简易架构图 + +集群 TiDB、TiKV 和 PD 组件分别部署在 3 个不同的 AZ,这是最常规且高可用性最高的方案。 + +![三 AZ 部署](/media/deploy-3dc.png) + +**优点:** + +- 所有数据的副本分布在三个 AZ,具备高可用和容灾能力 +- 任何一个 AZ 失效后,不会产生任何数据丢失 (RPO = 0) +- 任何一个 AZ 失效后,其他两个 AZ 会自动发起 leader election,并在一定时间内(通常 20s 以内)自动恢复服务 + +![三 AZ 部署容灾](/media/deploy-3dc-dr.png) + +**缺点:** + +性能受网络延迟影响。具体影响如下: + +- 对于写入的场景,所有写入的数据需要同步复制到至少两个 AZ,由于 TiDB 写入过程使用两阶段提交,故写入延迟至少需要两倍 AZ 间的延迟。 + +- 对于读请求来说,如果数据 leader 与发起读取的 TiDB 节点不在同一个 AZ,也会受网络延迟影响。 +- TiDB 中的每个事务都需要向 PD leader 获取 TSO,当 TiDB 与 PD leader 不在同一个 AZ 时,TiDB 上运行的事务也会因此受网络延迟影响,每个有写入的事务会获取两次 TSO。 + +### 架构优化图 + +如果不需要每个 AZ 同时对外提供服务,可以将业务流量全部派发到一个 AZ,并通过调度策略把 Region leader 和 PD leader 都迁移到同一个 AZ。这样,不管是从 PD 获取 TSO,还是读取 Region,都不会受 AZ 间网络的影响。当该 AZ 失效时,PD leader 和 Region leader 会自动在其它 AZ 选出,只需要把业务流量转移至其他存活的 AZ 即可。 + +![三 AZ 部署读性能优化](/media/deploy-3dc-optimize.png) + +**优点:** + +集群 TSO 获取能力以及读取性能有所提升。具体调度策略设置模板参照如下: + +```shell +-- 其他 AZ 将 leader 驱逐至承载业务流量的 AZ + +config set label-property reject-leader LabelName labelValue + +-- 迁移 PD leader 并设置优先级 +member leader transfer pdName1 +member leader_priority pdName1 5 +member leader_priority pdName2 4 +member leader_priority pdName3 3 +``` + +> **注意:** +> +> TiDB 5.2 及以上版本默认不支持 `label-property` 配置。若要设置副本策略,请使用 [Placement Rules](/configure-placement-rules.md)。 + +**缺点:** + +- 写入场景仍受 AZ 网络延迟影响,这是因为遵循 Raft 多数派协议,所有写入的数据需要同步复制到至少两个 AZ + +- TiDB Server 是 AZ 级别单点 +- 业务流量纯走单 AZ,性能受限于单 AZ 网络带宽压力 +- TSO 获取能力以及读取性能受限于业务流量 AZ 集群 PD、TiKV 组件是否正常,否则仍受跨 AZ 网络交互影响 + +### 样例部署图 + +#### 样例拓扑架构 + +假设某区域有三个 AZ,AZ1、AZ2 和 AZ3。每个 AZ 中有两套机架,每个机架有三台服务器,不考虑混合布署以及单台机器多实例部署,同区域三 AZ 架构集群(3 副本)部署参考如下: + +![同区域三 AZ 集群部署](/media/multi-data-centers-in-one-city-deployment-sample.png) + +#### TiKV Labels 简介 + +TiKV 是一个 Multi-Raft 系统,其数据按 Region(默认 96M)切分,每个 Region 的 3 个副本构成了一个 Raft Group。假设一个 3 副本 TiDB 集群,由于 Region 的副本数与 TiKV 实例数量无关,则一个 Region 的 3 个副本只会被调度到其中 3 个 TiKV 实例上,也就是说即使集群扩容 N 个 TiKV 实例,其本质仍是一个 3 副本集群。 + +由于 3 副本的 Raft Group 只能容忍 1 副本故障,当集群被扩容到 N 个 TiKV 实例时,这个集群依然只能容忍一个 TiKV 实例的故障。2 个 TiKV 实例的故障可能会导致某些 Region 丢失多个副本,整个集群的数据也不再完整,访问到这些 Region 上的数据的 SQL 请求将会失败。而 N 个 TiKV 实例中同时有两个发生故障的概率是远远高于 3 个 TiKV 中同时有两个发生故障的概率的,也就是说 Multi-Raft 系统集群扩容 TiKV 实例越多,其可用性是逐渐降低的。 + +正因为 Multi-Raft TiKV 系统局限性,Labels 标签应运而出,其主要用于描述 TiKV 的位置信息。Label 信息随着部署或滚动更新操作刷新到 TiKV 的启动配置文件中,启动后的 TiKV 会将自己最新的 Label 信息上报给 PD,PD 根据用户登记的 Label 名称(也就是 Label 元信息),结合 TiKV 的拓扑进行 Region 副本的最优调度,从而提高系统可用性。 + +#### TiKV Labels 样例规划 + +针对 TiKV Labels 标签,你需要根据已有的物理资源、容灾能力容忍度等方面进行设计与规划,进而提升系统的可用性和容灾能力。并根据已规划的拓扑架构,在集群初始化配置文件中进行配置(此处省略其他非重点项): + +```ini +server_configs: + pd: + replication.location-labels: ["zone","az","rack","host"] + +tikv_servers: + - host: 10.63.10.30 + config: + server.labels: { zone: "z1", az: "az1", rack: "r1", host: "30" } + - host: 10.63.10.31 + config: + server.labels: { zone: "z1", az: "az1", rack: "r1", host: "31" } + - host: 10.63.10.32 + config: + server.labels: { zone: "z1", az: "az1", rack: "r2", host: "32" } + - host: 10.63.10.33 + config: + server.labels: { zone: "z1", az: "az1", rack: "r2", host: "33" } + + - host: 10.63.10.34 + config: + server.labels: { zone: "z2", az: "az2", rack: "r1", host: "34" } + - host: 10.63.10.35 + config: + server.labels: { zone: "z2", az: "az2", rack: "r1", host: "35" } + - host: 10.63.10.36 + config: + server.labels: { zone: "z2", az: "az2", rack: "r2", host: "36" } + - host: 10.63.10.37 + config: + server.labels: { zone: "z2", az: "az2", rack: "r2", host: "37" } + + - host: 10.63.10.38 + config: + server.labels: { zone: "z3", az: "az3", rack: "r1", host: "38" } + - host: 10.63.10.39 + config: + server.labels: { zone: "z3", az: "az3", rack: "r1", host: "39" } + - host: 10.63.10.40 + config: + server.labels: { zone: "z3", az: "az3", rack: "r2", host: "40" } + - host: 10.63.10.41 + config: + server.labels: { zone: "z3", az: "az3", rack: "r2", host: "41" } +``` + +本例中,zone 表示逻辑可用区层级,用于控制副本的隔离(当前集群 3 副本)。 + +不直接采用 az、rack 和 host 三层 Label 结构,是因为考虑到将来可能会扩容 AZ,假设新扩容的 AZ 编号是 AZ2、AZ3 和 AZ4,则只需在对应可用区下扩容 AZ,rack 也只需在对应 AZ 下扩容。 + +如果直接采用 AZ、rack 和 host 三层 Label 结构,那么扩容 AZ 操作可能需重新添加 Label,TiKV 数据整体需要 Rebalance。 + +### 高可用和容灾分析 + +采用区域多 AZ 方案,当任意一个 AZ 故障时,集群能自动恢复服务,不需要人工介入,并能保证数据一致性。注意,各种调度策略主要用于优化性能,当发生故障时,调度机制总是优先考虑可用性而不是性能。 diff --git a/oracle-functions-to-tidb.md b/oracle-functions-to-tidb.md index 773572b29dd9..27610b4d2b71 100644 --- a/oracle-functions-to-tidb.md +++ b/oracle-functions-to-tidb.md @@ -15,34 +15,75 @@ summary: 了解 Oracle 与 TiDB 函数和语法差异对照。 下表列出了 Oracle 与 TiDB 部分函数的对照表。 -| 函数 | Oracle 语法 | TiDB 语法 | 说明 | -|---|---|---|---| -| 转换数据类型 |
  • `TO_NUMBER(key)`
  • `TO_CHAR(key)`
  • | `CONVERT(key,dataType)` | TiDB 支持转换为下面类型:`BINARY`、`CHAR`、`DATE`、`DATETIME`、`TIME`、`SIGNED INTEGER`、`UNSIGNED INTEGER` 和 `DECIMAL`。 | -| 日期类型转换为字符串类型 |
  • `TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mi:ss')`
  • `TO_CHAR(SYSDATE,'yyyy-MM-dd')`
  • |
  • `DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')`
  • `DATE_FORMAT(NOW(),'%Y-%m-%d')`
  • | TiDB 的格式化字符串大小写敏感。 | -| 字符串类型转换为日期类型 |
  • `TO_DATE('2021-05-28 17:31:37','yyyy-MM-dd hh24:mi:ss')`
  • `TO_DATE('2021-05-28','yyyy-MM-dd hh24:mi:ss')`
  • |
  • `STR_TO_DATE('2021-05-28 17:31:37','%Y-%m-%d %H:%i:%s')`
  • `STR_TO_DATE('2021-05-28','%Y-%m-%d%T')`
  • | TiDB 的格式化字符串大小写敏感。 | -| 获取系统当前时间(精确到秒)| `SYSDATE` | `NOW()` | | -| 获取当前时间(精确到微秒)| `SYSTIMESTAMP` | `CURRENT_TIMESTAMP(6)` | | -| 获取两个日期相差的天数 | `date1 - date2` | `DATEDIFF(date1, date2)` | | -| 获取两个日期间隔月份 | `MONTHS_BETWEEN(ENDDATE,SYSDATE)` | `TIMESTAMPDIFF(MONTH,SYSDATE,ENDDATE)` | Oracle 中 `MONTHS_BETWEEN()` 函数与 TiDB 中 `TIMESTAMPDIFF()` 函数的结果会有误差。`TIMESTAMPDIFF()` 只保留整数月。使用时需要注意,两个函数的参数位置相反。 | -| 日期增加/减少 n 天 | `DATEVAL + n` | `DATE_ADD(dateVal,INTERVAL n DAY)` | `n` 可为负数。| -| 日期增加/减少 n 月 | `ADD_MONTHS(dateVal,n)`| `DATE_ADD(dateVal,INTERVAL n MONTH)` | `n` 可为负数。| -| 获取日期到日 | `TRUNC(SYSDATE)` |
  • `CAST(NOW() AS DATE)`
  • `DATE_FORMAT(NOW(),'%Y-%m-%d')`
  • | TiDB 中 `CAST` 与 `DATE_FORMAT` 结果一致。| -| 获取日期当月第一天 | `TRUNC(SYSDATE,'mm')` | `DATE_ADD(CURDATE(),interval - day(CURDATE()) + 1 day)` | | -| 截取数据 | `TRUNC(2.136) = 2`
    `TRUNC(2.136,2) = 2.13` | `TRUNCATE(2.136,0) = 2`
    `TRUNCATE(2.136,2) = 2.13` | 数据精度保留,直接截取相应小数位,不涉及四舍五入。 | -| 获取序列下一个值 | `sequence_name.NEXTVAL` | `NEXTVAL(sequence_name)` | | -| 获取随机序列值 | `SYS_GUID()` | `UUID()` | TiDB 返回一个通用唯一识别码 (UUID)。| -| 左/右外连接 | `SELECT * FROM a, b WHERE a.id = b.id(+);`
    `SELECT * FROM a, b WHERE a.id(+) = b.id;` | `SELECT * FROM a LEFT JOIN b ON a.id = b.id;`
    `SELECT * FROM a RIGHT JOIN b ON a.id = b.id;` | 关联查询时,TiDB 不支持使用 (+) 实现左/右关联,只能通过 `LEFT JOIN` 或 `RIGHT JOIN` 实现。| -| `NVL()` | `NVL(key,val)` | `IFNULL(key,val)` | 如果该字段值为 `NULL`,则返回 val 值,否则返回该字段的值。 | -| `NVL2()` | `NVL2(key, val1, val2)` | `IF(key is NULL, val1, val2)` | 如果该字段值非 `NULL`,则返回 val1 值,否则返回 val2 值。| -| `DECODE()` |
  • `DECODE(key,val1,val2,val3)`
  • `DECODE(value,if1,val1,if2,val2,...,ifn,valn,val)`
  • |
  • `IF(key=val1,val2,val3)`
  • `CASE WHEN value=if1 THEN val1 WHEN value=if2 THEN val2,...,WHEN value=ifn THEN valn ELSE val END`
  • |
  • 如果该字段值等于 val1,则返回 val2,否则返回 val3。
  • 当该字段值满足条件 1 (if1) 时,返回 val1,满足条件 2 (if2) 时,返回 val2,满足条件 3 (if3) 时,返回 val3。
  • | -| 拼接字符串 `a` 和 `b` | 'a' \|\| 'b' | `CONCAT('a','b')` | | -| 获取字符串长度 | `LENGTH(str)` | `CHAR_LENGTH(str)` | | -| 获取子串 | `SUBSTR('abcdefg',0,2) = 'ab'`
    `SUBSTR('abcdefg',1,2) = 'ab'` | `SUBSTRING('abcdefg',0,2) = ''`
    `SUBSTRING('abcdefg',1,2) = 'ab'` |
  • Oracle 中起始位置 0 与 1 作用一样。
  • TiDB 中 0 开始获取的子串为空,若需从字符串的起始位置开始,则应从 1 开始。
  • | -| 字符串在源字符串中的位置 | `INSTR('abcdefg','b',1,1)` | `INSTR('abcdefg','b')` | 从字符串 `'abcdefg'` 第一个字符开始查询,返回 `'b'` 字符串第一次出现的位置。 | -| 字符串在源字符串中的位置 | `INSTR('stst','s',1,2)` | `LENGTH(SUBSTRING_INDEX('stst','s',2)) + 1` | 从字符串 `'stst'` 第一个字符开始查找,返回 `'s'` 字符第二次出现的位置。 | -| 字符串在源字符串中的位置 | `INSTR('abcabc','b',2,1)` | `LOCATE('b','abcabc',2)` | 从字符串 `'abcabc'` 第二个字符开始查询,返回 `'b'` 字符第一次出现的位置。 | -| 列合并为行 | `LISTAGG(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME),'***') within GROUP(ORDER BY DIMENSIONNAME)` | `GROUP_CONCAT(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME) ORDER BY DIMENSIONNAME SEPARATOR '***')` | 将一列字段合并为一行并根据 `***` 符号进行分割。 | -| ASCII 值转化为对应字符 | `CHR(n)` | `CHAR(n)` | Oracle 中制表符 (`CHR(9)`)、换行符 (`CHR(10)`)、回车符 (`CHR(13)`) 对应 TiDB 中的 `CHAR(9)`、`CHAR(10)`、`CHAR(13)`。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 函数 | Oracle 语法 | TiDB 语法 | 说明 | ++==============================+===================================================================================================+====================================================================================================+============================================================================================================================================================+ +| 转换数据类型 | `TO_NUMBER(key)` | `CONVERT(key,dataType)` | TiDB 支持转换为下面类型:`BINARY`、`CHAR`、`DATE`、`DATETIME`、`TIME`、`SIGNED INTEGER`、`UNSIGNED INTEGER` 和 `DECIMAL`。 | +| | | | | +| | `TO_CHAR(key)` | | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 日期类型转换为字符串类型 | `TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mi:ss')` | `DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')` | TiDB 的格式化字符串大小写敏感。 | +| | | | | +| | `TO_CHAR(SYSDATE,'yyyy-MM-dd')` | `DATE_FORMAT(NOW(),'%Y-%m-%d')` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 字符串类型转换为日期类型 | `TO_DATE('2021-05-28 17:31:37','yyyy-MM-dd hh24:mi:ss')` | `STR_TO_DATE('2021-05-28 17:31:37','%Y-%m-%d %H:%i:%s')` | TiDB 的格式化字符串大小写敏感。 | +| | | | | +| | `TO_DATE('2021-05-28','yyyy-MM-dd hh24:mi:ss')` | `STR_TO_DATE('2021-05-28','%Y-%m-%d%T')` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取系统当前时间(精确到秒) | `SYSDATE` | `NOW()` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取当前时间(精确到微秒) | `SYSTIMESTAMP` | `CURRENT_TIMESTAMP(6)` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取两个日期相差的天数 | `date1 - date2` | `DATEDIFF(date1, date2)` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取两个日期间隔月份 | `MONTHS_BETWEEN(ENDDATE,SYSDATE)` | `TIMESTAMPDIFF(MONTH,SYSDATE,ENDDATE)` | Oracle 中 `MONTHS_BETWEEN()` 函数与 TiDB 中 `TIMESTAMPDIFF()` 函数的结果会有误差。`TIMESTAMPDIFF()` 只保留整数月。使用时需要注意,两个函数的参数位置相反。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 日期增加/减少 n 天 | `DATEVAL + n` | `DATE_ADD(dateVal,INTERVAL n DAY)` | `n` 可为负数。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 日期增加/减少 n 月 | `ADD_MONTHS(dateVal,n)` | `DATE_ADD(dateVal,INTERVAL n MONTH)` | `n` 可为负数。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取日期到日 | `TRUNC(SYSDATE)` | `CAST(NOW() AS DATE)` | TiDB 中 `CAST` 与 `DATE_FORMAT` 结果一致。 | +| | | | | +| | | `DATE_FORMAT(NOW(),'%Y-%m-%d')` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取日期当月第一天 | `TRUNC(SYSDATE,'mm')` | `DATE_ADD(CURDATE(),interval - day(CURDATE()) + 1 day)` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 截取数据 | `TRUNC(2.136) = 2` | `TRUNCATE(2.136,0) = 2` | 数据精度保留,直接截取相应小数位,不涉及四舍五入。 | +| | `TRUNC(2.136,2) = 2.13` | `TRUNCATE(2.136,2) = 2.13` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取序列下一个值 | `sequence_name.NEXTVAL` | `NEXTVAL(sequence_name)` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取随机序列值 | `SYS_GUID()` | `UUID()` | TiDB 返回一个通用唯一识别码 (UUID)。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 左/右外连接 | `SELECT * FROM a, b WHERE a.id = b.id(+);` | `SELECT * FROM a LEFT JOIN b ON a.id = b.id;` | 关联查询时,TiDB 不支持使用 (+) 实现左/右关联,只能通过 `LEFT JOIN` 或 `RIGHT JOIN` 实现。 | +| | `SELECT * FROM a, b WHERE a.id(+) = b.id;` | `SELECT * FROM a RIGHT JOIN b ON a.id = b.id;` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `NVL()` | `NVL(key,val)` | `IFNULL(key,val)` | 如果该字段值为 `NULL`,则返回 val 值,否则返回该字段的值。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `NVL2()` | `NVL2(key, val1, val2)` | `IF(key is NULL, val1, val2)` | 如果该字段值非 `NULL`,则返回 val1 值,否则返回 val2 值。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `DECODE()` | `DECODE(key,val1,val2,val3)` | `IF(key=val1,val2,val3)` | 如果该字段值等于 val1,则返回 val2,否则返回 val3。 | +| | | | | +| | `DECODE(value,if1,val1,if2,val2,...,ifn,valn,val)` | `CASE WHEN value=if1 THEN val1 WHEN value=if2 THEN val2,...,WHEN value=ifn THEN valn ELSE val END` | 当该字段值满足条件 1 (if1) 时,返回 val1,满足条件 2 (if2) 时,返回 val2,满足条件 3 (if3) 时,返回 val3。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 拼接字符串 `a` 和 `b` | `'a' || 'b'` | `CONCAT('a','b')` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取字符串长度 | `LENGTH(str)` | `CHAR_LENGTH(str)` | | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 获取子串 | `SUBSTR('abcdefg',0,2) = 'ab'` | `SUBSTRING('abcdefg',0,2) = ''` | Oracle 中起始位置 0 与 1 作用一样。 | +| | `SUBSTR('abcdefg',1,2) = 'ab'` | `SUBSTRING('abcdefg',1,2) = 'ab'` | | +| | | | TiDB 中 0 开始获取的子串为空,若需从字符串的起始位置开始,则应从 1 开始。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 字符串在源字符串中的位置 | `INSTR('abcdefg','b',1,1)` | `INSTR('abcdefg','b')` | 从字符串 `'abcdefg'` 第一个字符开始查询,返回 `'b'` 字符串第一次出现的位置。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 字符串在源字符串中的位置 | `INSTR('stst','s',1,2)` | `LENGTH(SUBSTRING_INDEX('stst','s',2)) + 1` | 从字符串 `'stst'` 第一个字符开始查找,返回 `'s'` 字符第二次出现的位置。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 字符串在源字符串中的位置 | `INSTR('abcabc','b',2,1)` | `LOCATE('b','abcabc',2)` | 从字符串 `'abcabc'` 第二个字符开始查询,返回 `'b'` 字符第一次出现的位置。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 列合并为行 | `LISTAGG(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME),'***') within GROUP(ORDER BY DIMENSIONNAME)` | `GROUP_CONCAT(CONCAT(E.dimensionid,'---',E.DIMENSIONNAME) ORDER BY DIMENSIONNAME SEPARATOR '***')` | 将一列字段合并为一行并根据 `***` 符号进行分割。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ASCII 值转化为对应字符 | `CHR(n)` | `CHAR(n)` | Oracle 中制表符 (`CHR(9)`)、换行符 (`CHR(10)`)、回车符 (`CHR(13)`) 对应 TiDB 中的 `CHAR(9)`、`CHAR(10)`、`CHAR(13)`。 | ++------------------------------+---------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## 语法差异 diff --git a/post-installation-check.md b/post-installation-check.md index 16b5b7896c53..b63da861f80b 100644 --- a/post-installation-check.md +++ b/post-installation-check.md @@ -1,212 +1,212 @@ ---- -title: 验证集群运行状态 -summary: 介绍如何验证集群运行状态。 ---- - -# 验证集群运行状态 - -在部署完一套 TiDB 集群后,需要检查集群是否正常运行。本文介绍如何通过 TiUP 命令、[TiDB Dashboard](/dashboard/dashboard-intro.md) 和 Grafana 检查集群状态,以及如何登录 TiDB 数据库执行简单的 SQL 操作。 - -## 通过 TiUP 检查集群状态 - -检查集群状态的命令是 `tiup cluster display `,例如: - -{{< copyable "shell-regular" >}} - -```shell -tiup cluster display tidb-test -``` - -预期结果输出:各节点 Status 状态信息为 `Up` 说明集群状态正常。 - -## 通过 TiDB Dashboard 和 Grafana 检查集群状态 - -本节介绍如何通过 [TiDB Dashboard](/dashboard/dashboard-intro.md) 和 Grafana 检查集群状态。 - -### 查看 TiDB Dashboard 检查 TiDB 集群状态 - -1. 通过 `{pd-ip}:{pd-port}/dashboard` 登录 TiDB Dashboard,登录用户和口令为 TiDB 数据库 `root` 用户和口令。如果你修改过数据库的 `root` 密码,则以修改后的密码为准,默认密码为空。 - - ![TiDB-Dashboard](/media/tiup/tidb-dashboard.png) - -2. 主页面显示 TiDB 集群中节点信息 - - ![TiDB-Dashboard-status](/media/tiup/tidb-dashboard-status.png) - -### 查看 Grafana 监控 Overview 页面检查 TiDB 集群状态 - -- 通过 `{Grafana-ip}:3000` 登录 Grafana 监控,默认用户名及密码为 `admin`/`admin`。 - -- 点击 **Overview** 监控页面检查 TiDB 端口和负载监控信息。 - - ![Grafana-overview](/media/tiup/grafana-overview.png) - -## 登录数据库执行简单 DML/DDL 操作和查询 SQL 语句 - -> **注意:** -> -> 登录数据库前,你需要安装 MySQL 客户端。 - -执行以下命令登录数据库: - -{{< copyable "shell-regular" >}} - -```shell -mysql -u root -h ${tidb_server_host_IP_address} -P 4000 -``` - -其中,`${tidb_server_host_IP_address}` 是在[初始化集群拓扑文件](/production-deployment-using-tiup.md#第-3-步初始化集群拓扑文件)时为 `tidb_servers` 配置的 IP 地址之一,例如 `10.0.1.7`。 - -输出下列信息表示登录成功: - -```sql -Welcome to the MySQL monitor. Commands end with ; or \g. -Your MySQL connection id is 3 -Server version: 5.7.25-TiDB-v5.0.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible - -Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. - -Oracle is a registered trademark of Oracle Corporation and/or its -affiliates. Other names may be trademarks of their respective -owners. - -Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. -``` - -### 数据库操作 - -+ 检查 TiDB 版本 - - {{< copyable "sql" >}} - - ```sql - select tidb_version()\G - ``` - - 预期结果输出: - - ```sql - *************************** 1. row *************************** - tidb_version(): Release Version: v5.0.0 - Edition: Community - Git Commit Hash: 689a6b6439ae7835947fcaccf329a3fc303986cb - Git Branch: HEAD - UTC Build Time: 2020-05-28 11:09:45 - GoVersion: go1.13.4 - Race Enabled: false - TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306 - Check Table Before Drop: false - 1 row in set (0.00 sec) - ``` - -+ 创建 PingCAP database - - {{< copyable "sql" >}} - - ```sql - create database pingcap; - ``` - - ```sql - Query OK, 0 rows affected (0.10 sec) - ``` - - {{< copyable "sql" >}} - - ```sql - use pingcap; - ``` - - 预期输出 - - ```sql - Database changed - ``` - -+ 创建 `tab_tidb` 表 - - {{< copyable "sql" >}} - - ```sql - CREATE TABLE `tab_tidb` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(20) NOT NULL DEFAULT '', - `age` int(11) NOT NULL DEFAULT 0, - `version` varchar(20) NOT NULL DEFAULT '', - PRIMARY KEY (`id`), - KEY `idx_age` (`age`)); - ``` - - 预期输出 - - ```sql - Query OK, 0 rows affected (0.11 sec) - ``` - -+ 插入数据 - - {{< copyable "sql" >}} - - ```sql - insert into `tab_tidb` values (1,'TiDB',5,'TiDB-v5.0.0'); - ``` - - 预期输出 - - ```sql - Query OK, 1 row affected (0.03 sec) - ``` - -+ 查看 `tab_tidb` 结果 - - {{< copyable "sql" >}} - - ```sql - select * from tab_tidb; - ``` - - 预期输出 - - ```sql - +----+------+-----+-------------+ - | id | name | age | version | - +----+------+-----+-------------+ - | 1 | TiDB | 5 | TiDB-v5.0.0 | - +----+------+-----+-------------+ - 1 row in set (0.00 sec) - ``` - -+ 查看 TiKV store 状态、`store_id`、存储情况以及启动时间 - - {{< copyable "sql" >}} - - ```sql - select STORE_ID,ADDRESS,STORE_STATE,STORE_STATE_NAME,CAPACITY,AVAILABLE,UPTIME from INFORMATION_SCHEMA.TIKV_STORE_STATUS; - ``` - - 预期输出 - - ```sql - +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ - | STORE_ID | ADDRESS | STORE_STATE | STORE_STATE_NAME | CAPACITY | AVAILABLE | UPTIME | - +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ - | 1 | 10.0.1.1:20160 | 0 | Up | 49.98GiB | 46.3GiB | 5h21m52.474864026s | - | 4 | 10.0.1.2:20160 | 0 | Up | 49.98GiB | 46.32GiB | 5h21m52.522669177s | - | 5 | 10.0.1.3:20160 | 0 | Up | 49.98GiB | 45.44GiB | 5h21m52.713660541s | - +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ - 3 rows in set (0.00 sec) - ``` - -+ 退出 - - {{< copyable "sql" >}} - - ```sql - exit - ``` - - 预期输出 - - ```sql - Bye - ``` +--- +title: 验证集群运行状态 +summary: 介绍如何验证集群运行状态。 +--- + +# 验证集群运行状态 + +在部署完一套 TiDB 集群后,需要检查集群是否正常运行。本文介绍如何通过 TiUP 命令、[TiDB Dashboard](/dashboard/dashboard-intro.md) 和 Grafana 检查集群状态,以及如何登录 TiDB 数据库执行简单的 SQL 操作。 + +## 通过 TiUP 检查集群状态 + +检查集群状态的命令是 `tiup cluster display `,例如: + +{{< copyable "shell-regular" >}} + +```shell +tiup cluster display tidb-test +``` + +预期结果输出:各节点 Status 状态信息为 `Up` 说明集群状态正常。 + +## 通过 TiDB Dashboard 和 Grafana 检查集群状态 + +本节介绍如何通过 [TiDB Dashboard](/dashboard/dashboard-intro.md) 和 Grafana 检查集群状态。 + +### 查看 TiDB Dashboard 检查 TiDB 集群状态 + +1. 通过 `{pd-ip}:{pd-port}/dashboard` 登录 TiDB Dashboard,登录用户和口令为 TiDB 数据库 `root` 用户和口令。如果你修改过数据库的 `root` 密码,则以修改后的密码为准,默认密码为空。 + + ![TiDB-Dashboard](/media/tiup/tidb-dashboard.png) + +2. 主页面显示 TiDB 集群中节点信息 + + ![TiDB-Dashboard-status](/media/tiup/tidb-dashboard-status.png) + +### 查看 Grafana 监控 Overview 页面检查 TiDB 集群状态 + +- 通过 `{Grafana-ip}:3000` 登录 Grafana 监控,默认用户名及密码为 `admin`/`admin`。 + +- 点击 **Overview** 监控页面检查 TiDB 端口和负载监控信息。 + + ![Grafana-overview](/media/tiup/grafana-overview.png) + +## 登录数据库执行简单 DML/DDL 操作和查询 SQL 语句 + +> **注意:** +> +> 登录数据库前,你需要安装 MySQL 客户端。 + +执行以下命令登录数据库: + +{{< copyable "shell-regular" >}} + +```shell +mysql -u root -h ${tidb_server_host_IP_address} -P 4000 +``` + +其中,`${tidb_server_host_IP_address}` 是在[初始化集群拓扑文件](/production-deployment-using-tiup.md#第-3-步初始化集群拓扑文件)时为 `tidb_servers` 配置的 IP 地址之一,例如 `10.0.1.7`。 + +输出下列信息表示登录成功: + +```sql +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.25-TiDB-v5.0.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible + +Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. +``` + +### 数据库操作 + ++ 检查 TiDB 版本 + + {{< copyable "sql" >}} + + ```sql + select tidb_version()\G + ``` + + 预期结果输出: + + ```sql + *************************** 1. row *************************** + tidb_version(): Release Version: v5.0.0 + Edition: Community + Git Commit Hash: 689a6b6439ae7835947fcaccf329a3fc303986cb + Git Branch: HEAD + UTC Build Time: 2020-05-28 11:09:45 + GoVersion: go1.13.4 + Race Enabled: false + TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306 + Check Table Before Drop: false + 1 row in set (0.00 sec) + ``` + ++ 创建 PingCAP database + + {{< copyable "sql" >}} + + ```sql + create database pingcap; + ``` + + ```sql + Query OK, 0 rows affected (0.10 sec) + ``` + + {{< copyable "sql" >}} + + ```sql + use pingcap; + ``` + + 预期输出 + + ```sql + Database changed + ``` + ++ 创建 `tab_tidb` 表 + + {{< copyable "sql" >}} + + ```sql + CREATE TABLE `tab_tidb` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(20) NOT NULL DEFAULT '', + `age` int(11) NOT NULL DEFAULT 0, + `version` varchar(20) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `idx_age` (`age`)); + ``` + + 预期输出 + + ```sql + Query OK, 0 rows affected (0.11 sec) + ``` + ++ 插入数据 + + {{< copyable "sql" >}} + + ```sql + insert into `tab_tidb` values (1,'TiDB',5,'TiDB-v5.0.0'); + ``` + + 预期输出 + + ```sql + Query OK, 1 row affected (0.03 sec) + ``` + ++ 查看 `tab_tidb` 结果 + + {{< copyable "sql" >}} + + ```sql + select * from tab_tidb; + ``` + + 预期输出 + + ```sql + +----+------+-----+-------------+ + | id | name | age | version | + +----+------+-----+-------------+ + | 1 | TiDB | 5 | TiDB-v5.0.0 | + +----+------+-----+-------------+ + 1 row in set (0.00 sec) + ``` + ++ 查看 TiKV store 状态、`store_id`、存储情况以及启动时间 + + {{< copyable "sql" >}} + + ```sql + select STORE_ID,ADDRESS,STORE_STATE,STORE_STATE_NAME,CAPACITY,AVAILABLE,UPTIME from INFORMATION_SCHEMA.TIKV_STORE_STATUS; + ``` + + 预期输出 + + ```sql + +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ + | STORE_ID | ADDRESS | STORE_STATE | STORE_STATE_NAME | CAPACITY | AVAILABLE | UPTIME | + +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ + | 1 | 10.0.1.1:20160 | 0 | Up | 49.98GiB | 46.3GiB | 5h21m52.474864026s | + | 4 | 10.0.1.2:20160 | 0 | Up | 49.98GiB | 46.32GiB | 5h21m52.522669177s | + | 5 | 10.0.1.3:20160 | 0 | Up | 49.98GiB | 45.44GiB | 5h21m52.713660541s | + +----------+--------------------+-------------+------------------+----------+-----------+--------------------+ + 3 rows in set (0.00 sec) + ``` + ++ 退出 + + {{< copyable "sql" >}} + + ```sql + exit + ``` + + 预期输出 + + ```sql + Bye + ``` diff --git a/production-deployment-using-tiup.md b/production-deployment-using-tiup.md index 3eab1670f1ae..962e7c6fefaf 100644 --- a/production-deployment-using-tiup.md +++ b/production-deployment-using-tiup.md @@ -272,15 +272,30 @@ alertmanager_servers: 下表列出了常用的 7 种场景,请根据链接中的拓扑说明以及配置文件模板配置`topology.yaml`。如果有其他组合场景的需求,请根据多个模板自行调整。 -| 场景 | 配置任务 | 配置文件模板 | 拓扑说明 | -| :-- | :-- | :-- | :-- | -| OLTP 业务 | [部署最小拓扑架构](/minimal-deployment-topology.md) | [简单最小配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-mini.yaml)
    [详细最小配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-mini.yaml) | 最小集群拓扑,包括 tidb-server、tikv-server、pd-server。 | -| HTAP 业务 | [部署 TiFlash 拓扑架构](/tiflash-deployment-topology.md) | [简单 TiFlash 配置模版](https://github.com/pingcap/docs/blob/master/config-templates/simple-tiflash.yaml)
    [详细 TiFlash 配置模版](https://github.com/pingcap/docs/blob/master/config-templates/complex-tiflash.yaml) | 在最小拓扑的基础上部署 TiFlash。TiFlash 是列式存储引擎,已经逐步成为集群拓扑的标配。| -| 使用 [TiCDC](/ticdc/ticdc-overview.md) 进行增量同步 | [部署 TiCDC 拓扑架构](/ticdc-deployment-topology.md) | [简单 TiCDC 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-cdc.yaml)
    [详细 TiCDC 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-cdc.yaml) | 在最小拓扑的基础上部署 TiCDC。TiCDC 支持多种下游:TiDB、MySQL、Kafka、MQ、Confluent 和存储服务。 | -| 使用 [TiDB Binlog](/tidb-binlog/tidb-binlog-overview.md) 进行增量同步 | [部署 TiDB Binlog 拓扑架构](/tidb-binlog-deployment-topology.md) | [简单 TiDB Binlog 配置模板(下游为 MySQL)](https://github.com/pingcap/docs/blob/master/config-templates/simple-tidb-binlog.yaml)
    [简单 TiDB Binlog 配置模板(下游为 file)](https://github.com/pingcap/docs/blob/master/config-templates/simple-file-binlog.yaml)
    [详细 TiDB Binlog 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-tidb-binlog.yaml) | 在最小拓扑的基础上部署 TiDB Binlog。 | -| 使用 Spark 的 OLAP 业务 | [部署 TiSpark 拓扑架构](/tispark-deployment-topology.md) | [简单 TiSpark 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-tispark.yaml)
    [详细 TiSpark 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-tispark.yaml) | 在最小拓扑的基础上部署 TiSpark 组件。TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品。TiUP cluster 组件对 TiSpark 的支持目前为实验特性。 | -| 单台机器,多个实例 | [混合部署拓扑架构](/hybrid-deployment-topology.md) | [简单混部配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-multi-instance.yaml)
    [详细混部配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-multi-instance.yaml) | 也适用于单机多实例需要额外增加目录、端口、资源配比、label 等配置的场景。 | -| 跨机房部署 TiDB 集群 | [跨机房部署拓扑架构](/geo-distributed-deployment-topology.md) | [跨机房配置模板](https://github.com/pingcap/docs/blob/master/config-templates/geo-redundancy-deployment.yaml) | 以典型的两地三中心架构为例,介绍跨机房部署架构,以及需要注意的关键设置。 | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 场景 | 配置任务 | 配置文件模板 | 拓扑说明 | ++:======================================================================+:=================================================================+:==================================================================================================================================+:=================================================================================================================================================+ +| OLTP 业务 | [部署最小拓扑架构](/minimal-deployment-topology.md) | [简单最小配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-mini.yaml) | 最小集群拓扑,包括 tidb-server、tikv-server、pd-server。 | +| | | [详细最小配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-mini.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| HTAP 业务 | [部署 TiFlash 拓扑架构](/tiflash-deployment-topology.md) | [简单 TiFlash 配置模版](https://github.com/pingcap/docs/blob/master/config-templates/simple-tiflash.yaml) | 在最小拓扑的基础上部署 TiFlash。TiFlash 是列式存储引擎,已经逐步成为集群拓扑的标配。 | +| | | [详细 TiFlash 配置模版](https://github.com/pingcap/docs/blob/master/config-templates/complex-tiflash.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 使用 [TiCDC](/ticdc/ticdc-overview.md) 进行增量同步 | [部署 TiCDC 拓扑架构](/ticdc-deployment-topology.md) | [简单 TiCDC 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-cdc.yaml) | 在最小拓扑的基础上部署 TiCDC。TiCDC 支持多种下游:TiDB、MySQL、Kafka、MQ、Confluent 和存储服务。 | +| | | [详细 TiCDC 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-cdc.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 使用 [TiDB Binlog](/tidb-binlog/tidb-binlog-overview.md) 进行增量同步 | [部署 TiDB Binlog 拓扑架构](/tidb-binlog-deployment-topology.md) | [简单 TiDB Binlog 配置模板(下游为 MySQL)](https://github.com/pingcap/docs/blob/master/config-templates/simple-tidb-binlog.yaml) | 在最小拓扑的基础上部署 TiDB Binlog。 | +| | | [简单 TiDB Binlog 配置模板(下游为 file)](https://github.com/pingcap/docs/blob/master/config-templates/simple-file-binlog.yaml) | | +| | | [详细 TiDB Binlog 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-tidb-binlog.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 使用 Spark 的 OLAP 业务 | [部署 TiSpark 拓扑架构](/tispark-deployment-topology.md) | [简单 TiSpark 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-tispark.yaml) | 在最小拓扑的基础上部署 TiSpark 组件。TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品。TiUP cluster 组件对 TiSpark 的支持目前为实验特性。 | +| | | [详细 TiSpark 配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-tispark.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 单台机器,多个实例 | [混合部署拓扑架构](/hybrid-deployment-topology.md) | [简单混部配置模板](https://github.com/pingcap/docs/blob/master/config-templates/simple-multi-instance.yaml) | 也适用于单机多实例需要额外增加目录、端口、资源配比、label 等配置的场景。 | +| | | [详细混部配置模板](https://github.com/pingcap/docs/blob/master/config-templates/complex-multi-instance.yaml) | | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ +| 跨机房部署 TiDB 集群 | [跨机房部署拓扑架构](/geo-distributed-deployment-topology.md) | [跨机房配置模板](https://github.com/pingcap/docs/blob/master/config-templates/geo-redundancy-deployment.yaml) | 以典型的两地三中心架构为例,介绍跨机房部署架构,以及需要注意的关键设置。 | ++-----------------------------------------------------------------------+------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+ > **注意:** > diff --git a/quick-start-with-tidb.md b/quick-start-with-tidb.md index 3d49d638c2f9..32147b589eea 100644 --- a/quick-start-with-tidb.md +++ b/quick-start-with-tidb.md @@ -280,13 +280,25 @@ TiDB 是一个分布式系统。最基础的 TiDB 测试集群通常由 2 个 Ti > > 下表中拓扑实例的 IP 为示例 IP。在实际部署时,请替换为实际的 IP。 -| 实例 | 个数 | IP | 配置 | -|:-- | :-- | :-- | :-- | -| TiKV | 3 | 10.0.1.1
    10.0.1.1
    10.0.1.1 | 避免端口和目录冲突 | -| TiDB | 1 | 10.0.1.1 | 默认端口
    全局目录配置 | -| PD | 1 | 10.0.1.1 | 默认端口
    全局目录配置 | -| TiFlash | 1 | 10.0.1.1 | 默认端口
    全局目录配置 | -| Monitor | 1 | 10.0.1.1 | 默认端口
    全局目录配置 | ++-----------------+-----------------+-----------------+--------------------+ +| 实例 | 个数 | IP | 配置 | ++:================+:================+:================+:===================+ +| TiKV | 3 | 10.0.1.1 | 避免端口和目录冲突 | +| | | 10.0.1.1 | | +| | | 10.0.1.1 | | ++-----------------+-----------------+-----------------+--------------------+ +| TiDB | 1 | 10.0.1.1 | 默认端口 | +| | | | 全局目录配置 | ++-----------------+-----------------+-----------------+--------------------+ +| PD | 1 | 10.0.1.1 | 默认端口 | +| | | | 全局目录配置 | ++-----------------+-----------------+-----------------+--------------------+ +| TiFlash | 1 | 10.0.1.1 | 默认端口 | +| | | | 全局目录配置 | ++-----------------+-----------------+-----------------+--------------------+ +| Monitor | 1 | 10.0.1.1 | 默认端口 | +| | | | 全局目录配置 | ++-----------------+-----------------+-----------------+--------------------+ 部署主机软件和环境要求: diff --git a/releases/release-6.0.0-dmr.md b/releases/release-6.0.0-dmr.md index 8d0bd0010ae3..e5e498fcbcdd 100644 --- a/releases/release-6.0.0-dmr.md +++ b/releases/release-6.0.0-dmr.md @@ -284,49 +284,102 @@ v6.0.0 是 DMR 版本,版本名称为 6.0.0-DMR。 ### 系统变量 -| 变量名 | 修改类型 | 描述 | -|:---|:---|:---| -| `placement_checks` | 删除 | 该变量用于控制 DDL 语句是否验证通过 [Placement Rules in SQL](/placement-rules-in-sql.md) 指定的放置规则。已被 `tidb_placement_mode` 替代。 | -| `tidb_enable_alter_placement` | 删除 | 该变量用于开启 [Placement Rules in SQL](/placement-rules-in-sql.md)。 | -| `tidb_mem_quota_hashjoin`
    `tidb_mem_quota_indexlookupjoin`
    `tidb_mem_quota_indexlookupreader`
    `tidb_mem_quota_mergejoin`
    `tidb_mem_quota_sort`
    `tidb_mem_quota_topn` | 删除 | 从 TiDB v5.0.0 起,这几个变量被 `tidb_mem_quota_query` 取代并从系统变量文档中移除,为了保证兼容性代码中还保留。从 TiDB v6.0.0 起,代码中也正式移除这些变量。 | -| [`tidb_enable_mutation_checker`](/system-variables.md#tidb_enable_mutation_checker-从-v600-版本开始引入) | 新增 | 设置是否开启 mutation checker,默认开启。如果从低于 v6.0.0 的版本升级到 v6.0.0,升级后默认关闭。 | -| [`tidb_ignore_prepared_cache_close_stmt`](/system-variables.md#tidb_ignore_prepared_cache_close_stmt-从-v600-版本开始引入) | 新增 | 设置是否忽略关闭 Prepared Statement 的指令,默认值为 `OFF`。 | -| [`tidb_mem_quota_binding_cache`](/system-variables.md#tidb_mem_quota_binding_cache-从-v600-版本开始引入) | 新增 | 设置存放 `binding` 的缓存的内存使用阈值,默认值为 `67108864` (64 MiB)。 | -| [`tidb_placement_mode`](/system-variables.md#tidb_placement_mode-从-v600-版本开始引入) | 新增 | 控制 DDL 语句是否忽略 [Placement Rules in SQL](/placement-rules-in-sql.md) 指定的放置规则。默认值为 `strict`,表示不忽略。 | -| [`tidb_rc_read_check_ts`](/system-variables.md#tidb_rc_read_check_ts-从-v600-版本开始引入) | 新增 |
    • 优化事务内读语句延迟。如果读写冲突较为严重,开启此变量会增加额外开销和延迟,造成性能回退。默认关闭。
    • 该变量与 [replica-read](/system-variables.md#tidb_replica_read-从-v40-版本开始引入) 尚不兼容,开启 `tidb_rc_read_check_ts` 的读请求无法使用 [replica-read](/system-variables.md#tidb_replica_read-从-v40-版本开始引入),请勿同时开启两个变量。
    | -| [`tidb_sysdate_is_now`](/system-variables.md#tidb_sysdate_is_now-从-v600-版本开始引入) | 新增 | 控制 `SYSDATE` 函数是否替换为 `NOW` 函数,效果与 MySQL 中的 [`sysdate-is-now`](https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_sysdate-is-now) 一致。默认值为 `OFF`。 | -| [`tidb_table_cache_lease`](/system-variables.md#tidb_table_cache_lease-从-v600-版本开始引入) | 新增 | 用来控制缓存表(新增 feature)的 lease 时间,默认值是 3 秒。 | -| [`tidb_top_sql_max_meta_count`](/system-variables.md#tidb_top_sql_max_meta_count-从-v600-版本开始引入) | 新增 | 用于控制 [Top SQL](/dashboard/top-sql.md) 每分钟最多收集 SQL 语句类型的数量,默认值为 `5000`。 | -| [`tidb_top_sql_max_time_series_count`](/system-variables.md#tidb_top_sql_max_time_series_count-从-v600-版本开始引入) | 新增 | 用于控制 [Top SQL](/dashboard/top-sql.md) 每分钟保留消耗负载最大的前多少条 SQL(即 Top N)的数据,默认值为 `100`。 | -| [`tidb_txn_assertion_level`](/system-variables.md#tidb_txn_assertion_level-从-v600-版本开始引入) | 新增 | 设置 assertion 级别,assertion 是一项在事务提交过程中进行的数据索引一致性校验。默认仅开启对性能影响微小的检查,包含大部分检查效果。如果从低于 v6.0.0 的版本升级到 v6.0.0,升级后默认关闭检查。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 变量名 | 修改类型 | 描述 | ++:===========================================================================================================================+:======================+:===================================================================================================================================================================================================================================================+ +| `placement_checks` | 删除 | 该变量用于控制 DDL 语句是否验证通过 [Placement Rules in SQL](/placement-rules-in-sql.md) 指定的放置规则。已被 `tidb_placement_mode` 替代。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `tidb_enable_alter_placement` | 删除 | 该变量用于开启 [Placement Rules in SQL](/placement-rules-in-sql.md)。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| `tidb_mem_quota_hashjoin` | 删除 | 从 TiDB v5.0.0 起,这几个变量被 `tidb_mem_quota_query` 取代并从系统变量文档中移除,为了保证兼容性代码中还保留。从 TiDB v6.0.0 起,代码中也正式移除这些变量。 | +| `tidb_mem_quota_indexlookupjoin` | | | +| `tidb_mem_quota_indexlookupreader` | | | +| `tidb_mem_quota_mergejoin` | | | +| `tidb_mem_quota_sort` | | | +| `tidb_mem_quota_topn` | | | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_enable_mutation_checker`](/system-variables.md#tidb_enable_mutation_checker-从-v600-版本开始引入) | 新增 | 设置是否开启 mutation checker,默认开启。如果从低于 v6.0.0 的版本升级到 v6.0.0,升级后默认关闭。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_ignore_prepared_cache_close_stmt`](/system-variables.md#tidb_ignore_prepared_cache_close_stmt-从-v600-版本开始引入) | 新增 | 设置是否忽略关闭 Prepared Statement 的指令,默认值为 `OFF`。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_mem_quota_binding_cache`](/system-variables.md#tidb_mem_quota_binding_cache-从-v600-版本开始引入) | 新增 | 设置存放 `binding` 的缓存的内存使用阈值,默认值为 `67108864` (64 MiB)。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_placement_mode`](/system-variables.md#tidb_placement_mode-从-v600-版本开始引入) | 新增 | 控制 DDL 语句是否忽略 [Placement Rules in SQL](/placement-rules-in-sql.md) 指定的放置规则。默认值为 `strict`,表示不忽略。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_rc_read_check_ts`](/system-variables.md#tidb_rc_read_check_ts-从-v600-版本开始引入) | 新增 | - 优化事务内读语句延迟。如果读写冲突较为严重,开启此变量会增加额外开销和延迟,造成性能回退。默认关闭。 | +| | | - 该变量与 [replica-read](/system-variables.md#tidb_replica_read-从-v40-版本开始引入) 尚不兼容,开启 `tidb_rc_read_check_ts` 的读请求无法使用 [replica-read](/system-variables.md#tidb_replica_read-从-v40-版本开始引入),请勿同时开启两个变量。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_sysdate_is_now`](/system-variables.md#tidb_sysdate_is_now-从-v600-版本开始引入) | 新增 | 控制 `SYSDATE` 函数是否替换为 `NOW` 函数,效果与 MySQL 中的 [`sysdate-is-now`](https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_sysdate-is-now) 一致。默认值为 `OFF`。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_table_cache_lease`](/system-variables.md#tidb_table_cache_lease-从-v600-版本开始引入) | 新增 | 用来控制缓存表(新增 feature)的 lease 时间,默认值是 3 秒。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_top_sql_max_meta_count`](/system-variables.md#tidb_top_sql_max_meta_count-从-v600-版本开始引入) | 新增 | 用于控制 [Top SQL](/dashboard/top-sql.md) 每分钟最多收集 SQL 语句类型的数量,默认值为 `5000`。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_top_sql_max_time_series_count`](/system-variables.md#tidb_top_sql_max_time_series_count-从-v600-版本开始引入) | 新增 | 用于控制 [Top SQL](/dashboard/top-sql.md) 每分钟保留消耗负载最大的前多少条 SQL(即 Top N)的数据,默认值为 `100`。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_txn_assertion_level`](/system-variables.md#tidb_txn_assertion_level-从-v600-版本开始引入) | 新增 | 设置 assertion 级别,assertion 是一项在事务提交过程中进行的数据索引一致性校验。默认仅开启对性能影响微小的检查,包含大部分检查效果。如果从低于 v6.0.0 的版本升级到 v6.0.0,升级后默认关闭检查。 | ++----------------------------------------------------------------------------------------------------------------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ### 配置文件参数 -| 配置文件 | 配置项 | 修改类型 | 描述 | -|:---|:---|:---|:---| -| TiDB | `stmt-summary.enable`
    `stmt-summary.enable-internal-query`
    `stmt-summary.history-size`
    `stmt-summary.max-sql-length`
    `stmt-summary.max-stmt-count`
    `stmt-summary.refresh-interval` | 删除 | 系统表 [statement summary tables](/statement-summary-tables.md) 的相关配置,所有配置项现已移除,统一改成用 SQL variable 控制。 | -| TiDB | [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) | 修改 | 用于开启新的 collation 支持。自 v6.0.0 起默认值从 false 改为 true。该配置项只有在初次初始化集群时生效,初始化集群后,无法通过更改该配置项打开或关闭新的 collation 框架。 | -| TiKV | [`backup.num-threads`](/tikv-configuration-file.md#num-threads-1) | 修改 | 修改可调整范围为 `[1, CPU]`。 | -| TiKV | [`raftstore.apply-max-batch-size`](/tikv-configuration-file.md#apply-max-batch-size) | 修改 | 添加最大值为 `10240`。 | -| TiKV | [`raftstore.raft-max-size-per-msg`](/tikv-configuration-file.md#raft-max-size-per-msg) | 修改 |
    • 修改最小值(由 `0` 修改为大于 `0`)
    • 添加最大值为 `3GB`
    • 添加单位(由 `MB` 增加为 KB\|MB\|GB
    | -| TiKV | [`raftstore.store-max-batch-size`](/tikv-configuration-file.md#store-max-batch-size) | 修改 | 添加最大值为 `10240`。 | -| TiKV | [`readpool.unified.max-thread-count`](/tikv-configuration-file.md#max-thread-count) | 修改 | 修改可调整范围为 `[min-thread-count, MAX(4, CPU)]`。 | -| TiKV | [`rocksdb.enable-pipelined-write`](/tikv-configuration-file.md#enable-pipelined-write) | 修改 | 修改默认值为 `false`。开启时会使用旧的 Pipelined Write,关闭时会使用新的 Pipelined Commit 机制。 | -| TiKV | [`rocksdb.max-background-flushes`](/tikv-configuration-file.md#max-background-flushes) | 修改 | 在 CPU 核数为 10 时修改默认值为 `3`,在 CPU 核数量为 8 时默认为 `2`。 | -| TiKV | [`rocksdb.max-background-jobs`](/tikv-configuration-file.md#max-background-jobs) | 修改 | 在 CPU 核数为 10 时修改默认值为 `9`,在 CPU 核数量为 8 时默认为 `7`。 | -| TiFlash | [`profiles.default.dt_enable_logical_split`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 存储引擎的 segment 分裂是否使用逻辑分裂。自 v6.0.0 起默认值从 `true` 改为 `false`。 | -| TiFlash | [`profiles.default.enable_elastic_threadpool`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 是否启用可自动扩展的线程池。自 v6.0.0 起默认值从 `false` 改为 `true`。 | -| TiFlash | [`storage.format_version`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 该配置项控制 TiFlash 存储引擎的校验功能,自 v6.0.0 起默认值从 `2` 改为 `3`。`format_version` 设置为 `3` 时, 支持对 TiFlash 的所有数据的读操作进行一致性校验,避免由于硬件故障而读到错误的数据。
    注意:新版本数据格式不支持原地降级为早于 5.4 的版本。 | -| TiDB | [`pessimistic-txn.pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit) | 新增 | 用来控制开启全局悲观事务模式下 (`tidb_txn_mode='pessimistic'`) 时,自动提交的事务使用的事务模式。 | -| TiKV | [`pessimistic-txn.in-memory`](/tikv-configuration-file.md#in-memory-从-v600-版本开始引入) | 新增 | 开启内存悲观锁功能。开启该功能后,悲观事务会尽可能在 TiKV 内存中存储悲观锁,而不将悲观锁写入磁盘,也不将悲观锁同步给其他副本,从而提升悲观事务的性能。但有较低概率出现悲观锁丢失的情况,可能会导致悲观事务提交失败。该参数默认值为 `true`。 | -| TiKV | [`quota`](/tikv-configuration-file.md#quota) | 新增 | 新增前台限流相关的配置项,可以限制前台各类请求所占用的资源。前台限流功能为实验特性,默认关闭。新增的相关配置项为 `foreground-cpu-time`、`foreground-write-bandwidth`、`foreground-read-bandwidth`、`max-delay-duration`。 | -| TiFlash | [`profiles.default.dt_compression_method`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 新增 | TiFlash 存储引擎的压缩算法,支持 LZ4、zstd 和 LZ4HC,大小写不敏感。默认使用 LZ4 算法。 | -| TiFlash | [`profiles.default.dt_compression_level`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 新增 | TiFlash 存储引擎的压缩级别,默认值 `1`。 | -| DM | [`loaders..import-mode`](/dm/task-configuration-file-full.md#完整配置文件示例) | 新增 | 该配置项控制全量阶段数据导入的模式。自 v6.0.0 起全量阶段默认使用 TiDB Lightning 的 TiDB-backend 方式导入,替换原来的 Loader 组件。此变动为内部组件替换,对日常使用没有明显影响。
    默认值 `sql` 表示启用 tidb-backend 组件,可能在极少数场景下存在未能完全兼容的情况,可以通过配置为 "loader" 回退。 | -| DM | [`loaders..on-duplicate`](/dm/task-configuration-file-full.md#完整配置文件示例) | 新增 | 该配置项控制全量导入阶段出现的冲突数据的解决方式。默认值为 `replace`,覆盖重复数据。 | -| TiCDC | [`dial-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 和下游 Kafka 建立连接的超时时长,默认值为 `10s` | -| TiCDC | [`read-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 读取下游 Kafka 返回的 response 的超时时长,默认值 `10s` | -| TiCDC | [`write-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 向下游 Kafka 发送 request 的超时时长,默认值为 `10s` | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 配置文件 | 配置项 | 修改类型 | 描述 | ++:================+:=====================================================================================================================+:================+:============================================================================================================================================================================================================================================+ +| TiDB | `stmt-summary.enable` | 删除 | 系统表 [statement summary tables](/statement-summary-tables.md) 的相关配置,所有配置项现已移除,统一改成用 SQL variable 控制。 | +| | `stmt-summary.enable-internal-query` | | | +| | `stmt-summary.history-size` | | | +| | `stmt-summary.max-sql-length` | | | +| | `stmt-summary.max-stmt-count` | | | +| | `stmt-summary.refresh-interval` | | | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) | 修改 | 用于开启新的 collation 支持。自 v6.0.0 起默认值从 false 改为 true。该配置项只有在初次初始化集群时生效,初始化集群后,无法通过更改该配置项打开或关闭新的 collation 框架。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`backup.num-threads`](/tikv-configuration-file.md#num-threads-1) | 修改 | 修改可调整范围为 `[1, CPU]`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`raftstore.apply-max-batch-size`](/tikv-configuration-file.md#apply-max-batch-size) | 修改 | 添加最大值为 `10240`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`raftstore.raft-max-size-per-msg`](/tikv-configuration-file.md#raft-max-size-per-msg) | 修改 | - 修改最小值(由 `0` 修改为大于 `0`) | +| | | | - 添加最大值为 `3GB` | +| | | | - 添加单位(由 `MB` 增加为 `KB |MB|GB`) | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`raftstore.store-max-batch-size`](/tikv-configuration-file.md#store-max-batch-size) | 修改 | 添加最大值为 `10240`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`readpool.unified.max-thread-count`](/tikv-configuration-file.md#max-thread-count) | 修改 | 修改可调整范围为 `[min-thread-count, MAX(4, CPU)]`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`rocksdb.enable-pipelined-write`](/tikv-configuration-file.md#enable-pipelined-write) | 修改 | 修改默认值为 `false`。开启时会使用旧的 Pipelined Write,关闭时会使用新的 Pipelined Commit 机制。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`rocksdb.max-background-flushes`](/tikv-configuration-file.md#max-background-flushes) | 修改 | 在 CPU 核数为 10 时修改默认值为 `3`,在 CPU 核数量为 8 时默认为 `2`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`rocksdb.max-background-jobs`](/tikv-configuration-file.md#max-background-jobs) | 修改 | 在 CPU 核数为 10 时修改默认值为 `9`,在 CPU 核数量为 8 时默认为 `7`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiFlash | [`profiles.default.dt_enable_logical_split`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 存储引擎的 segment 分裂是否使用逻辑分裂。自 v6.0.0 起默认值从 `true` 改为 `false`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiFlash | [`profiles.default.enable_elastic_threadpool`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 是否启用可自动扩展的线程池。自 v6.0.0 起默认值从 `false` 改为 `true`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiFlash | [`storage.format_version`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 修改 | 该配置项控制 TiFlash 存储引擎的校验功能,自 v6.0.0 起默认值从 `2` 改为 `3`。`format_version` 设置为 `3` 时, 支持对 TiFlash 的所有数据的读操作进行一致性校验,避免由于硬件故障而读到错误的数据。 | +| | | | 注意:新版本数据格式不支持原地降级为早于 5.4 的版本。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | [`pessimistic-txn.pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit) | 新增 | 用来控制开启全局悲观事务模式下 (`tidb_txn_mode='pessimistic'`) 时,自动提交的事务使用的事务模式。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`pessimistic-txn.in-memory`](/tikv-configuration-file.md#in-memory-从-v600-版本开始引入) | 新增 | 开启内存悲观锁功能。开启该功能后,悲观事务会尽可能在 TiKV 内存中存储悲观锁,而不将悲观锁写入磁盘,也不将悲观锁同步给其他副本,从而提升悲观事务的性能。但有较低概率出现悲观锁丢失的情况,可能会导致悲观事务提交失败。该参数默认值为 `true`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`quota`](/tikv-configuration-file.md#quota) | 新增 | 新增前台限流相关的配置项,可以限制前台各类请求所占用的资源。前台限流功能为实验特性,默认关闭。新增的相关配置项为 `foreground-cpu-time`、`foreground-write-bandwidth`、`foreground-read-bandwidth`、`max-delay-duration`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiFlash | [`profiles.default.dt_compression_method`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 新增 | TiFlash 存储引擎的压缩算法,支持 LZ4、zstd 和 LZ4HC,大小写不敏感。默认使用 LZ4 算法。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiFlash | [`profiles.default.dt_compression_level`](/tiflash/tiflash-configuration.md#配置文件-tiflashtoml) | 新增 | TiFlash 存储引擎的压缩级别,默认值 `1`。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DM | [`loaders..import-mode`](/dm/task-configuration-file-full.md#完整配置文件示例) | 新增 | 该配置项控制全量阶段数据导入的模式。自 v6.0.0 起全量阶段默认使用 TiDB Lightning 的 TiDB-backend 方式导入,替换原来的 Loader 组件。此变动为内部组件替换,对日常使用没有明显影响。 | +| | | | 默认值 `sql` 表示启用 tidb-backend 组件,可能在极少数场景下存在未能完全兼容的情况,可以通过配置为 "loader" 回退。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DM | [`loaders..on-duplicate`](/dm/task-configuration-file-full.md#完整配置文件示例) | 新增 | 该配置项控制全量导入阶段出现的冲突数据的解决方式。默认值为 `replace`,覆盖重复数据。 | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`dial-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 和下游 Kafka 建立连接的超时时长,默认值为 `10s` | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`read-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 读取下游 Kafka 返回的 response 的超时时长,默认值 `10s` | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`write-timeout`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 向下游 Kafka 发送 request 的超时时长,默认值为 `10s` | ++-----------------+----------------------------------------------------------------------------------------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ### 其他 diff --git a/releases/release-6.1.0.md b/releases/release-6.1.0.md index ddf347309196..46edff6119d5 100644 --- a/releases/release-6.1.0.md +++ b/releases/release-6.1.0.md @@ -227,65 +227,127 @@ TiDB 版本:6.1.0 ### 系统变量 -| 变量名 | 修改类型 | 描述 | -|:---|:--|:----| -| [`tidb_enable_list_partition`](/system-variables.md#tidb_enable_list_partition-从-v50-版本开始引入) | 修改 | 默认值从 `OFF` 改为 `ON`。 | -| [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) | 修改 | 增加 GLOBAL 作用域,变量值可以持久化到集群。 | -| [`tidb_query_log_max_len`](/system-variables.md#tidb_query_log_max_len) | 修改 | 变量作用域由 INSTANCE 修改为 GLOBAL,变量值可以持久化到集群。取值范围修改为 `[0, 1073741824]`。 | -| [`require_secure_transport`](/system-variables.md#require_secure_transport-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `require-secure-transport` 转化而来。 | -| [`tidb_committer_concurrency`](/system-variables.md#tidb_committer_concurrency-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `committer-concurrency` 转化而来。 | -| [`tidb_enable_auto_analyze`](/system-variables.md#tidb_enable_auto_analyze-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `run-auto-analyze` 转化而来。 | -| [`tidb_enable_new_only_full_group_by_check`](/system-variables.md#tidb_enable_new_only_full_group_by_check-从-v610-版本开始引入) | 新增 | 控制 TiDB 执行 `ONLY_FULL_GROUP_BY` 检查时的行为。 | -| [`tidb_enable_outer_join_reorder`](/system-variables.md#tidb_enable_outer_join_reorder-从-v610-版本开始引入) | 新增 | 控制 TiDB 的 [Join Reorder 算法](/join-reorder.md) 支持 Outer Join,默认开启。对于从旧版本升级上来的集群,该变量的默认值也会是 `TRUE`。 | -| [`tidb_enable_prepared_plan_cache`](/system-variables.md#tidb_enable_prepared_plan_cache-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.enabled` 转化而来。 | -| [`tidb_gc_max_wait_time`](/system-variables.md#tidb_gc_max_wait_time-从-v610-版本开始引入) | 新增 | 用于指定活跃事务阻碍 GC safe point 推进的最大时间。 | -| [`tidb_max_auto_analyze_time`](/system-variables.md#tidb_max_auto_analyze_time-从-v610-版本开始引入) | 新增 | 用于指定自动 ANALYZE 的最大执行时间。 | -| [`tidb_max_tiflash_threads`](/system-variables.md#tidb_max_tiflash_threads-从-v610-版本开始引入) | 新增 | 由 TiFlash 配置项 `max_threads`
    转化而来,表示 TiFlash 中 request 执行的最大并发度。 | -| [`tidb_mem_oom_action`](/system-variables.md#tidb_mem_oom_action-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `oom-action` 转化而来。 | -| [`tidb_mem_quota_analyze`](/system-variables.md#tidb_mem_quota_analyze-从-v610-版本开始引入) | 新增 | 控制 TiDB 更新统计信息时总的内存占用,包括用户执行的 [`ANALYZE TABLE`](/sql-statements/sql-statement-analyze-table.md) 和 TiDB 后台自动执行的统计信息更新任务。 | -| [`tidb_nontransactional_ignore_error`](/system-variables.md#tidb_nontransactional_ignore_error-从-v610-版本开始引入) | 新增 | 设置是否在非事务语句中立刻返回错误。 | -| [`tidb_prepared_plan_cache_memory_guard_ratio`](/system-variables.md#tidb_prepared_plan_cache_memory_guard_ratio-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.memory-guard-ratio` 转化而来。 | -| [`tidb_prepared_plan_cache_size`](/system-variables.md#tidb_prepared_plan_cache_size-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.capacity` 转化而来。 | -| [`tidb_stats_cache_mem_quota`](/system-variables.md#tidb_stats_cache_mem_quota-从-v610-版本开始引入) | 新增 | 控制 TiDB 内部统计信息缓存使用内存的上限。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 变量名 | 修改类型 | 描述 | ++:=======================================================================================================================================+:======================+:================================================================================================================================================================+ +| [`tidb_enable_list_partition`](/system-variables.md#tidb_enable_list_partition-从-v50-版本开始引入) | 修改 | 默认值从 `OFF` 改为 `ON`。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) | 修改 | 增加 GLOBAL 作用域,变量值可以持久化到集群。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_query_log_max_len`](/system-variables.md#tidb_query_log_max_len) | 修改 | 变量作用域由 INSTANCE 修改为 GLOBAL,变量值可以持久化到集群。取值范围修改为 `[0, 1073741824]`。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`require_secure_transport`](/system-variables.md#require_secure_transport-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `require-secure-transport` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_committer_concurrency`](/system-variables.md#tidb_committer_concurrency-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `committer-concurrency` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_enable_auto_analyze`](/system-variables.md#tidb_enable_auto_analyze-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `run-auto-analyze` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_enable_new_only_full_group_by_check`](/system-variables.md#tidb_enable_new_only_full_group_by_check-从-v610-版本开始引入) | 新增 | 控制 TiDB 执行 `ONLY_FULL_GROUP_BY` 检查时的行为。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_enable_outer_join_reorder`](/system-variables.md#tidb_enable_outer_join_reorder-从-v610-版本开始引入) | 新增 | 控制 TiDB 的 [Join Reorder 算法](/join-reorder.md) 支持 Outer Join,默认开启。对于从旧版本升级上来的集群,该变量的默认值也会是 `TRUE`。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_enable_prepared_plan_cache`](/system-variables.md#tidb_enable_prepared_plan_cache-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.enabled` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_gc_max_wait_time`](/system-variables.md#tidb_gc_max_wait_time-从-v610-版本开始引入) | 新增 | 用于指定活跃事务阻碍 GC safe point 推进的最大时间。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_max_auto_analyze_time`](/system-variables.md#tidb_max_auto_analyze_time-从-v610-版本开始引入) | 新增 | 用于指定自动 ANALYZE 的最大执行时间。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_max_tiflash_threads`](/system-variables.md#tidb_max_tiflash_threads-从-v610-版本开始引入) | 新增 | 由 TiFlash 配置项 `max_threads` | +| | | 转化而来,表示 TiFlash 中 request 执行的最大并发度。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_mem_oom_action`](/system-variables.md#tidb_mem_oom_action-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `oom-action` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_mem_quota_analyze`](/system-variables.md#tidb_mem_quota_analyze-从-v610-版本开始引入) | 新增 | 控制 TiDB 更新统计信息时总的内存占用,包括用户执行的 [`ANALYZE TABLE`](/sql-statements/sql-statement-analyze-table.md) 和 TiDB 后台自动执行的统计信息更新任务。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_nontransactional_ignore_error`](/system-variables.md#tidb_nontransactional_ignore_error-从-v610-版本开始引入) | 新增 | 设置是否在非事务语句中立刻返回错误。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_prepared_plan_cache_memory_guard_ratio`](/system-variables.md#tidb_prepared_plan_cache_memory_guard_ratio-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.memory-guard-ratio` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_prepared_plan_cache_size`](/system-variables.md#tidb_prepared_plan_cache_size-从-v610-版本开始引入) | 新增 | 由 TiDB 配置项 `prepared-plan-cache.capacity` 转化而来。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [`tidb_stats_cache_mem_quota`](/system-variables.md#tidb_stats_cache_mem_quota-从-v610-版本开始引入) | 新增 | 控制 TiDB 内部统计信息缓存使用内存的上限。 | ++----------------------------------------------------------------------------------------------------------------------------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ ### 配置文件参数 -| 配置文件 | 配置项 | 修改类型 | 描述 | -|:---|:---|:---|:-----| -| TiDB | `committer-concurrency` | 删除 | 转化为系统变量 `tidb_committer_concurrency`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `lower-case-table-names` | 删除 | TiDB 目前只支持 `lower_case_table_name=2`,如果升级前设置了其他值,升级到 v6.1.0 后该值会丢失。 | -| TiDB | `mem-quota-query` | 删除 | 转化为系统变量 `tidb_mem_quota_query`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `oom-action` | 删除 | 转化为系统变量 `tidb_mem_oom_action`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `prepared-plan-cache.capacity` | 删除 | 转化为系统变量 `tidb_prepared_plan_cache_size`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `prepared-plan-cache.enabled` | 删除 | 转化为系统变量 `tidb_enable_prepared_plan_cache`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `query-log-max-len` | 删除 | 转化为系统变量 `tidb_query_log_max_len`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `require-secure-transport` | 删除 | 转化为系统变量 `require_secure_transport`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | `run-auto-analyze` | 删除 | 转化为系统变量 `tidb_enable_auto_analyze`。该配置项不再生效,如需修改,需修改对应的系统变量。 | -| TiDB | [`enable-global-kill`](/tidb-configuration-file.md#enable-global-kill-从-v610-版本开始引入) | 新增 | 当该配置项值默认为 `true` ,`KILL` 语句和 `KILL TIDB` 语句均能跨节点终止查询或连接,无需担心错误地终止其他查询或连接。 | -| TiDB | [`enable-stats-cache-mem-quota`](/tidb-configuration-file.md#enable-stats-cache-mem-quota-从-v610-版本开始引入) | 新增 | 控制 TiDB 是否开启统计信息缓存的内存上限。 | -| TiKV | [`raft-engine.enable`](/tikv-configuration-file.md#enable-1) | 修改 | 默认值从 `false` 修改为 `true`。 | -| TiKV | [`region-max-keys`](/tikv-configuration-file.md#region-max-keys) | 修改 | 默认值从 1440000 修改为 `region-split-keys / 2 * 3`。 | -| TiKV | [`region-max-size`](/tikv-configuration-file.md#region-max-size) | 修改 | 默认值从 144 MB 修改为 `region-split-size / 2 * 3`。 | -| TiKV | [`coprocessor.enable-region-bucket`](/tikv-configuration-file.md#enable-region-bucket-从-v610-版本开始引入) | 新增 | 是否将 Region 划分为更小的区间 bucket。 | -| TiKV | [`coprocessor.region-bucket-size`](/tikv-configuration-file.md#region-bucket-size-从-v610-版本开始引入) | 新增 | 设置 `enable-region-bucket` 启用时 bucket 的预期大小。 | -| TiKV | [`causal-ts.renew-batch-min-size`](/tikv-configuration-file.md#renew-batch-min-size) | 新增 | 时间戳缓存的最小数量。 | -| TiKV | [`causal-ts.renew-interval`](/tikv-configuration-file.md#renew-interval) | 新增 | 刷新本地缓存时间戳的周期。 | -| TiKV | [`max-snapshot-file-raw-size`](/tikv-configuration-file.md#max-snapshot-file-raw-size-从-v610-版本开始引入) | 新增 | 当 snapshot 文件大于该配置项指定的大小时,snapshot 文件会被切割为多个文件。 | -| TiKV | [`raft-engine.memory-limit`](/tikv-configuration-file.md#memory-limit) | 新增 | 指定 Raft Engine 使用内存的上限。 | -| TiKV | [`storage.background-error-recovery-window`](/tikv-configuration-file.md#background-error-recovery-window-从-v610-版本开始引入) | 新增 | RocksDB 检测到可恢复的后台错误后,所允许的最长恢复时间。 | -| TiKV | [`storage.api-version`](/tikv-configuration-file.md#api-version-从-v610-版本开始引入) | 新增 | TiKV 作为 Raw Key Value 存储数据时使用的存储格式与接口版本。 | -| PD | [`schedule.max-store-preparing-time`](/pd-configuration-file.md#max-store-preparing-time-从-v610-版本开始引入) | 新增 | 控制 store 上线阶段的最长等待时间。 | -| TiCDC | [`enable-tls`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 控制是否使用 TLS 连接 Kafka。 | -| TiCDC | `sasl-gssapi-user`
    `sasl-gssapi-password`
    `sasl-gssapi-auth-type`
    `sasl-gssapi-service-name`
    `sasl-gssapi-realm`
    `sasl-gssapi-key-tab-path`
    `sasl-gssapi-kerberos-config-path` | 新增 | 支持 Kafka SASL/GSSAPI 认证所需要的参数。详情见 [Sink URI 配置 `kafka`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。 | -| TiCDC | [`avro-decimal-handling-mode`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)
    [`avro-bigint-unsigned-handling-mode`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 控制 Avro 格式的输出细节。 | -| TiCDC | [`dispatchers.topic`](/ticdc/ticdc-changefeed-config.md) | 新增 | 控制 TiCDC 将增量数据分发到不同 Kafka Topic 的策略 | -| TiCDC | [`dispatchers.partition`](/ticdc/ticdc-changefeed-config.md) | 新增 | `dispatchers.partition` 是原 `dispatchers.dispatcher` 配置项的别名,用于控制增量数据的 Kafka Partition 分发策略。 | -| TiCDC | [`schema-registry`](/ticdc/ticdc-sink-to-kafka.md#ticdc-集成-kafka-connect-confluent-platform) | 新增 | 用于指定存储 Avro Schema 的 Schema Registry Endpoint。 | -| DM | `dmctl start-relay` 命令中的 worker 参数 | 删除 | 不推荐使用的方式,将通过更为简单的实现替代。 | -| DM | source 配置中的 `relay-dir` | 删除 | 由 worker 配置文件中的同名配置项替代。 | -| DM | task 配置中的 `is-sharding` | 删除 | 由 `shard-mode` 配置项替代。 | -| DM | task 配置中的 `auto-fix-gtid` | 删除 | 该配置已在 5.x 版本废弃,v6.1.0 正式移除。 | -| DM | source 配置中的 `meta-dir`、`charset` | 删除 | 该配置已在 5.x 版本废弃,v6.1.0 正式移除。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| 配置文件 | 配置项 | 修改类型 | 描述 | ++:================+:================================================================================================================================+:================+:=============================================================================================================================+ +| TiDB | `committer-concurrency` | 删除 | 转化为系统变量 `tidb_committer_concurrency`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `lower-case-table-names` | 删除 | TiDB 目前只支持 `lower_case_table_name=2`,如果升级前设置了其他值,升级到 v6.1.0 后该值会丢失。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `mem-quota-query` | 删除 | 转化为系统变量 `tidb_mem_quota_query`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `oom-action` | 删除 | 转化为系统变量 `tidb_mem_oom_action`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `prepared-plan-cache.capacity` | 删除 | 转化为系统变量 `tidb_prepared_plan_cache_size`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `prepared-plan-cache.enabled` | 删除 | 转化为系统变量 `tidb_enable_prepared_plan_cache`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `query-log-max-len` | 删除 | 转化为系统变量 `tidb_query_log_max_len`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `require-secure-transport` | 删除 | 转化为系统变量 `require_secure_transport`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | `run-auto-analyze` | 删除 | 转化为系统变量 `tidb_enable_auto_analyze`。该配置项不再生效,如需修改,需修改对应的系统变量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | [`enable-global-kill`](/tidb-configuration-file.md#enable-global-kill-从-v610-版本开始引入) | 新增 | 当该配置项值默认为 `true` ,`KILL` 语句和 `KILL TIDB` 语句均能跨节点终止查询或连接,无需担心错误地终止其他查询或连接。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiDB | [`enable-stats-cache-mem-quota`](/tidb-configuration-file.md#enable-stats-cache-mem-quota-从-v610-版本开始引入) | 新增 | 控制 TiDB 是否开启统计信息缓存的内存上限。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`raft-engine.enable`](/tikv-configuration-file.md#enable-1) | 修改 | 默认值从 `false` 修改为 `true`。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`region-max-keys`](/tikv-configuration-file.md#region-max-keys) | 修改 | 默认值从 1440000 修改为 `region-split-keys / 2 * 3`。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`region-max-size`](/tikv-configuration-file.md#region-max-size) | 修改 | 默认值从 144 MB 修改为 `region-split-size / 2 * 3`。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`coprocessor.enable-region-bucket`](/tikv-configuration-file.md#enable-region-bucket-从-v610-版本开始引入) | 新增 | 是否将 Region 划分为更小的区间 bucket。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`coprocessor.region-bucket-size`](/tikv-configuration-file.md#region-bucket-size-从-v610-版本开始引入) | 新增 | 设置 `enable-region-bucket` 启用时 bucket 的预期大小。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`causal-ts.renew-batch-min-size`](/tikv-configuration-file.md#renew-batch-min-size) | 新增 | 时间戳缓存的最小数量。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`causal-ts.renew-interval`](/tikv-configuration-file.md#renew-interval) | 新增 | 刷新本地缓存时间戳的周期。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`max-snapshot-file-raw-size`](/tikv-configuration-file.md#max-snapshot-file-raw-size-从-v610-版本开始引入) | 新增 | 当 snapshot 文件大于该配置项指定的大小时,snapshot 文件会被切割为多个文件。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`raft-engine.memory-limit`](/tikv-configuration-file.md#memory-limit) | 新增 | 指定 Raft Engine 使用内存的上限。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`storage.background-error-recovery-window`](/tikv-configuration-file.md#background-error-recovery-window-从-v610-版本开始引入) | 新增 | RocksDB 检测到可恢复的后台错误后,所允许的最长恢复时间。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiKV | [`storage.api-version`](/tikv-configuration-file.md#api-version-从-v610-版本开始引入) | 新增 | TiKV 作为 Raw Key Value 存储数据时使用的存储格式与接口版本。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| PD | [`schedule.max-store-preparing-time`](/pd-configuration-file.md#max-store-preparing-time-从-v610-版本开始引入) | 新增 | 控制 store 上线阶段的最长等待时间。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`enable-tls`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 控制是否使用 TLS 连接 Kafka。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | `sasl-gssapi-user` | 新增 | 支持 Kafka SASL/GSSAPI 认证所需要的参数。详情见 [Sink URI 配置 `kafka`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka)。 | +| | `sasl-gssapi-password` | | | +| | `sasl-gssapi-auth-type` | | | +| | `sasl-gssapi-service-name` | | | +| | `sasl-gssapi-realm` | | | +| | `sasl-gssapi-key-tab-path` | | | +| | `sasl-gssapi-kerberos-config-path` | | | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`avro-decimal-handling-mode`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | 新增 | 控制 Avro 格式的输出细节。 | +| | [`avro-bigint-unsigned-handling-mode`](/ticdc/ticdc-sink-to-kafka.md#sink-uri-配置-kafka) | | | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`dispatchers.topic`](/ticdc/ticdc-changefeed-config.md) | 新增 | 控制 TiCDC 将增量数据分发到不同 Kafka Topic 的策略 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`dispatchers.partition`](/ticdc/ticdc-changefeed-config.md) | 新增 | `dispatchers.partition` 是原 `dispatchers.dispatcher` 配置项的别名,用于控制增量数据的 Kafka Partition 分发策略。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| TiCDC | [`schema-registry`](/ticdc/ticdc-sink-to-kafka.md#ticdc-集成-kafka-connect-confluent-platform) | 新增 | 用于指定存储 Avro Schema 的 Schema Registry Endpoint。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| DM | `dmctl start-relay` 命令中的 worker 参数 | 删除 | 不推荐使用的方式,将通过更为简单的实现替代。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| DM | source 配置中的 `relay-dir` | 删除 | 由 worker 配置文件中的同名配置项替代。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| DM | task 配置中的 `is-sharding` | 删除 | 由 `shard-mode` 配置项替代。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| DM | task 配置中的 `auto-fix-gtid` | 删除 | 该配置已在 5.x 版本废弃,v6.1.0 正式移除。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ +| DM | source 配置中的 `meta-dir`、`charset` | 删除 | 该配置已在 5.x 版本废弃,v6.1.0 正式移除。 | ++-----------------+---------------------------------------------------------------------------------------------------------------------------------+-----------------+------------------------------------------------------------------------------------------------------------------------------+ ### 其他 diff --git a/sql-mode.md b/sql-mode.md index c4cc88e9b984..cc9d2cc49a90 100644 --- a/sql-mode.md +++ b/sql-mode.md @@ -18,36 +18,69 @@ Modes 是用逗号 (',') 间隔开的一系列不同的模式。使用 `SELECT @ ## SQL mode 列表,如下 -| 名称 | 含义 | -| --- | --- | -| PIPES_AS_CONCAT | 将 "\|\|" 视为字符串连接操作符 (+)(同 CONCAT()),而不视为 OR(支持)| -| ANSI_QUOTES | 将 `"` 视为识别符,如果启用 ANSI_QUOTES,只单引号内的会被认为是 String Literals,双引号被解释为识别符,因此不能用双引号来引用字符串(支持)| -| IGNORE_SPACE | 若开启该模式,系统忽略空格。例如:“user” 和 “user “ 是相同的(支持)| -| ONLY_FULL_GROUP_BY | 如果未被聚合函数处理或未被 GROUP BY 的列出现在 SELECT、HAVING、ORDER BY 中,此 SQL 不合法,因为这种列被查询展示出来不合常规(支持)| -| NO_UNSIGNED_SUBTRACTION | 在减运算中,如果某个操作数没有符号,不要将结果标记为 UNSIGNED(支持)| -| NO_DIR_IN_CREATE | 创建表时,忽视所有 INDEX DIRECTORY 和 DATA DIRECTORY 指令,该选项仅对从复制服务器有用 (仅语法支持)| -| NO_KEY_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持)| -| NO_FIELD_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持)| -| NO_TABLE_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持)| -| NO_AUTO_VALUE_ON_ZERO | 若启用该模式,在AUTO_INCREMENT列的处理传入的值是 0 或者具体数值时系统直接将该值写入此列,传入 NULL 时系统自动生成下一个序列号(支持)| -| NO_BACKSLASH_ESCAPES | 若启用该模式,`\` 反斜杠符号仅代表它自己(支持)| -| STRICT_TRANS_TABLES | 对于事务存储引擎启用严格模式,insert非法值之后,回滚整条语句(支持)| -| STRICT_ALL_TABLES | 对于事务型表,写入非法值之后,回滚整个事务语句(支持)| -| NO_ZERO_IN_DATE | 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告(支持) -| NO_ZERO_DATE | 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告(支持)| -| ALLOW_INVALID_DATES | 不检查全部日期的合法性,仅检查月份值在 1 到 12 及日期值在 1 到 31 之间,仅适用于 DATE 和 DATATIME 列,TIMESTAMP 列需要全部检查其合法性(支持)| -| ERROR_FOR_DIVISION_BY_ZERO | 若启用该模式,在 INSERT 或 UPDATE 过程中,被除数为 0 值时,系统产生错误
    若未启用该模式,被除数为 0 值时,系统产生警告,并用 NULL 代替(支持) | -| NO_AUTO_CREATE_USER | 防止 GRANT 自动创建新用户,但指定密码除外(支持)| -| HIGH_NOT_PRECEDENCE | NOT 操作符的优先级是表达式。例如:NOT a BETWEEN b AND c 被解释为 NOT (a BETWEEN b AND c)。在部份旧版本 MySQL 中,表达式被解释为 (NOT a) BETWEEN b AND c(支持) | -| NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎(仅语法支持)| -| PAD_CHAR_TO_FULL_LENGTH | 若启用该模式,系统对于 CHAR 类型不会截断尾部空格(仅语法支持。该模式[在 MySQL 8.0 中已废弃](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_pad_char_to_full_length)。)| -| REAL_AS_FLOAT | 将 REAL 视为 FLOAT 的同义词,而不是 DOUBLE 的同义词(支持)| -| POSTGRESQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持)| -| MSSQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS(仅语法支持)| -| DB2 | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持)| -| MAXDB | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(支持)| -| MySQL323 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持)| -| MYSQL40 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持)| -| ANSI | 等同于 REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE(仅语法支持)| -| TRADITIONAL | 等同于 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER(仅语法支持)| -| ORACLE | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(仅语法支持)| ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 名称 | 含义 | ++===================================+========================================================================================================================================================================================+ +| PIPES_AS_CONCAT | 将 "||" 视为字符串连接操作符 (+)(同 CONCAT()),而不视为 OR(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ANSI_QUOTES | 将 `"` 视为识别符,如果启用 ANSI_QUOTES,只单引号内的会被认为是 String Literals,双引号被解释为识别符,因此不能用双引号来引用字符串(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| IGNORE_SPACE | 若开启该模式,系统忽略空格。例如:“user” 和 “user “ 是相同的(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ONLY_FULL_GROUP_BY | 如果未被聚合函数处理或未被 GROUP BY 的列出现在 SELECT、HAVING、ORDER BY 中,此 SQL 不合法,因为这种列被查询展示出来不合常规(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_UNSIGNED_SUBTRACTION | 在减运算中,如果某个操作数没有符号,不要将结果标记为 UNSIGNED(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_DIR_IN_CREATE | 创建表时,忽视所有 INDEX DIRECTORY 和 DATA DIRECTORY 指令,该选项仅对从复制服务器有用 (仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_KEY_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_FIELD_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_TABLE_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,使用 mysqldump 跨 DB 种类迁移的时需要考虑此选项(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_AUTO_VALUE_ON_ZERO | 若启用该模式,在AUTO_INCREMENT列的处理传入的值是 0 或者具体数值时系统直接将该值写入此列,传入 NULL 时系统自动生成下一个序列号(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_BACKSLASH_ESCAPES | 若启用该模式,`\` 反斜杠符号仅代表它自己(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| STRICT_TRANS_TABLES | 对于事务存储引擎启用严格模式,insert非法值之后,回滚整条语句(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| STRICT_ALL_TABLES | 对于事务型表,写入非法值之后,回滚整个事务语句(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_ZERO_IN_DATE | 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_ZERO_DATE | 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ALLOW_INVALID_DATES | 不检查全部日期的合法性,仅检查月份值在 1 到 12 及日期值在 1 到 31 之间,仅适用于 DATE 和 DATATIME 列,TIMESTAMP 列需要全部检查其合法性(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ERROR_FOR_DIVISION_BY_ZERO | 若启用该模式,在 INSERT 或 UPDATE 过程中,被除数为 0 值时,系统产生错误 | +| | 若未启用该模式,被除数为 0 值时,系统产生警告,并用 NULL 代替(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_AUTO_CREATE_USER | 防止 GRANT 自动创建新用户,但指定密码除外(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| HIGH_NOT_PRECEDENCE | NOT 操作符的优先级是表达式。例如:NOT a BETWEEN b AND c 被解释为 NOT (a BETWEEN b AND c)。在部份旧版本 MySQL 中,表达式被解释为 (NOT a) BETWEEN b AND c(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| PAD_CHAR_TO_FULL_LENGTH | 若启用该模式,系统对于 CHAR 类型不会截断尾部空格(仅语法支持。该模式[在 MySQL 8.0 中已废弃](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_pad_char_to_full_length)。) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| REAL_AS_FLOAT | 将 REAL 视为 FLOAT 的同义词,而不是 DOUBLE 的同义词(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| POSTGRESQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| MSSQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| DB2 | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| MAXDB | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| MySQL323 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| MYSQL40 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ANSI | 等同于 REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| TRADITIONAL | 等同于 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ORACLE | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(仅语法支持) | ++-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/sql-statements/sql-statement-admin.md b/sql-statements/sql-statement-admin.md index 603ffb9da7d8..fca2a7460709 100644 --- a/sql-statements/sql-statement-admin.md +++ b/sql-statements/sql-statement-admin.md @@ -14,13 +14,19 @@ title: ADMIN ## ADMIN 与 DDL 相关的扩展语句 -| 语句 | 功能描述 | -|------------------------------------------------------------------------------------------|-----------------------------| -| [`ADMIN CANCEL DDL JOBS`](/sql-statements/sql-statement-admin-cancel-ddl.md) | 取消当前正在运行的 DDL 作业 | -| [`ADMIN CHECKSUM TABLE`](/sql-statements/sql-statement-admin-checksum-table.md) | 计算表中所有行和索引的 CRC64 校验和 | -| [ADMIN CHECK [TABLE\|INDEX]](/sql-statements/sql-statement-admin-check-table-index.md) | 校验表中数据和对应索引的一致性 | -| [ADMIN SHOW DDL [JOBS\|QUERIES]](/sql-statements/sql-statement-admin-show-ddl.md) | 显示有关当前正在运行或最近完成的 DDL 作业的详细信息| -| [ADMIN SHOW TELEMETRY](/sql-statements/sql-statement-admin-show-telemetry.md) | 显示通过[遥测](/telemetry.md)功能收集到并分享给 PingCAP 的使用信息。 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ +| 语句 | 功能描述 | ++=========================================================================================+======================================================================+ +| [`ADMIN CANCEL DDL JOBS`](/sql-statements/sql-statement-admin-cancel-ddl.md) | 取消当前正在运行的 DDL 作业 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ +| [`ADMIN CHECKSUM TABLE`](/sql-statements/sql-statement-admin-checksum-table.md) | 计算表中所有行和索引的 CRC64 校验和 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ +| [`ADMIN CHECK [TABLE|INDEX]`](/sql-statements/sql-statement-admin-check-table-index.md) | 校验表中数据和对应索引的一致性 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ +| [`ADMIN SHOW DDL [JOBS|QUERIES]`](/sql-statements/sql-statement-admin-show-ddl.md) | 显示有关当前正在运行或最近完成的 DDL 作业的详细信息 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ +| [`ADMIN SHOW TELEMETRY`](/sql-statements/sql-statement-admin-show-telemetry.md) | 显示通过[遥测](/telemetry.md)功能收集到并分享给 PingCAP 的使用信息。 | ++-----------------------------------------------------------------------------------------+----------------------------------------------------------------------+ ## `ADMIN RELOAD` 语句 diff --git a/sql-statements/sql-statement-show-create-database.md b/sql-statements/sql-statement-show-create-database.md index 7c7f8b0a3207..72002cce71cb 100644 --- a/sql-statements/sql-statement-show-create-database.md +++ b/sql-statements/sql-statement-show-create-database.md @@ -1,70 +1,70 @@ ---- -title: SHOW CREATE DATABASE -summary: TiDB 数据库中 SHOW CREATE DATABASE 的使用概况。 ---- - -# SHOW CREATE DATABASE - -`SHOW CREATE DATABASE` 语句用于显示用 SQL 重新创建已有库的确切语句。`SHOW CREATE SCHEMA` 与其同义。 - -## 语法图 - -**ShowCreateDatabaseStmt:** - -```ebnf+diagram -ShowCreateDatabaseStmt ::= - "SHOW" "CREATE" "DATABASE" | "SCHEMA" ("IF" "NOT" "EXISTS")? DBName -``` - -## 示例 - -{{< copyable "sql" >}} - -```sql -CREATE DATABASE test; -``` - -``` -Query OK, 0 rows affected (0.12 sec) -``` - -{{< copyable "sql" >}} - -```sql -SHOW CREATE DATABASE test; -``` - -``` -+----------+------------------------------------------------------------------+ -| Database | Create Database | -+----------+------------------------------------------------------------------+ -| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | -+----------+------------------------------------------------------------------+ -1 row in set (0.00 sec) -``` - -{{< copyable "sql" >}} - -```sql -SHOW CREATE SCHEMA IF NOT EXISTS test; -``` - -``` -+----------+-------------------------------------------------------------------------------------------+ -| Database | Create Database | -+----------+-------------------------------------------------------------------------------------------+ -| test | CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | -+----------+-------------------------------------------------------------------------------------------+ -1 row in set (0.00 sec) -``` - -## MySQL 兼容性 - -`SHOW CREATE DATABASE` 语句与 MySQL 完全兼容。如发现任何兼容性差异,请在 GitHub 上提交 [issue](https://github.com/pingcap/tidb/issues/new/choose)。 - -## 另请参阅 - -* [CREATE TABLE](/sql-statements/sql-statement-create-table.md) -* [DROP TABLE](/sql-statements/sql-statement-drop-table.md) -* [SHOW TABLES](/sql-statements/sql-statement-show-tables.md) -* [SHOW COLUMNS FROM](/sql-statements/sql-statement-show-columns-from.md) +--- +title: SHOW CREATE DATABASE +summary: TiDB 数据库中 SHOW CREATE DATABASE 的使用概况。 +--- + +# SHOW CREATE DATABASE + +`SHOW CREATE DATABASE` 语句用于显示用 SQL 重新创建已有库的确切语句。`SHOW CREATE SCHEMA` 与其同义。 + +## 语法图 + +**ShowCreateDatabaseStmt:** + +```ebnf+diagram +ShowCreateDatabaseStmt ::= + "SHOW" "CREATE" "DATABASE" | "SCHEMA" ("IF" "NOT" "EXISTS")? DBName +``` + +## 示例 + +{{< copyable "sql" >}} + +```sql +CREATE DATABASE test; +``` + +``` +Query OK, 0 rows affected (0.12 sec) +``` + +{{< copyable "sql" >}} + +```sql +SHOW CREATE DATABASE test; +``` + +``` ++----------+------------------------------------------------------------------+ +| Database | Create Database | ++----------+------------------------------------------------------------------+ +| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | ++----------+------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +{{< copyable "sql" >}} + +```sql +SHOW CREATE SCHEMA IF NOT EXISTS test; +``` + +``` ++----------+-------------------------------------------------------------------------------------------+ +| Database | Create Database | ++----------+-------------------------------------------------------------------------------------------+ +| test | CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | ++----------+-------------------------------------------------------------------------------------------+ +1 row in set (0.00 sec) +``` + +## MySQL 兼容性 + +`SHOW CREATE DATABASE` 语句与 MySQL 完全兼容。如发现任何兼容性差异,请在 GitHub 上提交 [issue](https://github.com/pingcap/tidb/issues/new/choose)。 + +## 另请参阅 + +* [CREATE TABLE](/sql-statements/sql-statement-create-table.md) +* [DROP TABLE](/sql-statements/sql-statement-drop-table.md) +* [SHOW TABLES](/sql-statements/sql-statement-show-tables.md) +* [SHOW COLUMNS FROM](/sql-statements/sql-statement-show-columns-from.md) diff --git a/ticdc-deployment-topology.md b/ticdc-deployment-topology.md index 8bddfac001c3..e6c21b137763 100644 --- a/ticdc-deployment-topology.md +++ b/ticdc-deployment-topology.md @@ -13,13 +13,28 @@ summary: 介绍 TiCDC 部署 TiDB 集群的拓扑结构。 ## 拓扑信息 -|实例 | 个数 | 物理机配置 | IP |配置 | -| :-- | :-- | :-- | :-- | :-- | -| TiDB |3 | 16 VCore 32GB * 1 | 10.0.1.1
    10.0.1.2
    10.0.1.3 | 默认端口
    全局目录配置 | -| PD | 3 | 4 VCore 8GB * 1 |10.0.1.4
    10.0.1.5
    10.0.1.6 | 默认端口
    全局目录配置 | -| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) * 1 | 10.0.1.7
    10.0.1.8
    10.0.1.9 | 默认端口
    全局目录配置 | -| CDC | 3 | 8 VCore 16GB * 1 | 10.0.1.11
    10.0.1.12
    10.0.1.13 | 默认端口
    全局目录配置 | -| Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.11 | 默认端口
    全局目录配置 | ++----------------------+-------------+-----------------------------------+-------------+--------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:=====================+:============+:==================================+:============+:=============+ +| TiDB | 3 | 16 VCore 32GB \* 1 | 10.0.1.1 | 默认端口 | +| | | | 10.0.1.2 | 全局目录配置 | +| | | | 10.0.1.3 | | ++----------------------+-------------+-----------------------------------+-------------+--------------+ +| PD | 3 | 4 VCore 8GB \* 1 | 10.0.1.4 | 默认端口 | +| | | | 10.0.1.5 | 全局目录配置 | +| | | | 10.0.1.6 | | ++----------------------+-------------+-----------------------------------+-------------+--------------+ +| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) \* 1 | 10.0.1.7 | 默认端口 | +| | | | 10.0.1.8 | 全局目录配置 | +| | | | 10.0.1.9 | | ++----------------------+-------------+-----------------------------------+-------------+--------------+ +| CDC | 3 | 8 VCore 16GB \* 1 | 10.0.1.11 | 默认端口 | +| | | | 10.0.1.12 | 全局目录配置 | +| | | | 10.0.1.13 | | ++----------------------+-------------+-----------------------------------+-------------+--------------+ +| Monitoring & Grafana | 1 | 4 VCore 8GB \* 1 500GB (ssd) | 10.0.1.11 | 默认端口 | +| | | | | 全局目录配置 | ++----------------------+-------------+-----------------------------------+-------------+--------------+ ### 拓扑模版 diff --git a/ticdc/ticdc-compatibility.md b/ticdc/ticdc-compatibility.md index 24d23d6ebf1c..1181e96aea09 100644 --- a/ticdc/ticdc-compatibility.md +++ b/ticdc/ticdc-compatibility.md @@ -51,12 +51,21 @@ TODO `sort-dir` 配置项用于给 TiCDC 内部的排序器指定临时文件目录,其作用在各版本有过如下兼容性更改: -| 版本 | `sort-engine` 的使用 | 说明 | 使用建议 | -| :--- | :--- | :-- | :-- | -| v4.0.11 及之前的 v4.0 版本,v5.0.0-rc | 作为 changefeed 配置项,给 `file` sorter 和 `unified` Sorter 指定临时文件目录 | 在这些版本中,`file` sorter 和 `unified` sorter **均不是**正式功能 (GA),不推荐在生产环境中使用。

    如果有多个 changefeed 被配置使用了 `unified` 作为 `sort-engine`,那么实际使用的临时文件目录可能是任何一个 changefeed 的 `sort-dir` 配置,且每个 TiCDC 节点上使用的目录可能不一致。 | 不推荐在生产环境中使用 Unified Sorter | -| v4.0.12,v4.0.13,v5.0.0 及 v5.0.1 | 作为 changefeed 配置项或 `cdc server` 配置项 | 在默认情况下 changefeed 的 `sort-dir` 配置不会生效,而 `cdc server` 的 `sort-dir` 配置默认为 `/tmp/cdc_sort`。建议生产环境下仅配置 `cdc server` 的相关配置。

    如果你使用 TiUP 部署 TiCDC,建议升级到最新的 TiUP 版本并在 TiCDC server 配置中设置 `sorter.sort-dir` 一项。

    在 v4.0.13、v5.0.0 和 v5.0.1 中 unified sorter 是默认开启的,如果要将集群升级至这些版本,请确保 TiCDC server 配置中的 `sorter.sort-dir` 已经被正确配置。| 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `sort-dir` | -| v4.0.14 及之后的 v4.0 版本,v5.0.3 及之后的 v5.0 版本,更新的版本 | `sort-dir` 被弃用,建议配置 `data-dir` | `data-dir` 可以通过最新版本的 TiUP 进行配置。这些版本中 unified sorter 是默认开启的,升级时请确保 `data-dir` 已经被正确配置,否则将默认使用 `/tmp/cdc_data`。

    如果该目录所在设备空间不足,有可能出现硬盘空间不足的问题。之前配置的 changefeed 的 `sort-dir` 配置将会失效。| 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `data-dir` | -| v6.0.0 及之后版本 | `data-dir` 被用来存放 TiCDC 生成的临时文件 | 在该版本之后,TiCDC 默认采用 `db sorter` 作为内部的排序引擎,它使用 `data-dir` 作为磁盘目录。 | 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `data-dir` | ++-------------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+ +| 版本 | `sort-engine` 的使用 | 说明 | 使用建议 | ++:==================================================================+:==============================================================================+:===================================================================================================================================================================================+:===========================================================+ +| v4.0.11 及之前的 v4.0 版本,v5.0.0-rc | 作为 changefeed 配置项,给 `file` sorter 和 `unified` Sorter 指定临时文件目录 | 在这些版本中,`file` sorter 和 `unified` sorter **均不是**正式功能 (GA),不推荐在生产环境中使用。 | 不推荐在生产环境中使用 Unified Sorter | +| | | 如果有多个 changefeed 被配置使用了 `unified` 作为 `sort-engine`,那么实际使用的临时文件目录可能是任何一个 changefeed 的 `sort-dir` 配置,且每个 TiCDC 节点上使用的目录可能不一致。 | | ++-------------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+ +| v4.0.12,v4.0.13,v5.0.0 及 v5.0.1 | 作为 changefeed 配置项或 `cdc server` 配置项 | 在默认情况下 changefeed 的 `sort-dir` 配置不会生效,而 `cdc server` 的 `sort-dir` 配置默认为 `/tmp/cdc_sort`。建议生产环境下仅配置 `cdc server` 的相关配置。 | 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `sort-dir` | +| | | 如果你使用 TiUP 部署 TiCDC,建议升级到最新的 TiUP 版本并在 TiCDC server 配置中设置 `sorter.sort-dir` 一项。 | | +| | | 在 v4.0.13、v5.0.0 和 v5.0.1 中 unified sorter 是默认开启的,如果要将集群升级至这些版本,请确保 TiCDC server 配置中的 `sorter.sort-dir` 已经被正确配置。 | | ++-------------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+ +| v4.0.14 及之后的 v4.0 版本,v5.0.3 及之后的 v5.0 版本,更新的版本 | `sort-dir` 被弃用,建议配置 `data-dir` | `data-dir` 可以通过最新版本的 TiUP 进行配置。这些版本中 unified sorter 是默认开启的,升级时请确保 `data-dir` 已经被正确配置,否则将默认使用 `/tmp/cdc_data`。 | 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `data-dir` | +| | | 如果该目录所在设备空间不足,有可能出现硬盘空间不足的问题。之前配置的 changefeed 的 `sort-dir` 配置将会失效。 | | ++-------------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+ +| v6.0.0 及之后版本 | `data-dir` 被用来存放 TiCDC 生成的临时文件 | 在该版本之后,TiCDC 默认采用 `db sorter` 作为内部的排序引擎,它使用 `data-dir` 作为磁盘目录。 | 需要通过 `cdc server` 命令行参数(或 TiUP)配置 `data-dir` | ++-------------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+ ### 全局临时表兼容性说明 diff --git a/tidb-binlog-deployment-topology.md b/tidb-binlog-deployment-topology.md index f04d6f3d1142..f0dd5c7b6c7d 100644 --- a/tidb-binlog-deployment-topology.md +++ b/tidb-binlog-deployment-topology.md @@ -9,13 +9,29 @@ summary: 介绍如何在部署最小拓扑集群的基础上,同时部署 TiDB ## 拓扑信息 -| 实例 |个数| 物理机配置 | IP | 配置 | -| :-- | :-- | :-- | :-- | :-- | -|TiDB | 3 | 16 VCore 32 GB | 10.0.1.1
    10.0.1.2
    10.0.1.3 | 默认端口配置;
    开启 enable_binlog;
    开启 ignore-error | -| PD | 3 | 4 VCore 8 GB | 10.0.1.4
    10.0.1.5
    10.0.1.6 | 默认端口配置 | -| TiKV | 3 | 16 VCore 32 GB | 10.0.1.7
    10.0.1.8
    10.0.1.9 | 默认端口配置 | -| Pump| 3 |8 VCore 16GB |10.0.1.1
    10.0.1.7
    10.0.1.8 | 默认端口配置;
    设置 GC 时间 7 天 | -| Drainer | 1 | 8 VCore 16GB | 10.0.1.12 | 默认端口配置;
    设置默认初始化 commitTS -1 为最近的时间戳
    配置下游目标 TiDB 10.0.1.12:4000 | ++-------------+-------------+----------------+-------------+-------------------------------------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:============+:============+:===============+:============+:==========================================+ +| TiDB | 3 | 16 VCore 32 GB | 10.0.1.1 | 默认端口配置; | +| | | | 10.0.1.2 | 开启 enable_binlog; | +| | | | 10.0.1.3 | 开启 ignore-error | ++-------------+-------------+----------------+-------------+-------------------------------------------+ +| PD | 3 | 4 VCore 8 GB | 10.0.1.4 | 默认端口配置 | +| | | | 10.0.1.5 | | +| | | | 10.0.1.6 | | ++-------------+-------------+----------------+-------------+-------------------------------------------+ +| TiKV | 3 | 16 VCore 32 GB | 10.0.1.7 | 默认端口配置 | +| | | | 10.0.1.8 | | +| | | | 10.0.1.9 | | ++-------------+-------------+----------------+-------------+-------------------------------------------+ +| Pump | 3 | 8 VCore 16GB | 10.0.1.1 | 默认端口配置; | +| | | | 10.0.1.7 | 设置 GC 时间 7 天 | +| | | | 10.0.1.8 | | ++-------------+-------------+----------------+-------------+-------------------------------------------+ +| Drainer | 1 | 8 VCore 16GB | 10.0.1.12 | 默认端口配置; | +| | | | | 设置默认初始化 commitTS -1 为最近的时间戳 | +| | | | | 配置下游目标 TiDB 10.0.1.12:4000 | ++-------------+-------------+----------------+-------------+-------------------------------------------+ ### 拓扑模版 diff --git a/tidb-lightning/tidb-lightning-data-source.md b/tidb-lightning/tidb-lightning-data-source.md index bc32ba3f37da..7cf74d1ba078 100644 --- a/tidb-lightning/tidb-lightning-data-source.md +++ b/tidb-lightning/tidb-lightning-data-source.md @@ -15,13 +15,19 @@ data-source-dir = "/data/my_database" TiDB Lightning 运行时将查找 `data-source-dir` 中所有符合命令规则的文件。 -| 文件类型 | 分类 | 命名规则 | -|:--|:--|:---| -|Schema 文件|包含 DDL 语句 `CREATE TABLE` 的文件|`${db_name}.${table_name}-schema.sql`| -|Schema 文件|包含 `CREATE DATABASE` DDL 语句的文件|`${db_name}-schema-create.sql`| -|数据文件|包含整张表的数据文件,该文件会被导入 `${db_name}.${table_name}` 表 | \${db_name}.\${table_name}.\${csv\|sql\|parquet}| -|数据文件| 如果一个表分布于多个数据文件,这些文件命名需加上文件编号的后缀 | \${db_name}.\${table_name}.001.\${csv\|sql\|parquet} | -|压缩文件| 上述所有类型文件如带压缩文件名后缀,如 `gzip`、`snappy` 或 `zstd`,TiDB Lightning 会流式解压后进行导入 | \${db_name}.\${table_name}.\${csv\|sql\|parquet}.{compress} | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ +| 文件类型 | 分类 | 命名规则 | ++:============+:=======================================================================================================+:=========================================================+ +| Schema 文件 | 包含 DDL 语句 `CREATE TABLE` 的文件 | `${db_name}.${table_name}-schema.sql` | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ +| Schema 文件 | 包含 `CREATE DATABASE` DDL 语句的文件 | `${db_name}-schema-create.sql` | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ +| 数据文件 | 包含整张表的数据文件,该文件会被导入 `${db_name}.${table_name}` 表 | `${db_name}.${table_name}.${csv|sql|parquet}` | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ +| 数据文件 | 如果一个表分布于多个数据文件,这些文件命名需加上文件编号的后缀 | `${db_name}.${table_name}.001.${csv|sql|parquet}` | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ +| 压缩文件 | 上述所有类型文件如带压缩文件名后缀,如 `gzip`、`snappy` 或 `zstd`,TiDB Lightning 会流式解压后进行导入 | `${db_name}.${table_name}.${csv|sql|parquet}.{compress}` | ++-------------+--------------------------------------------------------------------------------------------------------+----------------------------------------------------------+ TiDB Lightning 尽量并行处理数据,由于文件必须顺序读取,所以数据处理协程是文件级别的并发(通过 `region-concurrency` 配置控制)。因此导入大文件时性能比较差。通常建议单个文件尺寸为 256MiB,以获得最好的性能。 diff --git a/tidb-lightning/tidb-lightning-requirements.md b/tidb-lightning/tidb-lightning-requirements.md index 11d46943d272..d30f27fe1ed1 100644 --- a/tidb-lightning/tidb-lightning-requirements.md +++ b/tidb-lightning/tidb-lightning-requirements.md @@ -11,71 +11,27 @@ summary: 了解 TiDB Lightning 运行时对目标数据库的必需条件。 TiDB Lightning 导入数据时,根据导入方式和启用特性等,需要下游数据库用户具备不同的权限,可参考下表: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    特性作用域所需权限备注
    必需基本功能目标 tableCREATE,SELECT,INSERT,UPDATE,DELETE,DROP,ALTERDROP 仅 tidb-lightning-ctl 在执行 checkpoint-destroy-all 时需要
    目标 databaseCREATE
    必需Logical Import Modeinformation_schema.columnsSELECT
    Physical Import Modemysql.tidbSELECT
    -SUPER
    -RESTRICTED_VARIABLES_ADMIN,RESTRICTED_TABLES_ADMIN当目标 TiDB 开启 SEM
    推荐冲突检测,max-errorlightning.task-info-schema-name 配置的 schemaSELECT,INSERT,UPDATE,DELETE,CREATE,DROP如不需要,该值必须设为""
    可选并行导入lightning.meta-schema-name 配置的 schemaSELECT,INSERT,UPDATE,DELETE,CREATE,DROP如不需要,该值必须设为""
    可选checkpoint.driver = "mysql"checkpoint.schema 设置SELECT,INSERT,UPDATE,DELETE,CREATE,DROP使用数据库而非文件形式存放 checkpoint 信息时需要
    ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| | 特性 | 作用域 | 所需权限 | 备注 | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| 必需 | 基本功能 | 目标 table | CREATE,SELECT,INSERT,UPDATE,DELETE,DROP,ALTER | DROP 仅 tidb-lightning-ctl 在执行 checkpoint-destroy-all 时需要 | +| +-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| | | 目标 database | CREATE | | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| 必需 | Logical Import Mode | information_schema.columns | SELECT | | +| +-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| | Physical Import Mode | mysql.tidb | SELECT | | +| +-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| | | \- | SUPER | | +| +-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| | | \- | RESTRICTED_VARIABLES_ADMIN,RESTRICTED_TABLES_ADMIN | 当目标 TiDB 开启 SEM | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| 推荐 | 冲突检测,max-error | lightning.task-info-schema-name 配置的 schema | SELECT,INSERT,UPDATE,DELETE,CREATE,DROP | 如不需要,该值必须设为"" | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| 可选 | 并行导入 | lightning.meta-schema-name 配置的 schema | SELECT,INSERT,UPDATE,DELETE,CREATE,DROP | 如不需要,该值必须设为"" | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ +| 可选 | checkpoint.driver = "mysql" | checkpoint.schema 设置 | SELECT,INSERT,UPDATE,DELETE,CREATE,DROP | 使用数据库而非文件形式存放 checkpoint 信息时需要 | ++------+-----------------------------+-----------------------------------------------+----------------------------------------------------+-----------------------------------------------------------------+ ## 目标数据库所需空间 diff --git a/tidb-limitations.md b/tidb-limitations.md index df14fdb0f778..77dc763f1f7d 100644 --- a/tidb-limitations.md +++ b/tidb-limitations.md @@ -1,73 +1,73 @@ ---- -title: TiDB 使用限制 ---- - -# 使用限制 - -本文会将详细描述 TiDB 中常见的使用限制,包括:标识符长度,最大支持的数据库、表、索引、分区表、序列等的个数。 - -## 标识符长度限制 - -| 标识符类型 | 最大长度(字符)| -|:---------|:--------------| -| Database | 64 | -| Table | 64 | -| Column | 64 | -| Index | 64 | -| View | 64 | -| Sequence | 64 | - -## Databases、Tables、Views、Connections 总个数限制 - -| 标识符类型 | 最大个数 | -|:----------|:----------| -| Databases | unlimited | -| Tables | unlimited | -| Views | unlimited | -| Connections| unlimited| - -## 单个 Database 的限制 - -| 类型 | 最大限制 | -|:----------|:----------| -| Tables |unlimited | - -## 单个 Table 的限制 - -| 类型 | 最大限制(默认值) | -|:----------|:------------------------------| -| Columns | 默认为 1017,最大可调至 4096 | -| Indexes | 默认为 64,最大可调至 512 | -| Rows | 无限制 | -| Size | 无限制 | -| Partitions| 8192 | - -* Columns 的最大限制可通过 [`table-column-count-limit`](/tidb-configuration-file.md#table-column-count-limit-从-v50-版本开始引入) 修改。 -* Indexes 的最大限制可通过 [`index-limit`](/tidb-configuration-file.md#index-limit-从-v50-版本开始引入) 修改。 - -## 单行的限制 - -| 类型 | 最大限制(默认值) | -|:----------|:----------| -| Size | 默认为 6 MiB,可通过 [`txn-entry-size-limit`](/tidb-configuration-file.md#txn-entry-size-limit-从-v50-版本开始引入) 配置项调至 120 MiB | - -## 数据类型限制 - -| 类型 | 最大限制 | -|:----------|:----------| -| CHAR | 256 字符 | -| BINARY | 256 字节 | -| VARBINARY | 65535 字节 | -| VARCHAR | 16383 字符 | -| TEXT | 默认为 6291456 字节(即 6 MiB),可调至 125829120 字节(即 120 MiB) | -| BLOB | 默认为 6291456 字节(即 6 MiB),可调至 125829120 字节(即 120 MiB) | - -## SQL Statements 的限制 - -| 类型 | 最大限制 | -|:----------|:----------| -| 单个事务最大语句数 | 在使用乐观事务并开启事务重试的情况下,默认限制 5000,可通过 [`stmt-count-limit`](/tidb-configuration-file.md#stmt-count-limit) 调整 | - -## TiKV 版本的限制 - -在集群中,如果 TiDB 组件的版本为 v6.2.0 及以上,则 TiKV 组件版本不得低于 v6.2.0。 +--- +title: TiDB 使用限制 +--- + +# 使用限制 + +本文会将详细描述 TiDB 中常见的使用限制,包括:标识符长度,最大支持的数据库、表、索引、分区表、序列等的个数。 + +## 标识符长度限制 + +| 标识符类型 | 最大长度(字符)| +|:---------|:--------------| +| Database | 64 | +| Table | 64 | +| Column | 64 | +| Index | 64 | +| View | 64 | +| Sequence | 64 | + +## Databases、Tables、Views、Connections 总个数限制 + +| 标识符类型 | 最大个数 | +|:----------|:----------| +| Databases | unlimited | +| Tables | unlimited | +| Views | unlimited | +| Connections| unlimited| + +## 单个 Database 的限制 + +| 类型 | 最大限制 | +|:----------|:----------| +| Tables |unlimited | + +## 单个 Table 的限制 + +| 类型 | 最大限制(默认值) | +|:----------|:------------------------------| +| Columns | 默认为 1017,最大可调至 4096 | +| Indexes | 默认为 64,最大可调至 512 | +| Rows | 无限制 | +| Size | 无限制 | +| Partitions| 8192 | + +* Columns 的最大限制可通过 [`table-column-count-limit`](/tidb-configuration-file.md#table-column-count-limit-从-v50-版本开始引入) 修改。 +* Indexes 的最大限制可通过 [`index-limit`](/tidb-configuration-file.md#index-limit-从-v50-版本开始引入) 修改。 + +## 单行的限制 + +| 类型 | 最大限制(默认值) | +|:----------|:----------| +| Size | 默认为 6 MiB,可通过 [`txn-entry-size-limit`](/tidb-configuration-file.md#txn-entry-size-limit-从-v50-版本开始引入) 配置项调至 120 MiB | + +## 数据类型限制 + +| 类型 | 最大限制 | +|:----------|:----------| +| CHAR | 256 字符 | +| BINARY | 256 字节 | +| VARBINARY | 65535 字节 | +| VARCHAR | 16383 字符 | +| TEXT | 默认为 6291456 字节(即 6 MiB),可调至 125829120 字节(即 120 MiB) | +| BLOB | 默认为 6291456 字节(即 6 MiB),可调至 125829120 字节(即 120 MiB) | + +## SQL Statements 的限制 + +| 类型 | 最大限制 | +|:----------|:----------| +| 单个事务最大语句数 | 在使用乐观事务并开启事务重试的情况下,默认限制 5000,可通过 [`stmt-count-limit`](/tidb-configuration-file.md#stmt-count-limit) 调整 | + +## TiKV 版本的限制 + +在集群中,如果 TiDB 组件的版本为 v6.2.0 及以上,则 TiKV 组件版本不得低于 v6.2.0。 diff --git a/tiflash-deployment-topology.md b/tiflash-deployment-topology.md index 7513410b5b0c..6c00191fe5be 100644 --- a/tiflash-deployment-topology.md +++ b/tiflash-deployment-topology.md @@ -9,13 +9,27 @@ summary: 了解在部署最小拓扑集群的基础上,部署 TiFlash 的拓 ## 拓扑信息 -|实例 | 个数 | 物理机配置 | IP |配置 | -| :-- | :-- | :-- | :-- | :-- | -| TiDB |3 | 16 VCore 32GB * 1 | 10.0.1.7
    10.0.1.8
    10.0.1.9 | 默认端口
    全局目录配置 | -| PD | 3 | 4 VCore 8GB * 1 |10.0.1.4
    10.0.1.5
    10.0.1.6 | 默认端口
    全局目录配置 | -| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) * 1 | 10.0.1.1
    10.0.1.2
    10.0.1.3 | 默认端口
    全局目录配置 | -| TiFlash | 1 | 32 VCore 64 GB 2TB (nvme ssd) * 1 | 10.0.1.11 | 默认端口
    全局目录配置 | -| Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.10 | 默认端口
    全局目录配置 | ++----------------------+-------------+------------------------------------+-------------+--------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:=====================+:============+:===================================+:============+:=============+ +| TiDB | 3 | 16 VCore 32GB \* 1 | 10.0.1.7 | 默认端口 | +| | | | 10.0.1.8 | 全局目录配置 | +| | | | 10.0.1.9 | | ++----------------------+-------------+------------------------------------+-------------+--------------+ +| PD | 3 | 4 VCore 8GB \* 1 | 10.0.1.4 | 默认端口 | +| | | | 10.0.1.5 | 全局目录配置 | +| | | | 10.0.1.6 | | ++----------------------+-------------+------------------------------------+-------------+--------------+ +| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) \* 1 | 10.0.1.1 | 默认端口 | +| | | | 10.0.1.2 | 全局目录配置 | +| | | | 10.0.1.3 | | ++----------------------+-------------+------------------------------------+-------------+--------------+ +| TiFlash | 1 | 32 VCore 64 GB 2TB (nvme ssd) \* 1 | 10.0.1.11 | 默认端口 | +| | | | | 全局目录配置 | ++----------------------+-------------+------------------------------------+-------------+--------------+ +| Monitoring & Grafana | 1 | 4 VCore 8GB \* 1 500GB (ssd) | 10.0.1.10 | 默认端口 | +| | | | | 全局目录配置 | ++----------------------+-------------+------------------------------------+-------------+--------------+ ### 拓扑模版 diff --git a/tiflash/tiflash-supported-pushdown-calculations.md b/tiflash/tiflash-supported-pushdown-calculations.md index 785da5942c11..3891ab2103e9 100644 --- a/tiflash/tiflash-supported-pushdown-calculations.md +++ b/tiflash/tiflash-supported-pushdown-calculations.md @@ -28,18 +28,29 @@ TiFlash 支持部分算子的下推,支持的算子如下: ## 支持下推的表达式 -| 表达式类型 | 运算 | -| :-------------- | :------------------------------------- | -| [数学函数](/functions-and-operators/numeric-functions-and-operators.md) | `+`, `-`, `/`, `*`, `%`, `>=`, `<=`, `=`, `!=`, `<`, `>`, `ROUND()`, `ABS()`, `FLOOR(int)`, `CEIL(int)`, `CEILING(int)`, `SQRT()`, `LOG()`, `LOG2()`, `LOG10()`, `LN()`, `EXP()`, `POW()`, `SIGN()`, `RADIANS()`, `DEGREES()`, `CONV()`, `CRC32()`, `GREATEST(int/real)`, `LEAST(int/real)` | -| [逻辑函数](/functions-and-operators/control-flow-functions.md)和[算子](/functions-and-operators/operators.md) | `AND`, `OR`, `NOT`, `CASE WHEN`, `IF()`, `IFNULL()`, `ISNULL()`, `IN`, `LIKE`, `COALESCE`, `IS` | -| [位运算](/functions-and-operators/bit-functions-and-operators.md) | `&` (bitand), \| (bitor), `~` (bitneg), `^` (bitxor) | -| [字符串函数](/functions-and-operators/string-functions.md) | `SUBSTR()`, `CHAR_LENGTH()`, `REPLACE()`, `CONCAT()`, `CONCAT_WS()`, `LEFT()`, `RIGHT()`, `ASCII()`, `LENGTH()`, `TRIM()`, `LTRIM()`, `RTRIM()`, `POSITION()`, `FORMAT()`, `LOWER()`, `UCASE()`, `UPPER()`, `SUBSTRING_INDEX()`, `LPAD()`, `RPAD()`, `STRCMP()` | -| [正则函数和算子](/functions-and-operators/string-functions.md) | `REGEXP`, `REGEXP_LIKE()`, `REGEXP_INSTR()`, `REGEXP_SUBSTR()` | -| [日期函数](/functions-and-operators/date-and-time-functions.md) | `DATE_FORMAT()`, `TIMESTAMPDIFF()`, `FROM_UNIXTIME()`, `UNIX_TIMESTAMP(int)`, `UNIX_TIMESTAMP(decimal)`, `STR_TO_DATE(date)`, `STR_TO_DATE(datetime)`, `DATEDIFF()`, `YEAR()`, `MONTH()`, `DAY()`, `EXTRACT(datetime)`, `DATE()`, `HOUR()`, `MICROSECOND()`, `MINUTE()`, `SECOND()`, `SYSDATE()`, `DATE_ADD/ADDDATE(datetime, int)`, `DATE_ADD/ADDDATE(string, int/real)`, `DATE_SUB/SUBDATE(datetime, int)`, `DATE_SUB/SUBDATE(string, int/real)`, `QUARTER()`, `DAYNAME()`, `DAYOFMONTH()`, `DAYOFWEEK()`, `DAYOFYEAR()`, `LAST_DAY()`, `MONTHNAME()`, `TO_SECONDS()`, `TO_DAYS()`, `FROM_DAYS()`, `WEEKOFYEAR()` -| [JSON 函数](/functions-and-operators/json-functions.md) | `JSON_LENGTH()`, `->`, `->>`, `JSON_EXTRACT()` | -| [转换函数](/functions-and-operators/cast-functions-and-operators.md) | `CAST(int AS DOUBLE), CAST(int AS DECIMAL)`, `CAST(int AS STRING)`, `CAST(int AS TIME)`, `CAST(double AS INT)`, `CAST(double AS DECIMAL)`, `CAST(double AS STRING)`, `CAST(double AS TIME)`, `CAST(string AS INT)`, `CAST(string AS DOUBLE), CAST(string AS DECIMAL)`, `CAST(string AS TIME)`, `CAST(decimal AS INT)`, `CAST(decimal AS STRING)`, `CAST(decimal AS TIME)`, `CAST(time AS INT)`, `CAST(time AS DECIMAL)`, `CAST(time AS STRING)`, `CAST(time AS REAL)` | -| [聚合函数](/functions-and-operators/aggregate-group-by-functions.md) | `MIN()`, `MAX()`, `SUM()`, `COUNT()`, `AVG()`, `APPROX_COUNT_DISTINCT()`, `GROUP_CONCAT()` | -| [其他函数](/functions-and-operators/miscellaneous-functions.md) | `INET_NTOA()`, `INET_ATON()`, `INET6_NTOA()`, `INET6_ATON()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 表达式类型 | 运算 | ++:==============================================================================================================+:====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ +| [数学函数](/functions-and-operators/numeric-functions-and-operators.md) | `+`, `-`, `/`, `*`, `%`, `>=`, `<=`, `=`, `!=`, `<`, `>`, `ROUND()`, `ABS()`, `FLOOR(int)`, `CEIL(int)`, `CEILING(int)`, `SQRT()`, `LOG()`, `LOG2()`, `LOG10()`, `LN()`, `EXP()`, `POW()`, `SIGN()`, `RADIANS()`, `DEGREES()`, `CONV()`, `CRC32()`, `GREATEST(int/real)`, `LEAST(int/real)` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [逻辑函数](/functions-and-operators/control-flow-functions.md)和[算子](/functions-and-operators/operators.md) | `AND`, `OR`, `NOT`, `CASE WHEN`, `IF()`, `IFNULL()`, `ISNULL()`, `IN`, `LIKE`, `COALESCE`, `IS` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [位运算](/functions-and-operators/bit-functions-and-operators.md) | `&` (bitand), `|` (bitor), `~` (bitneg), `^` (bitxor) | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [字符串函数](/functions-and-operators/string-functions.md) | `SUBSTR()`, `CHAR_LENGTH()`, `REPLACE()`, `CONCAT()`, `CONCAT_WS()`, `LEFT()`, `RIGHT()`, `ASCII()`, `LENGTH()`, `TRIM()`, `LTRIM()`, `RTRIM()`, `POSITION()`, `FORMAT()`, `LOWER()`, `UCASE()`, `UPPER()`, `SUBSTRING_INDEX()`, `LPAD()`, `RPAD()`, `STRCMP()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [正则函数和算子](/functions-and-operators/string-functions.md) | `REGEXP`, `REGEXP_LIKE()`, `REGEXP_INSTR()`, `REGEXP_SUBSTR()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [日期函数](/functions-and-operators/date-and-time-functions.md) | `DATE_FORMAT()`, `TIMESTAMPDIFF()`, `FROM_UNIXTIME()`, `UNIX_TIMESTAMP(int)`, `UNIX_TIMESTAMP(decimal)`, `STR_TO_DATE(date)`, `STR_TO_DATE(datetime)`, `DATEDIFF()`, `YEAR()`, `MONTH()`, `DAY()`, `EXTRACT(datetime)`, `DATE()`, `HOUR()`, `MICROSECOND()`, `MINUTE()`, `SECOND()`, `SYSDATE()`, `DATE_ADD/ADDDATE(datetime, int)`, `DATE_ADD/ADDDATE(string, int/real)`, `DATE_SUB/SUBDATE(datetime, int)`, `DATE_SUB/SUBDATE(string, int/real)`, `QUARTER()`, `DAYNAME()`, `DAYOFMONTH()`, `DAYOFWEEK()`, `DAYOFYEAR()`, `LAST_DAY()`, `MONTHNAME()`, `TO_SECONDS()`, `TO_DAYS()`, `FROM_DAYS()`, `WEEKOFYEAR()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [JSON 函数](/functions-and-operators/json-functions.md) | `JSON_LENGTH()`, `->`, `->>`, `JSON_EXTRACT()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [转换函数](/functions-and-operators/cast-functions-and-operators.md) | `CAST(int AS DOUBLE), CAST(int AS DECIMAL)`, `CAST(int AS STRING)`, `CAST(int AS TIME)`, `CAST(double AS INT)`, `CAST(double AS DECIMAL)`, `CAST(double AS STRING)`, `CAST(double AS TIME)`, `CAST(string AS INT)`, `CAST(string AS DOUBLE), CAST(string AS DECIMAL)`, `CAST(string AS TIME)`, `CAST(decimal AS INT)`, `CAST(decimal AS STRING)`, `CAST(decimal AS TIME)`, `CAST(time AS INT)`, `CAST(time AS DECIMAL)`, `CAST(time AS STRING)`, `CAST(time AS REAL)` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [聚合函数](/functions-and-operators/aggregate-group-by-functions.md) | `MIN()`, `MAX()`, `SUM()`, `COUNT()`, `AVG()`, `APPROX_COUNT_DISTINCT()`, `GROUP_CONCAT()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| [其他函数](/functions-and-operators/miscellaneous-functions.md) | `INET_NTOA()`, `INET_ATON()`, `INET6_NTOA()`, `INET6_ATON()` | ++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ## 下推限制 diff --git a/tispark-deployment-topology.md b/tispark-deployment-topology.md index 106546fabe50..e317461c9026 100644 --- a/tispark-deployment-topology.md +++ b/tispark-deployment-topology.md @@ -15,13 +15,28 @@ summary: 介绍 TiUP 部署包含 TiSpark 组件的 TiDB 集群的拓扑结构 ## 拓扑信息 -|实例 | 个数 | 物理机配置 | IP |配置 | -| :-- | :-- | :-- | :-- | :-- | -| TiDB |3 | 16 VCore 32GB * 1 | 10.0.1.1
    10.0.1.2
    10.0.1.3 | 默认端口
    全局目录配置 | -| PD | 3 | 4 VCore 8GB * 1 |10.0.1.4
    10.0.1.5
    10.0.1.6 | 默认端口
    全局目录配置 | -| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) * 1 | 10.0.1.7
    10.0.1.8
    10.0.1.9 | 默认端口
    全局目录配置 | -| TiSpark | 3 | 8 VCore 16GB * 1 | 10.0.1.21 (master)
    10.0.1.22 (worker)
    10.0.1.23 (worker) | 默认端口
    全局目录配置 | -| Monitoring & Grafana | 1 | 4 VCore 8GB * 1 500GB (ssd) | 10.0.1.11 | 默认端口
    全局目录配置 | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ +| 实例 | 个数 | 物理机配置 | IP | 配置 | ++:=====================+:============+:==================================+:===================+:=============+ +| TiDB | 3 | 16 VCore 32GB \* 1 | 10.0.1.1 | 默认端口 | +| | | | 10.0.1.2 | 全局目录配置 | +| | | | 10.0.1.3 | | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ +| PD | 3 | 4 VCore 8GB \* 1 | 10.0.1.4 | 默认端口 | +| | | | 10.0.1.5 | 全局目录配置 | +| | | | 10.0.1.6 | | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ +| TiKV | 3 | 16 VCore 32GB 2TB (nvme ssd) \* 1 | 10.0.1.7 | 默认端口 | +| | | | 10.0.1.8 | 全局目录配置 | +| | | | 10.0.1.9 | | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ +| TiSpark | 3 | 8 VCore 16GB \* 1 | 10.0.1.21 (master) | 默认端口 | +| | | | 10.0.1.22 (worker) | 全局目录配置 | +| | | | 10.0.1.23 (worker) | | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ +| Monitoring & Grafana | 1 | 4 VCore 8GB \* 1 500GB (ssd) | 10.0.1.11 | 默认端口 | +| | | | | 全局目录配置 | ++----------------------+-------------+-----------------------------------+--------------------+--------------+ ### 拓扑模版 diff --git a/troubleshoot-cpu-issues.md b/troubleshoot-cpu-issues.md index e1b5cfa86373..78ef2460868e 100644 --- a/troubleshoot-cpu-issues.md +++ b/troubleshoot-cpu-issues.md @@ -1,139 +1,139 @@ ---- -title: 读写延迟增加 -summary: 介绍读写延时增加、抖动时的排查思路,可能的原因和解决方法。 ---- - -# 读写延迟增加 - -本文档介绍读写延迟增加、抖动时的排查思路,可能的原因和解决方法。 - -## 常见原因 - -### TiDB 执行计划不对导致延迟增高 - -查询语句的执行计划不稳定,偶尔执行计划选择错误的索引,导致查询延迟增加。 - -**现象:** - -* 如果慢日志中输出了执行计划,可以直接查看执行计划。用 `select tidb_decode_plan('xxx...')` 语句可以解析出具体的执行计划。 -* 监控中的 key 扫描异常升高;慢日志中 SQL 执行时间 `Scan Keys` 数目较大。 -* SQL 执行时间相比于其他数据库(例如 MySQL)有较大差距。可以对比其他数据库执行计划,例如 `Join Order` 是否不同。 - -**可能的原因:** - -* 统计信息不准确 - -**解决方案:** - -* 更新统计信息 - * 手动 `analyze table`,配合 crontab 定期 `analyze`,维持统计信息准确度。 - * 自动 `auto analyze`,调低 `analyze ratio` 阈值,提高收集频次,并设置运行时间窗口。示例如下: - * `set global tidb_auto_analyze_ratio=0.2;` - * `set global tidb_auto_analyze_start_time='00:00 +0800';` - * `set global tidb_auto_analyze_end_time='06:00 +0800';` -* 绑定执行计划 - * 修改业务 SQL,使用 `use index` 固定使用列上的索引。 - * 3.0 版本下,业务可以不用修改 SQL,使用 `create global binding` 创建 `force index` 的绑定 SQL。 - * 4.0 版本支持 SQL Plan Management,可以避免因执行计划不稳定导致的性能下降。 - -### PD 异常 - -**现象:** - -监控中 PD TSO 的 **wait duration** 异常升高。**wait duration** 代表从开始等待 PD 返回,到等待结束的时间。 - -**可能的原因:** - -* 磁盘问题。PD 所在的节点 I/O 被占满,排查是否有其他 I/O 高的组件与 PD 混合部署以及磁盘的健康情况,可通过监控 Grafana -> **disk performance** -> **latency** 和 **load** 等指标进行验证,必要时可以使用 fio 工具对盘进行检测,见案例 [case-292](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case292.md)。 - -* PD 之间的网络问题。PD 日志中有 `"lost the TCP streaming connection"`,排查 PD 之间网络是否有问题,可通过监控 Grafana -> **PD** -> **etcd** 的 **round trip** 来验证,见案例 [case-177](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case177.md)。 - -* 系统负载高,日志中能看到 `"server is likely overloaded"`,见案例 [case-214](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case214.md)。 - -* 选举不出 leader。PD 日志中有 `"lease is not expired"`,见 issues [https://github.com/etcd-io/etcd/issues/10355](https://github.com/etcd-io/etcd/issues/10355)。v3.0.x 版本和 v2.1.19 版本已解决该问题,见案例 [case-875](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case875.md)。 - -* 选举慢。Region 加载时间长,从 PD 日志中 `grep "regions cost"`(例如日志中可能是 `load 460927 regions cost 11.77099s`),如果出现秒级,则说明较慢,v3.0 版本可开启 Region Storage(设置 `use-region-storage` 为 `true`),该特性能极大缩短加载 Region 的时间,见案例 [case-429](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case429.md)。 - -* TiDB 与 PD 之间的网络问题,应排查网络相关情况。通过监控 Grafana -> **blackbox_exporter** -> **ping latency** 确定 TiDB 到 PD leader 的网络是否正常。 - -* PD 报 `FATAL` 错误,日志中有 `"range failed to find revision pair"`。v3.0.8 中已经解决问题,见 PR [https://github.com/pingcap/pd/pull/2040](https://github.com/pingcap/pd/pull/2040)。详情请参考案例 [case-947](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case947.md)。 - -* 使用 `/api/v1/regions` 接口时 Region 数量过多可能会导致 PD OOM。已于 v3.0.8 版本修复,见 [https://github.com/pingcap/pd/pull/1986](https://github.com/pingcap/pd/pull/1986)。 - -* 滚动升级的时候 PD OOM,gRPC 消息大小没限制,监控可看到 TCP InSegs 较大,已于 v3.0.6 版本修复,见 [https://github.com/pingcap/pd/pull/1952](https://github.com/pingcap/pd/pull/1952)。 - -* PD panic,请[提交 bug](https://github.com/tikv/pd/issues/new?labels=kind/bug&template=bug-report.md)。 - -* 其他原因,通过 `curl http://127.0.0.1:2379/debug/pprof/goroutine?debug=2` 抓取 goroutine,并[提交 bug](https://github.com/pingcap/pd/issues/new?labels=kind%2Fbug&template=bug-report.md)。 - -### TiKV 异常 - -**现象:** - -监控中 **KV Cmd Duration** 异常升高。KV Cmd Duration 是 TiDB 发送请求给 TiKV 到收到回复的延迟。 - -**可能的原因:** - -* 查看 gRPC duration。gRPC duration 是请求在 TiKV 端的总耗时。通过对比 TiKV 的 gRPC duration 以及 TiDB 中的 KV duration 可以发现潜在的网络问题。比如 gRPC duration 很短但是 TiDB 的 KV duration 显示很长,说明 TiDB 和 TiKV 之间网络延迟可能很高,或者 TiDB 和 TiKV 之间的网卡带宽被占满。 - -* TiKV 重启了导致重新选举 - * TiKV panic 之后又被 `systemd` 重新拉起正常运行,可以通过查看 TiKV 的日志来确认是否有 `panic`,这种情况属于非预期,需要报 bug。 - * 被第三者 `stop`/`kill`,被 `systemd` 重新拉起。查看 `dmesg` 和 `TiKV log` 确认原因。 - * TiKV 发生 OOM 导致重启了。 - * 动态调整 `THP` 导致 hung 住,见案例 [case-500](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case500.md)。 - -* 查看监控:Grafana -> **TiKV-details** -> **errors** 面板 `server is busy` 看到 TiKV RocksDB 出现 write stall 导致发生重新选举。 - -* TiKV 发生网络隔离导致重新选举。 - -* `block-cache` 配置太大导致 OOM,在监控 Grafana -> **TiKV-details** 选中对应的 instance 之后查看 RocksDB 的 `block cache size` 监控来确认是否是该问题。同时请检查 `[storage.block-cache] capacity = # "1GB"` 参数是否设置合理,默认情况下 TiKV 的 `block-cache` 设置为机器总内存的 `45%`。在容器化部署时需要显式指定该参数,因为 TiKV 获取的是物理机的内存,可能会超出单个 container 的内存限制。 - -* Coprocessor 收到大量大查询,返回的数据量太大,gRPC 发送速度跟不上 Coprocessor 向客户端输出数据的速度导致 OOM。可以通过检查监控:Grafana -> **TiKV-details** -> **coprocessor overview** 的 `response size` 是否超过 `network outbound` 流量来确认是否属于这种情况。 - -### TiKV 单线程瓶颈 - -TiKV 中存在一些单线程线程,可能会成为瓶颈。 - -* 单个 TiKV Region 过多导致单个 gRPC 线程成为瓶颈(查看 Grafana -> TiKV-details -> `Thread CPU/gRPC CPU Per Thread` 监控),v3.x 以上版本可以开启 Hibernate Region 特性来解决,见案例 [case-612](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case612.md)。 -* v3.0 之前版本 Raftstore 单线程或者 Apply 单线程到达瓶颈(Grafana -> TiKV-details -> `Thread CPU/raft store CPU 和 Async apply CPU` 超过 `80%`),可以选择扩容 TiKV(v2.x 版本)实例或者升级到多线程模型的 v3.x 版本。 - -### CPU Load 升高 - -**现象:** - -CPU 资源使用到达瓶颈 - -**可能的原因:** - -* 热点问题。 -* 整体负载高,排查 TiDB 的 slow query 和 expensive query。对运行的 query 进行优化,如果缺索引就加索引,如果可以批量执行就批量执行。另一个方案是对集群进行扩容。 - -## 其它原因 - -### 集群维护 - -通常大多数的线上集群有 3 或 5 个 PD 节点,如果维护的主机上有 PD 组件,需要具体考虑节点是 leader 还是 follower,关闭 follower 对集群运行没有任何影响,关闭 leader 需要先切换,并在切换时有 3 秒左右的性能抖动。 - -### 少数派副本离线 - -TiDB 集群默认配置为 3 副本,每一个 Region 都会在集群中保存 3 份,它们之间通过 Raft 协议来选举 Leader 并同步数据。Raft 协议可以保证在数量小于副本数(注意:不是节点数)一半的节点挂掉或者隔离的情况下,仍然能够提供服务,并且不丢失任何数据。对于 3 副本集群,挂掉一个节点可能会导致性能抖动,可用性和正确性理论上不会受影响。 - -### 新增索引 - -由于创建索引在扫表回填索引的时候会消耗大量资源,甚至与一些频繁更新的字段会发生冲突导致正常业务受到影响。大表创建索引的过程往往会持续很长时间,所以要尽可能地平衡执行时间和集群性能之间的关系,比如选择非高频更新时间段。 - -**参数调整:** - -目前主要使用 `tidb_ddl_reorg_worker_cnt` 和 `tidb_ddl_reorg_batch_size` 这两个参数来动态调整索引创建速度,通常来说它们的值越小对系统影响越小,但是执行时间越长。 - -一般情况下,先将值保持为默认的 `4` 和 `256`,观察集群资源使用情况和响应速度,再逐渐调大 `tidb_ddl_reorg_worker_cnt` 参数来增加并发,观察监控如果系统没有发生明显的抖动,再逐渐调大 `tidb_ddl_reorg_batch_size` 参数,但如果索引涉及的列更新很频繁的话就会造成大量冲突造成失败重试。 - -另外还可以通过调整参数 `tidb_ddl_reorg_priority` 为 `PRIORITY_HIGH` 来让创建索引的任务保持高优先级来提升速度,但在通用 OLTP 系统上,一般建议保持默认。 - -### GC 压力大 - -TiDB 的事务的实现采用了 MVCC(多版本并发控制)机制,当新写入的数据覆盖旧的数据时,旧的数据不会被替换掉,而是与新写入的数据同时保留,并以时间戳来区分版本。GC 的任务便是清理不再需要的旧数据。 - -* Resolve Locks 阶段在 TiKV 一侧会产生大量的 scan_lock 请求,可以在 gRPC 相关的 metrics 中观察到。`scan_lock` 请求会对全部的 Region 调用。 -* Delete Ranges 阶段会往 TiKV 发送少量的 `unsafe_destroy_range` 请求,也可能没有。可以在 gRPC 相关的 metrics 中和 GC 分类下的 GC tasks 中观察到。 -* Do GC 阶段,默认每台 TiKV 会自动扫描本机上的 leader Region 并对每一个 leader 进行 GC,这一活动可以在 GC 分类下的 GC tasks 中观察到。 +--- +title: 读写延迟增加 +summary: 介绍读写延时增加、抖动时的排查思路,可能的原因和解决方法。 +--- + +# 读写延迟增加 + +本文档介绍读写延迟增加、抖动时的排查思路,可能的原因和解决方法。 + +## 常见原因 + +### TiDB 执行计划不对导致延迟增高 + +查询语句的执行计划不稳定,偶尔执行计划选择错误的索引,导致查询延迟增加。 + +**现象:** + +* 如果慢日志中输出了执行计划,可以直接查看执行计划。用 `select tidb_decode_plan('xxx...')` 语句可以解析出具体的执行计划。 +* 监控中的 key 扫描异常升高;慢日志中 SQL 执行时间 `Scan Keys` 数目较大。 +* SQL 执行时间相比于其他数据库(例如 MySQL)有较大差距。可以对比其他数据库执行计划,例如 `Join Order` 是否不同。 + +**可能的原因:** + +* 统计信息不准确 + +**解决方案:** + +* 更新统计信息 + * 手动 `analyze table`,配合 crontab 定期 `analyze`,维持统计信息准确度。 + * 自动 `auto analyze`,调低 `analyze ratio` 阈值,提高收集频次,并设置运行时间窗口。示例如下: + * `set global tidb_auto_analyze_ratio=0.2;` + * `set global tidb_auto_analyze_start_time='00:00 +0800';` + * `set global tidb_auto_analyze_end_time='06:00 +0800';` +* 绑定执行计划 + * 修改业务 SQL,使用 `use index` 固定使用列上的索引。 + * 3.0 版本下,业务可以不用修改 SQL,使用 `create global binding` 创建 `force index` 的绑定 SQL。 + * 4.0 版本支持 SQL Plan Management,可以避免因执行计划不稳定导致的性能下降。 + +### PD 异常 + +**现象:** + +监控中 PD TSO 的 **wait duration** 异常升高。**wait duration** 代表从开始等待 PD 返回,到等待结束的时间。 + +**可能的原因:** + +* 磁盘问题。PD 所在的节点 I/O 被占满,排查是否有其他 I/O 高的组件与 PD 混合部署以及磁盘的健康情况,可通过监控 Grafana -> **disk performance** -> **latency** 和 **load** 等指标进行验证,必要时可以使用 fio 工具对盘进行检测,见案例 [case-292](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case292.md)。 + +* PD 之间的网络问题。PD 日志中有 `"lost the TCP streaming connection"`,排查 PD 之间网络是否有问题,可通过监控 Grafana -> **PD** -> **etcd** 的 **round trip** 来验证,见案例 [case-177](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case177.md)。 + +* 系统负载高,日志中能看到 `"server is likely overloaded"`,见案例 [case-214](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case214.md)。 + +* 选举不出 leader。PD 日志中有 `"lease is not expired"`,见 issues [https://github.com/etcd-io/etcd/issues/10355](https://github.com/etcd-io/etcd/issues/10355)。v3.0.x 版本和 v2.1.19 版本已解决该问题,见案例 [case-875](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case875.md)。 + +* 选举慢。Region 加载时间长,从 PD 日志中 `grep "regions cost"`(例如日志中可能是 `load 460927 regions cost 11.77099s`),如果出现秒级,则说明较慢,v3.0 版本可开启 Region Storage(设置 `use-region-storage` 为 `true`),该特性能极大缩短加载 Region 的时间,见案例 [case-429](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case429.md)。 + +* TiDB 与 PD 之间的网络问题,应排查网络相关情况。通过监控 Grafana -> **blackbox_exporter** -> **ping latency** 确定 TiDB 到 PD leader 的网络是否正常。 + +* PD 报 `FATAL` 错误,日志中有 `"range failed to find revision pair"`。v3.0.8 中已经解决问题,见 PR [https://github.com/pingcap/pd/pull/2040](https://github.com/pingcap/pd/pull/2040)。详情请参考案例 [case-947](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case947.md)。 + +* 使用 `/api/v1/regions` 接口时 Region 数量过多可能会导致 PD OOM。已于 v3.0.8 版本修复,见 [https://github.com/pingcap/pd/pull/1986](https://github.com/pingcap/pd/pull/1986)。 + +* 滚动升级的时候 PD OOM,gRPC 消息大小没限制,监控可看到 TCP InSegs 较大,已于 v3.0.6 版本修复,见 [https://github.com/pingcap/pd/pull/1952](https://github.com/pingcap/pd/pull/1952)。 + +* PD panic,请[提交 bug](https://github.com/tikv/pd/issues/new?labels=kind/bug&template=bug-report.md)。 + +* 其他原因,通过 `curl http://127.0.0.1:2379/debug/pprof/goroutine?debug=2` 抓取 goroutine,并[提交 bug](https://github.com/pingcap/pd/issues/new?labels=kind%2Fbug&template=bug-report.md)。 + +### TiKV 异常 + +**现象:** + +监控中 **KV Cmd Duration** 异常升高。KV Cmd Duration 是 TiDB 发送请求给 TiKV 到收到回复的延迟。 + +**可能的原因:** + +* 查看 gRPC duration。gRPC duration 是请求在 TiKV 端的总耗时。通过对比 TiKV 的 gRPC duration 以及 TiDB 中的 KV duration 可以发现潜在的网络问题。比如 gRPC duration 很短但是 TiDB 的 KV duration 显示很长,说明 TiDB 和 TiKV 之间网络延迟可能很高,或者 TiDB 和 TiKV 之间的网卡带宽被占满。 + +* TiKV 重启了导致重新选举 + * TiKV panic 之后又被 `systemd` 重新拉起正常运行,可以通过查看 TiKV 的日志来确认是否有 `panic`,这种情况属于非预期,需要报 bug。 + * 被第三者 `stop`/`kill`,被 `systemd` 重新拉起。查看 `dmesg` 和 `TiKV log` 确认原因。 + * TiKV 发生 OOM 导致重启了。 + * 动态调整 `THP` 导致 hung 住,见案例 [case-500](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case500.md)。 + +* 查看监控:Grafana -> **TiKV-details** -> **errors** 面板 `server is busy` 看到 TiKV RocksDB 出现 write stall 导致发生重新选举。 + +* TiKV 发生网络隔离导致重新选举。 + +* `block-cache` 配置太大导致 OOM,在监控 Grafana -> **TiKV-details** 选中对应的 instance 之后查看 RocksDB 的 `block cache size` 监控来确认是否是该问题。同时请检查 `[storage.block-cache] capacity = # "1GB"` 参数是否设置合理,默认情况下 TiKV 的 `block-cache` 设置为机器总内存的 `45%`。在容器化部署时需要显式指定该参数,因为 TiKV 获取的是物理机的内存,可能会超出单个 container 的内存限制。 + +* Coprocessor 收到大量大查询,返回的数据量太大,gRPC 发送速度跟不上 Coprocessor 向客户端输出数据的速度导致 OOM。可以通过检查监控:Grafana -> **TiKV-details** -> **coprocessor overview** 的 `response size` 是否超过 `network outbound` 流量来确认是否属于这种情况。 + +### TiKV 单线程瓶颈 + +TiKV 中存在一些单线程线程,可能会成为瓶颈。 + +* 单个 TiKV Region 过多导致单个 gRPC 线程成为瓶颈(查看 Grafana -> TiKV-details -> `Thread CPU/gRPC CPU Per Thread` 监控),v3.x 以上版本可以开启 Hibernate Region 特性来解决,见案例 [case-612](https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case612.md)。 +* v3.0 之前版本 Raftstore 单线程或者 Apply 单线程到达瓶颈(Grafana -> TiKV-details -> `Thread CPU/raft store CPU 和 Async apply CPU` 超过 `80%`),可以选择扩容 TiKV(v2.x 版本)实例或者升级到多线程模型的 v3.x 版本。 + +### CPU Load 升高 + +**现象:** + +CPU 资源使用到达瓶颈 + +**可能的原因:** + +* 热点问题。 +* 整体负载高,排查 TiDB 的 slow query 和 expensive query。对运行的 query 进行优化,如果缺索引就加索引,如果可以批量执行就批量执行。另一个方案是对集群进行扩容。 + +## 其它原因 + +### 集群维护 + +通常大多数的线上集群有 3 或 5 个 PD 节点,如果维护的主机上有 PD 组件,需要具体考虑节点是 leader 还是 follower,关闭 follower 对集群运行没有任何影响,关闭 leader 需要先切换,并在切换时有 3 秒左右的性能抖动。 + +### 少数派副本离线 + +TiDB 集群默认配置为 3 副本,每一个 Region 都会在集群中保存 3 份,它们之间通过 Raft 协议来选举 Leader 并同步数据。Raft 协议可以保证在数量小于副本数(注意:不是节点数)一半的节点挂掉或者隔离的情况下,仍然能够提供服务,并且不丢失任何数据。对于 3 副本集群,挂掉一个节点可能会导致性能抖动,可用性和正确性理论上不会受影响。 + +### 新增索引 + +由于创建索引在扫表回填索引的时候会消耗大量资源,甚至与一些频繁更新的字段会发生冲突导致正常业务受到影响。大表创建索引的过程往往会持续很长时间,所以要尽可能地平衡执行时间和集群性能之间的关系,比如选择非高频更新时间段。 + +**参数调整:** + +目前主要使用 `tidb_ddl_reorg_worker_cnt` 和 `tidb_ddl_reorg_batch_size` 这两个参数来动态调整索引创建速度,通常来说它们的值越小对系统影响越小,但是执行时间越长。 + +一般情况下,先将值保持为默认的 `4` 和 `256`,观察集群资源使用情况和响应速度,再逐渐调大 `tidb_ddl_reorg_worker_cnt` 参数来增加并发,观察监控如果系统没有发生明显的抖动,再逐渐调大 `tidb_ddl_reorg_batch_size` 参数,但如果索引涉及的列更新很频繁的话就会造成大量冲突造成失败重试。 + +另外还可以通过调整参数 `tidb_ddl_reorg_priority` 为 `PRIORITY_HIGH` 来让创建索引的任务保持高优先级来提升速度,但在通用 OLTP 系统上,一般建议保持默认。 + +### GC 压力大 + +TiDB 的事务的实现采用了 MVCC(多版本并发控制)机制,当新写入的数据覆盖旧的数据时,旧的数据不会被替换掉,而是与新写入的数据同时保留,并以时间戳来区分版本。GC 的任务便是清理不再需要的旧数据。 + +* Resolve Locks 阶段在 TiKV 一侧会产生大量的 scan_lock 请求,可以在 gRPC 相关的 metrics 中观察到。`scan_lock` 请求会对全部的 Region 调用。 +* Delete Ranges 阶段会往 TiKV 发送少量的 `unsafe_destroy_range` 请求,也可能没有。可以在 gRPC 相关的 metrics 中和 GC 分类下的 GC tasks 中观察到。 +* Do GC 阶段,默认每台 TiKV 会自动扫描本机上的 leader Region 并对每一个 leader 进行 GC,这一活动可以在 GC 分类下的 GC tasks 中观察到。 diff --git a/troubleshoot-hot-spot-issues.md b/troubleshoot-hot-spot-issues.md index c80c8b732ba7..107b8b8a0975 100644 --- a/troubleshoot-hot-spot-issues.md +++ b/troubleshoot-hot-spot-issues.md @@ -1,172 +1,172 @@ ---- -title: TiDB 热点问题处理 ---- - -# TiDB 热点问题处理 - -本文介绍如何定位和解决读写热点问题。 - -TiDB 作为分布式数据库,内建负载均衡机制,尽可能将业务负载均匀地分布到不同计算或存储节点上,更好地利用上整体系统资源。然而,机制不是万能的,在一些场景下仍会有部分业务负载不能被很好地分散,影响性能,形成单点的过高负载,也称为热点。 - -TiDB 提供了完整的方案用于排查、解决或规避这类热点。通过均衡负载热点,可以提升整体性能,包括提高 QPS 和降低延迟等。 - -## 常见热点场景 - -### TiDB 编码规则回顾 - -TiDB 对每个表分配一个 TableID,每一个索引都会分配一个 IndexID,每一行分配一个 RowID(默认情况下,如果表使用整数型的 Primary Key,那么会用 Primary Key 的值当做 RowID)。其中 TableID 在整个集群内唯一,IndexID/RowID 在表内唯一,这些 ID 都是 int64 类型。 - -每行数据按照如下规则进行编码成 Key-Value pair: - -```text -Key: tablePrefix{tableID}_recordPrefixSep{rowID} -Value: [col1, col2, col3, col4] -``` - -其中 Key 的 `tablePrefix` 和 `recordPrefixSep` 都是特定的字符串常量,用于在 KV 空间内区分其他数据。 - -对于 Index 数据,会按照如下规则编码成 Key-Value pair: - -```text -Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue -Value: rowID -``` - -Index 数据还需要考虑 Unique Index 和非 Unique Index 两种情况,对于 Unique Index,可以按照上述编码规则。但是对于非 Unique Index,通过这种编码并不能构造出唯一的 Key,因为同一个 Index 的 `tablePrefix{tableID}_indexPrefixSep{indexID}` 都一样,可能有多行数据的 `ColumnsValue` 是一样的,所以对于非 Unique Index 的编码做了一点调整: - -```text -Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID -Value: null -``` - -### 表热点 - -从 TiDB 编码规则可知,同一个表的数据会在以表 ID 开头为前缀的一个 range 中,数据的顺序按照 RowID 的值顺序排列。在表 insert 的过程中如果 RowID 的值是递增的,则插入的行只能在末端追加。当 Region 达到一定的大小之后会进行分裂,分裂之后还是只能在 range 范围的末端追加,永远只能在一个 Region 上进行 insert 操作,形成热点。 - -常见的 increment 类型自增主键就是顺序递增的,默认情况下,在主键为整数型时,会用主键值当做 RowID,此时 RowID 为顺序递增,在大量 insert 时形成表的写入热点。 - -同时,TiDB 中 RowID 默认也按照自增的方式顺序递增,主键不为整数类型时,同样会遇到写入热点的问题。 - -此外,当写入或读取数据存在热点时,即出现新建表或分区的写入热点问题和只读场景下周期性读热点问题时,你可以使用表属性控制 Region 合并。具体的热点场景描述和解决方法可以查看[使用表属性控制 Region 合并的使用场景](/table-attributes.md#使用场景)。 - -### 索引热点 - -索引热点与表热点类似,常见的热点场景出现在时间顺序单调递增的字段,或者插入大量重复值的场景。 - -## 确定存在热点问题 - -性能问题不一定是热点造成的,也可能存在多个因素共同影响,在排查前需要先确认是否与热点相关。 - -- 判断写热点依据:打开监控面板 TiKV-Trouble-Shooting 中 Hot Write 面板,观察 Raftstore CPU 监控是否存在个别 TiKV 节点的指标明显高于其他节点的现象。 - -- 判断读热点依据:打开监控面板 TIKV-Details 中 Thread_CPU,查看 coprocessor cpu 有没有明显的某个 TiKV 特别高。 - -## 使用 TiDB Dashboard 定位热点表 - -[TiDB Dashboard](/dashboard/dashboard-intro.md) 中的[流量可视化](/dashboard/dashboard-key-visualizer.md)功能可帮助用户缩小热点排查范围到表级别。以下是流量可视化功能展示的一个热力图样例,该图横坐标是时间,纵坐标是各个表和索引,颜色越亮代表其流量越大。可在工具栏中切换显示读或写流量。 - -![Dashboard 示例1](/media/troubleshoot-hot-spot-issues-1.png) - -当图中写入流量图出现以下明亮斜线(斜向上或斜向下)时,由于写入只出现在末端,随着表 Region 数量变多,呈现出阶梯状。此时说明该表构成了写入热点: - -![Dashboard 示例2](/media/troubleshoot-hot-spot-issues-2.png) - -对于读热点,在热力图中一般表现为一条明亮的横线,通常是有大量访问的小表,如下图所示: - -![Dashboard 示例3](/media/troubleshoot-hot-spot-issues-3.png) - -将鼠标移到亮色块上,即可看到是什么表或索引具有大流量,如下图所示: - -![Dashboard 示例4](/media/troubleshoot-hot-spot-issues-4.png) - -## 使用 SHARD_ROW_ID_BITS 处理热点表 - -对于非聚簇索引主键或没有主键的表,TiDB 会使用一个隐式的自增 RowID,大量 `INSERT` 时会把数据集中写入单个 Region,造成写入热点。 - -通过设置 [`SHARD_ROW_ID_BITS`](/shard-row-id-bits.md),可以把 RowID 打散写入多个不同的 Region,缓解写入热点问题。 - -``` -SHARD_ROW_ID_BITS = 4 表示 16 个分片 -SHARD_ROW_ID_BITS = 6 表示 64 个分片 -SHARD_ROW_ID_BITS = 0 表示默认值 1 个分片 -``` - -语句示例: - -```sql -CREATE TABLE:CREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4; -ALTER TABLE:ALTER TABLE t SHARD_ROW_ID_BITS = 4; -``` - -`SHARD_ROW_ID_BITS` 的值可以动态修改,每次修改之后,只对新写入的数据生效。 - -对于含有 `CLUSTERED` 主键的表,TiDB 会使用表的主键作为 RowID,因为 `SHARD_ROW_ID_BITS` 会改变 RowID 生成规则,所以此时无法使用 `SHARD_ROW_ID_BITS` 选项。而对于使用 `NONCLUSTERED` 主键的表,TiDB 会使用自动分配的 64 位整数作为 RowID,此时也可以使用 `SHARD_ROW_ID_BITS` 特性。要了解关于 `CLUSTERED` 主键的详细信息,请参考[聚簇索引](/clustered-indexes.md)。 - -以下是两张无主键情况下使用 `SHARD_ROW_ID_BITS` 打散热点后的流量图,第一张展示了打散前的情况,第二张展示了打散后的情况。 - -![Dashboard 示例5](/media/troubleshoot-hot-spot-issues-5.png) - -![Dashboard 示例6](/media/troubleshoot-hot-spot-issues-6.png) - -从流量图可见,设置 `SHARD_ROW_ID_BITS` 后,流量热点由之前的只在一个 Region 上变得很分散。 - -## 使用 AUTO_RANDOM 处理自增主键热点表 - -使用 `AUTO_RANDOM` 处理自增主键热点表,适用于代替自增主键,解决自增主键带来的写入热点。 - -使用该功能后,将由 TiDB 生成随机分布且空间耗尽前不重复的主键,达到离散写入、打散写入热点的目的。 - -注意 TiDB 生成的主键不再是自增的主键,可使用 `LAST_INSERT_ID()` 获取上次分配的主键值。 - -将建表语句中的 `AUTO_INCREMENT` 改为 `AUTO_RANDOM` 即可使用该功能,适用于主键只需要保证唯一,不包含业务意义的场景。示例如下: - -{{< copyable "sql" >}} - -```sql -CREATE TABLE t (a BIGINT PRIMARY KEY AUTO_RANDOM, b varchar(255)); -INSERT INTO t (b) VALUES ("foo"); -SELECT * FROM t; -``` - -```sql -+------------+---+ -| a | b | -+------------+---+ -| 1073741825 | b | -+------------+---+ -``` - -{{< copyable "sql" >}} - -```sql -SELECT LAST_INSERT_ID(); -``` - -```sql -+------------------+ -| LAST_INSERT_ID() | -+------------------+ -| 1073741825 | -+------------------+ -``` - -以下是将 `AUTO_INCREMENT` 表改为 `AUTO_RANDOM` 打散热点后的流量图,第一张是 `AUTO_INCREMENT`,第二张是 `AUTO_RANDOM`。 - -![Dashboard 示例7](/media/troubleshoot-hot-spot-issues-7.png) - -![Dashboard 示例8](/media/troubleshoot-hot-spot-issues-8.png) - -由流量图可见,使用 `AUTO_RANDOM` 代替 `AUTO_INCREMENT` 能很好地打散热点。 - -更详细的说明参见 [`AUTO_RANDOM`](/auto-random.md) 文档。 - -## 小表热点的优化 - -TiDB 的 Coprocessor Cache 功能支持下推计算结果缓存。开启该功能后,将在 TiDB 实例侧缓存下推给 TiKV 计算的结果,对于小表读热点能起到比较好的效果。 - -更详细的说明参见[下推计算结果缓存](/coprocessor-cache.md#配置)文档。 - -**其他相关资料**: - -+ [TiDB 高并发写入场景最佳实践](/best-practices/high-concurrency-best-practices.md) -+ [Split Region 使用文档](/sql-statements/sql-statement-split-region.md) +--- +title: TiDB 热点问题处理 +--- + +# TiDB 热点问题处理 + +本文介绍如何定位和解决读写热点问题。 + +TiDB 作为分布式数据库,内建负载均衡机制,尽可能将业务负载均匀地分布到不同计算或存储节点上,更好地利用上整体系统资源。然而,机制不是万能的,在一些场景下仍会有部分业务负载不能被很好地分散,影响性能,形成单点的过高负载,也称为热点。 + +TiDB 提供了完整的方案用于排查、解决或规避这类热点。通过均衡负载热点,可以提升整体性能,包括提高 QPS 和降低延迟等。 + +## 常见热点场景 + +### TiDB 编码规则回顾 + +TiDB 对每个表分配一个 TableID,每一个索引都会分配一个 IndexID,每一行分配一个 RowID(默认情况下,如果表使用整数型的 Primary Key,那么会用 Primary Key 的值当做 RowID)。其中 TableID 在整个集群内唯一,IndexID/RowID 在表内唯一,这些 ID 都是 int64 类型。 + +每行数据按照如下规则进行编码成 Key-Value pair: + +```text +Key: tablePrefix{tableID}_recordPrefixSep{rowID} +Value: [col1, col2, col3, col4] +``` + +其中 Key 的 `tablePrefix` 和 `recordPrefixSep` 都是特定的字符串常量,用于在 KV 空间内区分其他数据。 + +对于 Index 数据,会按照如下规则编码成 Key-Value pair: + +```text +Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue +Value: rowID +``` + +Index 数据还需要考虑 Unique Index 和非 Unique Index 两种情况,对于 Unique Index,可以按照上述编码规则。但是对于非 Unique Index,通过这种编码并不能构造出唯一的 Key,因为同一个 Index 的 `tablePrefix{tableID}_indexPrefixSep{indexID}` 都一样,可能有多行数据的 `ColumnsValue` 是一样的,所以对于非 Unique Index 的编码做了一点调整: + +```text +Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID +Value: null +``` + +### 表热点 + +从 TiDB 编码规则可知,同一个表的数据会在以表 ID 开头为前缀的一个 range 中,数据的顺序按照 RowID 的值顺序排列。在表 insert 的过程中如果 RowID 的值是递增的,则插入的行只能在末端追加。当 Region 达到一定的大小之后会进行分裂,分裂之后还是只能在 range 范围的末端追加,永远只能在一个 Region 上进行 insert 操作,形成热点。 + +常见的 increment 类型自增主键就是顺序递增的,默认情况下,在主键为整数型时,会用主键值当做 RowID,此时 RowID 为顺序递增,在大量 insert 时形成表的写入热点。 + +同时,TiDB 中 RowID 默认也按照自增的方式顺序递增,主键不为整数类型时,同样会遇到写入热点的问题。 + +此外,当写入或读取数据存在热点时,即出现新建表或分区的写入热点问题和只读场景下周期性读热点问题时,你可以使用表属性控制 Region 合并。具体的热点场景描述和解决方法可以查看[使用表属性控制 Region 合并的使用场景](/table-attributes.md#使用场景)。 + +### 索引热点 + +索引热点与表热点类似,常见的热点场景出现在时间顺序单调递增的字段,或者插入大量重复值的场景。 + +## 确定存在热点问题 + +性能问题不一定是热点造成的,也可能存在多个因素共同影响,在排查前需要先确认是否与热点相关。 + +- 判断写热点依据:打开监控面板 TiKV-Trouble-Shooting 中 Hot Write 面板,观察 Raftstore CPU 监控是否存在个别 TiKV 节点的指标明显高于其他节点的现象。 + +- 判断读热点依据:打开监控面板 TIKV-Details 中 Thread_CPU,查看 coprocessor cpu 有没有明显的某个 TiKV 特别高。 + +## 使用 TiDB Dashboard 定位热点表 + +[TiDB Dashboard](/dashboard/dashboard-intro.md) 中的[流量可视化](/dashboard/dashboard-key-visualizer.md)功能可帮助用户缩小热点排查范围到表级别。以下是流量可视化功能展示的一个热力图样例,该图横坐标是时间,纵坐标是各个表和索引,颜色越亮代表其流量越大。可在工具栏中切换显示读或写流量。 + +![Dashboard 示例1](/media/troubleshoot-hot-spot-issues-1.png) + +当图中写入流量图出现以下明亮斜线(斜向上或斜向下)时,由于写入只出现在末端,随着表 Region 数量变多,呈现出阶梯状。此时说明该表构成了写入热点: + +![Dashboard 示例2](/media/troubleshoot-hot-spot-issues-2.png) + +对于读热点,在热力图中一般表现为一条明亮的横线,通常是有大量访问的小表,如下图所示: + +![Dashboard 示例3](/media/troubleshoot-hot-spot-issues-3.png) + +将鼠标移到亮色块上,即可看到是什么表或索引具有大流量,如下图所示: + +![Dashboard 示例4](/media/troubleshoot-hot-spot-issues-4.png) + +## 使用 SHARD_ROW_ID_BITS 处理热点表 + +对于非聚簇索引主键或没有主键的表,TiDB 会使用一个隐式的自增 RowID,大量 `INSERT` 时会把数据集中写入单个 Region,造成写入热点。 + +通过设置 [`SHARD_ROW_ID_BITS`](/shard-row-id-bits.md),可以把 RowID 打散写入多个不同的 Region,缓解写入热点问题。 + +``` +SHARD_ROW_ID_BITS = 4 表示 16 个分片 +SHARD_ROW_ID_BITS = 6 表示 64 个分片 +SHARD_ROW_ID_BITS = 0 表示默认值 1 个分片 +``` + +语句示例: + +```sql +CREATE TABLE:CREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4; +ALTER TABLE:ALTER TABLE t SHARD_ROW_ID_BITS = 4; +``` + +`SHARD_ROW_ID_BITS` 的值可以动态修改,每次修改之后,只对新写入的数据生效。 + +对于含有 `CLUSTERED` 主键的表,TiDB 会使用表的主键作为 RowID,因为 `SHARD_ROW_ID_BITS` 会改变 RowID 生成规则,所以此时无法使用 `SHARD_ROW_ID_BITS` 选项。而对于使用 `NONCLUSTERED` 主键的表,TiDB 会使用自动分配的 64 位整数作为 RowID,此时也可以使用 `SHARD_ROW_ID_BITS` 特性。要了解关于 `CLUSTERED` 主键的详细信息,请参考[聚簇索引](/clustered-indexes.md)。 + +以下是两张无主键情况下使用 `SHARD_ROW_ID_BITS` 打散热点后的流量图,第一张展示了打散前的情况,第二张展示了打散后的情况。 + +![Dashboard 示例5](/media/troubleshoot-hot-spot-issues-5.png) + +![Dashboard 示例6](/media/troubleshoot-hot-spot-issues-6.png) + +从流量图可见,设置 `SHARD_ROW_ID_BITS` 后,流量热点由之前的只在一个 Region 上变得很分散。 + +## 使用 AUTO_RANDOM 处理自增主键热点表 + +使用 `AUTO_RANDOM` 处理自增主键热点表,适用于代替自增主键,解决自增主键带来的写入热点。 + +使用该功能后,将由 TiDB 生成随机分布且空间耗尽前不重复的主键,达到离散写入、打散写入热点的目的。 + +注意 TiDB 生成的主键不再是自增的主键,可使用 `LAST_INSERT_ID()` 获取上次分配的主键值。 + +将建表语句中的 `AUTO_INCREMENT` 改为 `AUTO_RANDOM` 即可使用该功能,适用于主键只需要保证唯一,不包含业务意义的场景。示例如下: + +{{< copyable "sql" >}} + +```sql +CREATE TABLE t (a BIGINT PRIMARY KEY AUTO_RANDOM, b varchar(255)); +INSERT INTO t (b) VALUES ("foo"); +SELECT * FROM t; +``` + +```sql ++------------+---+ +| a | b | ++------------+---+ +| 1073741825 | b | ++------------+---+ +``` + +{{< copyable "sql" >}} + +```sql +SELECT LAST_INSERT_ID(); +``` + +```sql ++------------------+ +| LAST_INSERT_ID() | ++------------------+ +| 1073741825 | ++------------------+ +``` + +以下是将 `AUTO_INCREMENT` 表改为 `AUTO_RANDOM` 打散热点后的流量图,第一张是 `AUTO_INCREMENT`,第二张是 `AUTO_RANDOM`。 + +![Dashboard 示例7](/media/troubleshoot-hot-spot-issues-7.png) + +![Dashboard 示例8](/media/troubleshoot-hot-spot-issues-8.png) + +由流量图可见,使用 `AUTO_RANDOM` 代替 `AUTO_INCREMENT` 能很好地打散热点。 + +更详细的说明参见 [`AUTO_RANDOM`](/auto-random.md) 文档。 + +## 小表热点的优化 + +TiDB 的 Coprocessor Cache 功能支持下推计算结果缓存。开启该功能后,将在 TiDB 实例侧缓存下推给 TiKV 计算的结果,对于小表读热点能起到比较好的效果。 + +更详细的说明参见[下推计算结果缓存](/coprocessor-cache.md#配置)文档。 + +**其他相关资料**: + ++ [TiDB 高并发写入场景最佳实践](/best-practices/high-concurrency-best-practices.md) ++ [Split Region 使用文档](/sql-statements/sql-statement-split-region.md)