From 2944e03ed68a49acdfb4133951eefa82953b5f79 Mon Sep 17 00:00:00 2001 From: crazycs Date: Thu, 10 Sep 2020 11:30:46 +0800 Subject: [PATCH] cherry pick #3791 to release-4.0 Signed-off-by: ti-srebot --- identify-slow-queries.md | 32 +++++++++++++++++++++++++ system-variables.md | 50 +++++++++++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/identify-slow-queries.md b/identify-slow-queries.md index 2062791eecce..19a73c1428bc 100644 --- a/identify-slow-queries.md +++ b/identify-slow-queries.md @@ -108,6 +108,38 @@ Slow Query 基础信息: * `Cop_backoff_{backoff-type}_avg_time`:因某种错误造成的平均 backoff 时间。 * `Cop_backoff_{backoff-type}_p90_time`:因某种错误造成的 P90 分位 backoff 时间。 +## 相关系统变量 + +* [tidb_slow_log_threshold](/system-variables.md#tidb_slow_log_threshold):设置慢日志的阈值,执行时间超过阈值的 SQL 语句将被记录到慢日志中。默认值是 300 ms。 +* [tidb_query_log_max_len](/system-variables.md#tidb_query_log_max_len):设置慢日志记录 SQL 语句的最大长度。默认值是 4096 byte。 +* [tidb_log_desensitization](/system-variables.md#tidb_log_desensitization):设置慢日志记录 SQL 时是否将用户数据脱敏用 `?` 代替。默认值是 0 ,即关闭该功能。 +* [tidb_enable_collect_execution_info](/system-variables.md#tidb_enable_collect_execution_info):设置是否记录执行计划中各个算子的执行信息,默认值是 1。该功能对性能的影响约为 3%。开启该项后查看 `Plan` 的示例如下: + +```sql +> select tidb_decode_plan('jAOIMAk1XzE3CTAJMQlmdW5jczpjb3VudChDb2x1bW4jNyktPkMJC/BMNQkxCXRpbWU6MTAuOTMxNTA1bXMsIGxvb3BzOjIJMzcyIEJ5dGVzCU4vQQoxCTMyXzE4CTAJMQlpbmRleDpTdHJlYW1BZ2dfOQkxCXQRSAwyNzY4LkgALCwgcnBjIG51bTogMQkMEXMQODg0MzUFK0hwcm9jIGtleXM6MjUwMDcJMjA2HXsIMgk1BWM2zwAAMRnIADcVyAAxHcEQNQlOL0EBBPBbCjMJMTNfMTYJMQkzMTI4MS44NTc4MTk5MDUyMTcJdGFibGU6dCwgaW5kZXg6aWR4KGEpLCByYW5nZTpbLWluZiw1MDAwMCksIGtlZXAgb3JkZXI6ZmFsc2UJMjUBrgnQVnsA'); ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| tidb_decode_plan('jAOIMAk1XzE3CTAJMQlmdW5jczpjb3VudChDb2x1bW4jNyktPkMJC/BMNQkxCXRpbWU6MTAuOTMxNTA1bXMsIGxvb3BzOjIJMzcyIEJ5dGVzCU4vQQoxCTMyXzE4CTAJMQlpbmRleDpTdHJlYW1BZ2dfOQkxCXQRSAwyNzY4LkgALCwgcnBjIG51bTogMQkMEXMQODg0MzUFK0hwcm9jIGtleXM6MjUwMDcJMjA2HXsIMg | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| id task estRows operator info actRows execution info memory disk | +| StreamAgg_17 root 1 funcs:count(Column#7)->Column#5 1 time:10.931505ms, loops:2 372 Bytes N/A | +| └─IndexReader_18 root 1 index:StreamAgg_9 1 time:10.927685ms, loops:2, rpc num: 1, rpc time:10.884355ms, proc keys:25007 206 Bytes N/A | +| └─StreamAgg_9 cop 1 funcs:count(1)->Column#7 1 time:11ms, loops:25 N/A N/A | +| └─IndexScan_16 cop 31281.857819905217 table:t, index:idx(a), range:[-inf,50000), keep order:false 25007 time:11ms, loops:25 N/A N/A | ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +在性能测试中可以关闭自动收集算子的执行信息: + +{{< copyable "sql" >}} + +```sql +set @@tidb_enable_collect_execution_info=0; +``` + +`Plan` 字段显示的格式和 [`EXPLAIN`](/sql-statements/sql-statement-explain.md) 或者 [`EXPLAIN ANALYZE`](/sql-statements/sql-statement-explain-analyze.md) 大致一致。可以查看 [`EXPLAIN`](/sql-statements/sql-statement-explain.md) 或者 [`EXPLAIN ANALYZE`](/sql-statements/sql-statement-explain-analyze.md) 文档了解更多关于执行计划的信息。 + +更多详细信息,可以参见 [TiDB 专用系统变量和语法](/system-variables.md)。 + ## 慢日志内存映射表 用户可通过查询 `INFORMATION_SCHEMA.SLOW_QUERY` 表来查询慢查询日志中的内容,表中列名和慢日志中字段名一一对应,表结构可查看 [`SLOW_QUERY` 表](/information-schema/information-schema-slow-query.md) 中的介绍。 diff --git a/system-variables.md b/system-variables.md index 1b74c5bdd4a1..82b46b2f86b4 100644 --- a/system-variables.md +++ b/system-variables.md @@ -5,7 +5,13 @@ aliases: ['/docs-cn/stable/system-variables/','/docs-cn/v4.0/system-variables/', # 系统变量 -TiDB 系统变量的行为与 MySQL 相似,变量的作用范围可以是全局范围有效(Global Scope)或会话级别有效(Session Scope),也可以是全局及会话级别均有效。对 `GLOBAL` 作用域变量的更改,**只适用于**新增的 TiDB 连接。使用 [`SET` 语句](/sql-statements/sql-statement-set-variable.md)可以设置变量的作用范围为全局或会话级别。 +TiDB 系统变量的行为与 MySQL 相似但有一些不同,变量的作用范围可以是全局范围有效 (Global Scope)、实例级别有效 (Instance Scope) 或会话级别有效 (Session Scope),或组合了上述多个范围。其中: + +- 对 `GLOBAL` 作用域变量的更改,设置后**只对新 TiDB 连接会话生效**,当前活动连接会话不受影响。更改会被持久化,重启后仍然生效。 + +- 对 `INSTANCE` 作用域变量的更改,设置后会立即对当前 TiDB 实例所有活动连接会话或新连接会话生效,其他 TiDB 实例不生效。更改**不会**被持久化,重启 TiDB 后会**失效**。 + +使用 [`SET` 语句](/sql-statements/sql-statement-set-variable.md)可以设置变量的作用范围为全局级别、实例级别或会话级别。 ```sql # 以下两个语句等价地改变一个 Session 变量 @@ -38,7 +44,7 @@ SET GLOBAL tidb_distsql_scan_concurrency = 10; ### `ddl_slow_threshold` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:300 - 耗时超过该阈值的 DDL 操作会被输出到日志,单位为毫秒。 @@ -178,7 +184,7 @@ SET GLOBAL tidb_distsql_scan_concurrency = 10; ### `tidb_check_mb4_value_in_utf8` -- 作用域:SERVER +- 作用域:INSTANCE - 默认值:1 - 这个变量用来设置是否开启对字符集为 UTF8 类型的数据做合法性检查,默认值 `1` 表示开启检查。这个默认行为和 MySQL 是兼容的。 - 如果是旧版本升级时,可能需要关闭该选项,否则由于旧版本(v2.1.1 及之前)没有对数据做合法性检查,所以旧版本写入非法字符串是可以写入成功的,但是新版本加入合法性检查后会报写入失败。具体可以参考[升级后常见问题](/faq/upgrade-faq.md)。 @@ -331,7 +337,7 @@ SET GLOBAL tidb_distsql_scan_concurrency = 10; ### `tidb_enable_slow_log` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:1 - 这个变量用于控制是否开启 slow log 功能,默认开启。 @@ -408,20 +414,20 @@ SET GLOBAL tidb_distsql_scan_concurrency = 10; ### `tidb_expensive_query_time_threshold` -- 作用域:SERVER +- 作用域:INSTANCE - 默认值:60 - 这个变量用来控制打印 expensive query 日志的阈值时间,单位是秒,默认值是 60 秒。expensive query 日志和慢日志的差别是,慢日志是在语句执行完后才打印,expensive query 日志可以把正在执行中的语句且执行时间超过阈值的语句及其相关信息打印出来。 ### `tidb_force_priority` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:`NO_PRIORITY` - 这个变量用于改变 TiDB server 上执行的语句的默认优先级。例如,你可以通过设置该变量来确保正在执行 OLAP 查询的用户优先级低于正在执行 OLTP 查询的用户。 - 可设置为 `NO_PRIORITY`、`LOW_PRIORITY`、`DELAYED` 或 `HIGH_PRIORITY`。 ### `tidb_general_log` -- 作用域:SERVER +- 作用域:INSTANCE - 默认值:0 - 这个变量用来设置是否在日志里记录所有的 SQL 语句。 @@ -672,7 +678,7 @@ mysql> desc select count(distinct a) from test.t; ### `tidb_query_log_max_len` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:4096 (bytes) - 最长的 SQL 输出长度。当语句的长度大于 query-log-max-len,将会被截断输出。 @@ -686,13 +692,13 @@ set tidb_query_log_max_len = 20; ### `tidb_pprof_sql_cpu` 从 v4.0 版本开始引入 -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:0 - 这个变量用来控制是否在 profile 输出中标记出对应的 SQL 语句,用于定位和排查性能问题。 ### `tidb_record_plan_in_slow_log` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:1 - 这个变量用于控制是否在 slow log 里包含慢查询的执行计划。 @@ -764,11 +770,11 @@ Query OK, 0 rows affected, 1 warning (0.00 sec) ### `tidb_slow_log_threshold` -- 作用域:SESSION +- 作用域:INSTANCE - 默认值:300 -- 输出慢日志的耗时阈值。当查询大于这个值,就会当做是一个慢查询,输出到慢查询日志。默认为 300ms。 +- 输出慢日志的耗时阈值。当查询大于这个值,就会当做是一个慢查询,输出到慢查询日志。默认为 300 ms。 示例: @@ -778,6 +784,24 @@ Query OK, 0 rows affected, 1 warning (0.00 sec) set tidb_slow_log_threshold = 200; ``` +### `tidb_enable_collect_execution_info` + +- 作用域:INSTANCE + +- 默认值:1 + +- 这个变量用于控制是否同时将各个执行算子的执行信息记录入 slow query log 中。 + +### `tidb_log_desensitization` + +- 作用域:GLOBAL + +- 默认值:0 + +- 这个变量用于控制在记录 TiDB 日志和慢日志时,是否将 SQL 中的用户信息遮蔽。 + +- 将该变量设置为 `1` 即开启后,假设执行的 SQL 为 `insert into t values (1,2)`,在日志中记录的 SQL 会是 `insert into t values (?,?)`,即用户输入的信息被遮蔽。 + ### `tidb_slow_query_file` - 作用域:SESSION @@ -836,7 +860,7 @@ set tidb_slow_log_threshold = 200; ### `tidb_store_limit` 从 v3.0.4 和 v4.0 版本开始引入 -- 作用域:SESSION | GLOBAL +- 作用域:INSTANCE | GLOBAL - 默认值: 0