系统变量

TiDB 系统变量的行为与 MySQL 相似,变量的作用范围可以是会话级别有效 (Session Scope) 或全局范围有效 (Global Scope)。其中:

  • 对 SESSION 作用域变量的更改,设置后只影响当前会话。
  • 对 GLOBAL 作用域变量的更改,设置后立即生效。如果该变量也有 SESSION 作用域,已经连接的所有会话 (包括当前会话) 将继续使用会话当前的 SESSION 变量值。
  • 要设置变量值,可使用 SET 语句。
1. # 以下两个语句等价地改变一个 Session 变量
2. SET tidb_distsql_scan_concurrency = 10;
3. SET SESSION tidb_distsql_scan_concurrency = 10;

5. # 以下两个语句等价地改变一个 Global 变量
6. SET @@global.tidb_distsql_scan_concurrency = 10;
7. SET  GLOBAL tidb_distsql_scan_concurrency = 10;

系统变量 - 图1

注意

部分 GLOBAL 作用域的变量会持久化到 TiDB 集群中。文档中的变量有一个“是否持久化到集群”的说明,可以为“是”或者“否”。

  • 对于持久化到集群的变量,当该全局变量被修改后,会通知所有 TiDB 服务器刷新其系统变量缓存。在集群中增加一个新的 TiDB 服务器时,或者重启现存的 TiDB 服务器时,都将自动使用该持久化变量。
  • 对于不持久化到集群的变量,对变量的修改只对当前连接的 TiDB 实例生效。如果需要保留设置过的值,需要在 tidb.toml 配置文件中声明。

此外,由于应用和连接器通常需要读取 MySQL 变量,为了兼容这一需求,在 TiDB 中,部分 MySQL 的变量既可读取也可设置。例如,尽管 JDBC 连接器不依赖于查询缓存 (query cache) 的行为,但仍然可以读取和设置查询缓存。

系统变量 - 图2

注意

变量取较大值并不总会带来更好的性能。由于大部分变量对单个连接生效,设置变量时,还应考虑正在执行语句的并发连接数量。

确定安全值时,应考虑变量的单位:

  • 如果单位为线程,安全值通常取决于 CPU 核的数量。
  • 如果单位为字节,安全值通常小于系统内存的总量。
  • 如果单位为时间,单位可能为秒或毫秒。

单位相同的多个变量可能会争夺同一组资源。

变量参考

allow_auto_random_explicit_insert 从 v4.0.3 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 是否允许在 INSERT 语句中显式指定含有 AUTO_RANDOM 属性的列的值。

auto_increment_increment

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:1
  • 范围:[1, 65535]
  • 控制 AUTO_INCREMENT 自增值字段的自增步长。该变量常与 auto_increment_offset 一起使用。

auto_increment_offset

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:1
  • 范围:[1, 65535]
  • 控制 AUTO_INCREMENT 自增值字段的初始值。该变量常与 auto_increment_increment 一起使用。示例如下:
1. mysql> CREATE TABLE t1 (a int not null primary key auto_increment);
2. Query OK, 0 rows affected (0.10 sec)

4. mysql> set auto_increment_offset=1;
5. Query OK, 0 rows affected (0.00 sec)

7. mysql> set auto_increment_increment=3;
8. Query OK, 0 rows affected (0.00 sec)

10. mysql> INSERT INTO t1 VALUES (),(),(),();
11. Query OK, 4 rows affected (0.04 sec)
12. Records: 4  Duplicates: 0  Warnings: 0

14. mysql> SELECT * FROM t1;
15. +----+
16. | a  |
17. +----+
18. |  1 |
19. |  4 |
20. |  7 |
21. | 10 |
22. +----+
23. 4 rows in set (0.00 sec)

autocommit

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 用于设置在非显式事务时是否自动提交事务。更多信息,请参见事务概述。

block_encryption_mode

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:枚举型
  • 默认值:aes-128-ecb
  • 可选值:aes-128-ecb、aes-192-ecb、aes-256-ecb、aes-128-cbc、aes-192-cbc、aes-256-cbc、aes-128-ofb、aes-192-ofb、aes-256-ofb、aes-128-cfb、aes-192-cfb、aes-256-cfb
  • 该变量用于设置 AES_ENCRYPT() 和 AES_DECRYPT() 函数的加密模式。

character_set_client

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4
  • 这个变量表示从客户端发出的数据所用的字符集。有关更多 TiDB 支持的字符集和排序规则,参阅字符集和排序规则文档。如果需要更改字符集,建议使用 SET NAMES 语句。

character_set_connection

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4
  • 若没有为字符串常量指定字符集,该变量表示这些字符串常量所使用的字符集。

character_set_database

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4
  • 该变量表示当前默认在用数据库的字符集,不建议设置该变量。选择新的默认数据库后,服务器会更改该变量的值。

character_set_results

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4
  • 该变量表示数据发送至客户端时所使用的字符集。

character_set_server

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4
  • 当 CREATE SCHEMA 中没有指定字符集时,该变量表示这些新建的表结构所使用的字符集。

collation_connection

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4_bin
  • 该变量表示连接中所使用的排序规则。与 MySQL 中的 collation_connection 一致。

collation_database

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4_bin
  • 该变量表示当前数据库默认所使用的排序规则。与 MySQL 中的 collation_database 一致。不建议设置此变量,当前使用的数据库变动时,此变量会被 TiDB 修改。

collation_server

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:utf8mb4_bin
  • 该变量表示创建数据库时默认的排序规则。

cte_max_recursion_depth

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:1000
  • 范围:[0, 4294967295]
  • 这个变量用于控制公共表表达式的最大递归深度。

datadir

  • 作用域:NONE
  • 默认值:使用的组件和部署方式不同,默认值也不同。
  • /tmp/tidb:如果你将 --store 设置为 "unistore" 或没有设置 --store,则默认值为 /tmp/tidb。
  • ${pd-ip}:${pd-port}:如果你设置的存储引擎是 TiKV(如果使用 TiUP 和 TiDB Operator 部署,则默认的存储引擎为 TiKV),则默认值为 ${pd-ip}:${pd-port}。
  • 这个变量表示数据存储的位置,位置可以是本地路径 /tmp/tidb。如果数据存储在 TiKV 上,则可以是指向 PD 服务器的路径。变量值的格式为 ${pd-ip}:${pd-port},表示 TiDB 在启动时连接到的 PD 服务器。

ddl_slow_threshold

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 类型:整数型
  • 默认值:300
  • 取值范围:[0, 2147483647]
  • 单位:毫秒
  • 耗时超过该阈值的 DDL 操作会被输出到日志。

default_authentication_plugin

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:mysql_native_password
  • 可选值:mysql_native_password,caching_sha2_password,tidb_sm3_password,tidb_auth_token
  • tidb_auth_token 认证方式仅用于 TiDB Cloud 内部实现,不要设置为该值。
  • 服务器和客户端建立连接时,这个变量用于设置服务器对外通告的默认身份验证方式。如要了解该变量的其他可选值,参见可用的身份验证插件。
  • 若要在用户登录时使用 tidb_sm3_password 插件,需要使用 TiDB-JDBC 进行连接。

default_password_lifetime 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 65535]
  • 该变量用于设置全局自动密码过期策略,默认值为 0,即禁用全局自动密码过期。如果设置该变量的值为正整数 N,则表示允许的密码生存期为 N,即必须在 N 天之内更改密码。

default_week_format

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 7]
  • 设置 WEEK() 函数使用的周格式。

disconnect_on_expired_password 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 类型:布尔型
  • 默认值:ON
  • 该变量是一个只读变量,用来显示 TiDB 是否会直接断开密码已过期用户的连接。当其值为 ON,表示 TiDB 会断开密码已过期用户的连接。当其值为 OFF,表示 TiDB 会将密码已过期用户的连接置于“沙盒模式”,允许该用户建立连接并执行密码重置操作。
  • 如果需要改变 TiDB 对密码已过期用户连接的处理方式,请在 TiDB 配置文件中的 [security] 部分修改 disconnect-on-expired-password 选项。

error_count

  • 作用域:SESSION
  • 默认值:0
  • 类型:整数型
  • 表示上一条生成消息的 SQL 语句中的错误数。该变量为只读变量。

foreign_key_checks

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 为保持兼容,TiDB 对外键检查返回 OFF。

group_concat_max_len

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:1024
  • 取值范围:[4, 18446744073709551615]
  • 表示 GROUP_CONCAT() 函数中,项目的最大缓冲区大小。

have_openssl

  • 作用域:NONE
  • 类型:布尔型
  • 默认值:DISABLED
  • 用于 MySQL 兼容性的只读变量。当服务器启用 TLS 时,服务器将其设置为 YES。

have_ssl

  • 作用域:NONE
  • 类型:布尔型
  • 默认值:DISABLED
  • 用于 MySQL 兼容性的只读变量。当服务器启用 TLS 时,服务器将其设置为 YES。

hostname

  • 作用域:NONE
  • 默认值:(系统主机名)
  • 这个变量一个只读变量,表示 TiDB server 的主机名。

identity 从 v5.3.0 版本开始引入

init_connect

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:””
  • 用户首次连接到 TiDB 服务器时,init_connect 特性允许 TiDB 自动执行一条或多条 SQL 语句。如果你有 CONNECTION_ADMIN 或者 SUPER 权限,这些 SQL 语句将不会被自动执行。如果这些语句执行报错,你的用户连接将被终止。

innodb_lock_wait_timeout

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:50
  • 范围:[1, 3600]
  • 单位:秒
  • 悲观事务语句等锁时间。

interactive_timeout

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:28800
  • 范围:[1, 31536000]
  • 单位:秒
  • 该变量表示交互式用户会话的空闲超时。交互式用户会话是指使用 CLIENT_INTERACTIVE 选项调用 mysql_real_connect() API 建立的会话(例如:MySQL shell 和 MySQL client)。该变量与 MySQL 完全兼容。

last_insert_id 从 v5.3.0 版本开始引入

  • 作用域:SESSION
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 9223372036854775807]
  • 返回由 INSERT 语句产生的最新 AUTO_INSCRENT 或者 AUTO_RANDOM 值,与 LAST_INSERT_ID() 的返回的结果相同。与 MySQL 中的 last_insert_id 一致。

last_plan_from_binding 从 v4.0 版本开始引入

  • 作用域:SESSION
  • 默认值:OFF
  • 该变量用来显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。

last_plan_from_cache 从 v4.0 版本开始引入

  • 作用域:SESSION
  • 默认值:OFF
  • 这个变量用来显示上一个 execute 语句所使用的执行计划是不是直接从 plan cache 中取出来的。

last_sql_use_alloc 从 v6.4.0 版本开始引入

  • 作用域:SESSION
  • 默认值:OFF
  • 这个变量是一个只读变量,用来显示上一个语句是否使用了缓存的 Chunk 对象 (Chunk allocation)。

license

  • 作用域:NONE
  • 默认值:Apache License 2.0
  • 这个变量表示 TiDB 服务器的安装许可证。

log_bin

  • 作用域:NONE
  • 类型:布尔型
  • 默认值:OFF
  • 该变量表示是否使用 TiDB Binlog。

max_connections

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 100000]
  • 该变量表示 TiDB 中同时允许的最大客户端连接数,用于资源控制。
  • 默认情况下,该变量值为 0 表示不限制客户端连接数。当本变量的值大于 0 且客户端连接数到达此值时,TiDB 服务端将会拒绝新的客户端连接。

max_execution_time

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:0
  • 范围:[0, 2147483647]
  • 单位:毫秒
  • 语句最长执行时间。默认值 (0) 表示无限制。

系统变量 - 图3

注意

  • max_execution_time 目前对所有类型的语句生效,并非只对 SELECT 语句生效,与 MySQL 不同(只对SELECT 语句生效)。实际精度在 100ms 级别,而非更准确的毫秒级别。
  • 对于使用了 MAX_EXECUTION_TIME Hint 的 SQL 语句,这些语句的最长执行时间将不受该变量限制,而是由该 Hint 进行限制。你也可以使用该 Hint 来创建 SQL 绑定,详情请参考 SQL 操作常见问题。

max_prepared_stmt_count

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:-1
  • 范围:[-1, 1048576]
  • 指定当前实例中 PREPARE 语句的最大数量。
  • 值为 -1 时表示不对实例中的 PREPARE 语句数量进行限制。
  • 如果将变量值设为超过上限 1048576,则使用上限值 1048576:
1. mysql> SET GLOBAL max_prepared_stmt_count = 1048577;
2. Query OK, 0 rows affected, 1 warning (0.01 sec)

4. mysql> SHOW WARNINGS;
5. +---------+------+--------------------------------------------------------------+
6. | Level   | Code | Message                                                      |
7. +---------+------+--------------------------------------------------------------+
8. | Warning | 1292 | Truncated incorrect max_prepared_stmt_count value: '1048577' |
9. +---------+------+--------------------------------------------------------------+
10. 1 row in set (0.00 sec)

12. mysql> SHOW GLOBAL VARIABLES LIKE 'max_prepared_stmt_count';
13. +-------------------------+---------+
14. | Variable_name           | Value   |
15. +-------------------------+---------+
16. | max_prepared_stmt_count | 1048576 |
17. +-------------------------+---------+
18. 1 row in set (0.00 sec)

max_allowed_packet 从 v6.1.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:67108864
  • 取值范围:[1024, 1073741824]
  • 该变量取值应为 1024 的整数倍。若取值无法被 1024 整除,则会提示 warning 并向下取整。例如设置为 1025 时,则 TiDB 中的实际取值为 1024。
  • 服务器端和客户端在一次传送数据包的过程中所允许最大的数据包大小,单位为字节。
  • 该变量的行为与 MySQL 兼容。

password_history 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 4294967295]
  • 该变量用于建立密码重用策略,使 TiDB 基于密码更改次数限制密码的重复使用。该变量默认值为 0,表示禁用基于密码更改次数的密码重用策略。当设置该变量为一个正整数 N 时,表示不允许重复使用最近 N 次使用过的密码。

password_reuse_interval 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:0
  • 范围:[0, 4294967295]
  • 该变量用于建立密码重用策略,使 TiDB 基于经过时间限制密码重复使用。该变量默认值为 0,表示禁用基于密码经过时间的密码重用策略。当设置该变量为一个正整数 N 时,表示不允许重复使用最近 N 天内使用过的密码。

plugin_dir

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:””
  • 指定加载插件的目录。

plugin_load

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:””
  • 指定 TiDB 启动时加载的插件,多个插件之间用逗号(,)分隔。

port

  • 作用域:NONE
  • 默认值:4000
  • 范围:[0, 65535]
  • 使用 MySQL 协议时 tidb-server 监听的端口。

rand_seed1

  • 作用域:SESSION
  • 默认值:0
  • 范围:[0, 2147483647]
  • 该变量用于为 SQL 函数 RAND() 中使用的随机值生成器添加种子。
  • 该变量的行为与 MySQL 兼容。

rand_seed2

  • 作用域:SESSION
  • 默认值:0
  • 范围:[0, 2147483647]
  • 该变量用于为 SQL 函数 RAND() 中使用的随机值生成器添加种子。
  • 该变量的行为与 MySQL 兼容。

require_secure_transport 从 v6.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 该变量控制是否所有 TiDB 的连接都在本地 socket 上进行通信,或使用 TLS。详情见为 TiDB 客户端服务端间通信开启加密传输。
  • 该变量设置为 ON 时,必须使用开启 TLS 的会话连接到 TiDB,防止在 TLS 配置不正确时出现锁定的情况。
  • 在 v6.1.0 之前这个开关通过 TiDB 配置文件 (security.require-secure-transport) 进行配置,升级到 v6.1.0 时会自动继承原有设置。

skip_name_resolve 从 v5.2.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 该变量控制 tidb-server 实例是否将主机名作为连接握手的一部分来解析。
  • 当 DNS 不可靠时,可以启用该变量来提高网络性能。

系统变量 - 图4

注意

当 skip_name_resolve 设置为 ON 时,身份信息中包含主机名的用户将无法登录服务器。例如:

1. CREATE USER 'appuser'@'apphost' IDENTIFIED BY 'app-password';

该示例中,建议将 apphost 替换为 IP 地址或通配符(%)。

socket

  • 作用域:NONE
  • 默认值:””
  • 使用 MySQL 协议时,tidb-server 所监听的本地 unix 套接字文件。

sql_log_bin

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • 表示是否将更改写入 TiDB Binlog。

系统变量 - 图5

注意

不建议将 sql_log_bin 设置为全局变量,因为 TiDB 的未来版本可能只允许将其设置为会话变量。

sql_mode

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • 这个变量控制许多 MySQL 兼容行为。详情见 SQL 模式。

sql_require_primary_key 从 v6.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制表是否必须有主键。启用该变量后,如果在没有主键的情况下创建或修改表,将返回错误。
  • 该功能基于 MySQL 8.0 的特性 sql_require_primary_key。
  • 强烈推荐在使用 TiCDC 时启用改变量,因为同步数据变更至 MySQL sink 时要求表必须有主键。

sql_select_limit 从 v4.0.2 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:18446744073709551615
  • 范围:[0, 18446744073709551615]
  • 单位:行
  • SELECT 语句返回的最大行数。

ssl_ca

  • 作用域:NONE
  • 默认值:””
  • 证书颁发机构 (CA) 文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-ca 定义。

ssl_cert

  • 作用域:NONE
  • 默认值:””
  • 用于 SSL/TLS 连接的证书文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-cert 定义。

ssl_key

  • 作用域:NONE
  • 默认值:””
  • 用于 SSL/TLS 连接的私钥文件的位置。若文件不存在,则变量值为空。该变量的值由 TiDB 配置项 ssl-key 定义。

system_time_zone

  • 作用域:NONE
  • 默认值:(随系统)
  • 该变量显示首次引导启动 TiDB 时的系统时区。另请参阅 time_zone。

tidb_adaptive_closest_read_threshold 从 v6.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:4096
  • 取值范围:[0, 9223372036854775807]
  • 单位:字节
  • 这个变量用于控制当 replica-read 设置为 closest-adaptive 时,优先将读请求发送至 TiDB server 所在区域副本的阈值。当读请求预估的返回结果的大小超过此阈值时,TiDB 会将读请求优先发送至同一可用区的副本,否则会发送至 leader 副本。

tidb_allow_batch_cop 从 v4.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:1
  • 范围:[0, 2]
  • 这个变量用于控制 TiDB 向 TiFlash 发送 coprocessor 请求的方式,有以下几种取值:

  • 0:从不批量发送请求

  • 1:aggregation 和 join 的请求会进行批量发送
  • 2:所有的 cop 请求都会批量发送

tidb_allow_fallback_to_tikv 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:””
  • 这个变量表示将 TiKV 作为备用存储引擎的存储引擎列表。当该列表中的存储引擎发生故障导致 SQL 语句执行失败时,TiDB 会使用 TiKV 作为存储引擎再次执行该 SQL 语句。目前支持设置该变量为 “” 或者 “tiflash”。如果设置该变量为 “tiflash”,当 TiFlash 返回超时错误(对应的错误码为 ErrTiFlashServerTimeout)时,TiDB 会使用 TiKV 作为存储引擎再次执行该 SQL 语句。

tidb_allow_function_for_expression_index 从 v5.2.0 版本开始引入

  • 作用域:NONE
  • 默认值:json_array、json_array_append、json_array_insert、json_contains、json_contains_path、json_depth、json_extract、json_insert、json_keys、json_length、json_merge_patch、json_merge_preserve、json_object、json_pretty、json_quote、json_remove、json_replace、json_search、json_set、json_storage_size、json_type、json_unquote、json_valid、lower、md5、reverse、tidb_shard、upper、vitess_hash
  • 这个变量用于显示创建表达式索引所允许使用的函数。

tidb_allow_mpp 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用于控制是否使用 TiFlash 的 MPP 模式执行查询,可以设置的值包括:
  • 0 或 OFF,代表从不使用 MPP 模式
  • 1 或 ON,代表由优化器根据代价估算选择是否使用 MPP 模式(默认)

MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。MPP 模式选择的详细说明参见控制是否选择 MPP 模式。

tidb_allow_remove_auto_inc 从 v2.1.18 和 v3.0.4 版本开始引入

  • 作用域:SESSION
  • 默认值:OFF
  • 这个变量用来控制是否允许通过 ALTER TABLE MODIFY 或 ALTER TABLE CHANGE 来移除某个列的 AUTO_INCREMENT 属性。默认 (OFF) 为不允许。

tidb_analyze_partition_concurrency

系统变量 - 图6

警告

当前版本中该变量控制的功能尚未完全生效,请保留默认值。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:1
  • 这个变量用于 TiDB analyze 分区表时,对分区表统计信息进行读写的并发度。

tidb_analyze_version 从 v5.1.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:2
  • 范围:[1, 2]
  • 这个变量用于控制 TiDB 收集统计信息的行为。
  • 在 v5.3.0 及之后的版本中,该变量的默认值为 2,具体可参照统计信息简介文档。如果从 v5.3.0 之前版本的集群升级至 v5.3.0 及之后的版本,tidb_analyze_version 的默认值不发生变化。

tidb_auto_analyze_end_time

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:23:59 +0000
  • 这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的结束时间。例如,只允许在 UTC 时间的凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:

  • tidb_auto_analyze_start_time='01:00 +0000'

  • tidb_auto_analyze_end_time='03:00 +0000'

tidb_auto_analyze_partition_batch_size 从 v6.4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:1
  • 范围:[1, 1024]
  • 用于设置 TiDB 自动 analyze 分区表(即自动收集分区表上的统计信息)时,每次同时 analyze 分区的个数。
  • 若该变量值小于分区表的分区数,则 TiDB 会分多批自动 analyze 该分区表的所有分区。若该变量值大于等于分区表的分区数,则 TiDB 会同时 analyze 该分区表的所有分区。
  • 若分区表个数远大于该变量值,且自动 analyze 花费时间较长,可调大该参数的值以减少耗时。

tidb_auto_analyze_ratio

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:0.5
  • 这个变量用来设置 TiDB 在后台自动执行 ANALYZE TABLE 更新统计信息的阈值。0.5 指的是当表中超过 50% 的行被修改时,触发自动 ANALYZE 更新。可以指定 tidb_auto_analyze_start_time 和 tidb_auto_analyze_end_time 来限制自动 ANALYZE 的时间

系统变量 - 图7

注意

当系统变量 tidb_enable_auto_analyze 设置为 ON 时,TiDB 才会触发 auto_analyze。

tidb_auto_analyze_start_time

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:00:00 +0000
  • 这个变量用来设置一天中允许自动 ANALYZE 更新统计信息的开始时间。例如,只允许在 UTC 时间的凌晨 1:00 至 3:00 之间自动更新统计信息,可以设置如下:

  • tidb_auto_analyze_start_time='01:00 +0000'

  • tidb_auto_analyze_end_time='03:00 +0000'

tidb_auto_build_stats_concurrency 从 v6.5.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:1
  • 范围:[1, 256]
  • 这个变量用来设置执行统计信息自动更新的并发度。

tidb_backoff_lock_fast

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:10
  • 范围:[1, 2147483647]
  • 这个变量用来设置读请求遇到锁的 backoff 时间。

tidb_backoff_weight

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:2
  • 范围:[0, 2147483647]
  • 这个变量用来给 TiDB 的 backoff 最大时间增加权重,即内部遇到网络或其他组件 (TiKV, PD) 故障时,发送重试请求的最大重试时间。可以通过这个变量来调整最大重试时间,最小值为 1。

例如,TiDB 向 PD 取 TSO 的基础超时时间是 15 秒,当 tidb_backoff_weight = 2 时,取 TSO 的最大超时时间为:基础时间 * 2 等于 30 秒。

在网络环境较差的情况下,适当增大该变量值可以有效缓解因为超时而向应用端报错的情况;而如果应用端希望更快地接到报错信息,则应该尽量减小该变量的值。

tidb_batch_commit

系统变量 - 图8

警告

不建议开启此变量。

  • 作用域:SESSION
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-commit 特性。当该变量开启时,事务可能会通过分组一些语句被拆分为多个事务,并被非原子地提交。不推荐使用这种方式。

tidb_batch_delete

系统变量 - 图9

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:SESSION
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-dml 特性中的 batch-delete 特性。当该变量开启时,DELETE 语句可能会被拆分为多个事务,并被非原子地提交。要使该特性生效,还需要开启 tidb_enable_batch_dml 并将 tidb_dml_batch_size 的值设置为正数。不推荐使用这种方式。

tidb_batch_insert

系统变量 - 图10

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:SESSION
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用已废弃的 batch-dml 特性中的 batch-insert 特性。当该变量开启时,INSERT 语句可能会被拆分为多个事务,并被非原子地提交。要使该特性生效,还需要开启 tidb_enable_batch_dml 并将 tidb_dml_batch_size 的值设置为正数。不推荐使用这种方式。

tidb_batch_pending_tiflash_count 从 v6.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:4000
  • 范围:[0, 4294967295]
  • 使用 ALTER DATABASE SET TIFLASH REPLICA 语句为 TiFlash 添加副本时,能容许的不可用表的个数上限。如果超过该上限,则会停止或者以非常慢的速度为库中的剩余表设置 TiFlash 副本。

tidb_broadcast_join_threshold_count 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:10240
  • 范围:[0, 9223372036854775807]
  • 单位:行
  • 如果 join 的对象为子查询,优化器无法估计子查询结果集大小,在这种情况下通过结果集行数判断。如果子查询的行数估计值小于该变量,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。

tidb_broadcast_join_threshold_size 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:104857600 (100 MiB)
  • 范围:[0, 9223372036854775807]
  • 单位:字节
  • 如果表大小(字节数)小于该值,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。

tidb_build_stats_concurrency

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 单位:线程
  • 默认值:4
  • 取值范围:[1, 256]
  • 这个变量用来设置 ANALYZE 语句执行时并发度。
  • 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_capture_plan_baselines 从 v4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用于控制是否开启自动捕获绑定功能。该功能依赖 Statement Summary,因此在使用自动绑定之前需打开 Statement Summary 开关。
  • 开启该功能后会定期遍历一次 Statement Summary 中的历史 SQL 语句,并为至少出现两次的 SQL 语句自动创建绑定。

tidb_cdc_write_source 从 v6.5.0 版本开始引入

  • 作用域:SESSION
  • 是否持久化到集群:否
  • 类型:整数型
  • 默认值: 0
  • 范围:[0, 15]
  • 当变量非 0 时,该 SESSION 写入的数据将被视为是由 TiCDC 写入的。这个变量仅由 TiCDC 设置,任何时候都不应该手动调整该变量。

tidb_check_mb4_value_in_utf8

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:ON
  • 设置该变量为 ON 可强制只存储基本多文种平面 (BMP) 编码区段内的 utf8 字符值。若要存储 BMP 区段外的 utf8 值,推荐使用 utf8mb4 字符集。
  • 早期版本的 TiDB 中 (v2.1.x),utf8 检查更为宽松。如果你的 TiDB 集群是从早期版本升级的,推荐关闭该变量,详情参阅升级与升级后常见问题。

tidb_committer_concurrency 从 v6.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:128
  • 范围:[1, 10000]
  • 在单个事务的提交阶段,用于执行提交操作相关请求的 goroutine 数量。
  • 若提交的事务过大,事务提交时的流控队列等待耗时可能会过长。此时,可以通过调大该配置项来加速提交。
  • 在 v6.1.0 之前这个开关通过 TiDB 配置文件 (performance.committer-concurrency) 进行配置,升级到 v6.1.0 时会自动继承原有设置。

tidb_checksum_table_concurrency

  • 作用域:SESSION
  • 类型:整数型
  • 默认值:4
  • 取值范围:[1, 256]
  • 单位:线程
  • 这个变量用来设置 ADMIN CHECKSUM TABLE 语句执行时扫描索引的并发度。当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。

tidb_config

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:””
  • 这个变量是一个只读变量,用来获取当前 TiDB Server 的配置信息。

tidb_constraint_check_in_place

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 该变量仅适用于乐观事务模型。悲观事务模式中的行为由 tidb_constraint_check_in_place_pessimistic 控制。
  • 当这个变量设置为 OFF 时,唯一索引的重复值检查会被推迟到事务提交时才进行。这有助于提高性能,但对于某些应用,可能导致非预期的行为。详情见约束。

  • 乐观事务模型下将 tidb_constraint_check_in_place 设置为 OFF:

    1. create table t (i int key); 2. insert into t values (1); 3. begin optimistic; 4. insert into t values (1);

    1. Query OK, 1 row affected

    1. tidb> commit; -- 事务提交时才检查

    1. ERROR 1062 : Duplicate entry '1' for key 't.PRIMARY' - 乐观事务模型下将 tidb_constraint_check_in_place 设置为 ON:

    1. set @@tidb_constraint_check_in_place=ON; 2. begin optimistic; 3. insert into t values (1);

    1. ERROR 1062 : Duplicate entry '1' for key 't.PRIMARY'

tidb_constraint_check_in_place_pessimistic 从 v6.3.0 版本开始引入

  • 作用域:SESSION
  • 类型:布尔型
  • 默认值:当配置项 pessimistic-txn.constraint-check-in-place-pessimistic 为默认值 true 时,该变量的默认值为 ON。当配置项 pessimistic-txn.constraint-check-in-place-pessimistic 为 false 时,该变量的默认值为 OFF。
  • 该变量仅适用于悲观事务模型。乐观事务模式中的行为由 tidb_constraint_check_in_place 控制。
  • 当这个变量设置为 OFF 时,唯一约束检查会被推迟到下一次需要对这个索引加锁的语句执行时,或事务提交时才进行。这有助于提高性能,但对于某些应用,可能导致非预期的行为。详情见约束。
  • 关闭该变量可能会导致悲观事务中返回 LazyUniquenessCheckFailure 报错。返回该错误时,TiDB 将会回滚当前事务。
  • 关闭该变量后,悲观事务中不支持使用 SAVEPOINT 功能。
  • 关闭该变量时,commit 语句可能会报出 Write conflict 错误或 Duplicate entry 错误,两种错误都意味着事务回滚。

  • 悲观事务模型下将 tidb_constraint_check_in_place_pessimistic 设置为 OFF:

    1. set @@tidb_constraint_check_in_place_pessimistic=OFF; 2. create table t (i int key); 3. insert into t values (1); 4. begin pessimistic; 5. insert into t values (1);

    1. Query OK, 1 row affected

    1. tidb> commit; -- 事务提交时才检查

    1. ERROR 1062 : Duplicate entry '1' for key 't.PRIMARY' - 悲观事务模型下将 tidb_constraint_check_in_place_pessimistic 设置为 ON:

    1. set @@tidb_constraint_check_in_place_pessimistic=ON; 2. begin pessimistic; 3. insert into t values (1);

    1. ERROR 1062 : Duplicate entry '1' for key 't.PRIMARY'

tidb_cost_model_version 从 v6.2.0 版本开始引入

系统变量 - 图11

注意

  • 自 v6.5.0 开始,新创建的 TiDB 集群默认使用 Cost Model Version 2。如果从 v6.4.0 及之前版本的集群升级到 v6.5.0 及之后的版本,tidb_cost_model_version 的值不发生变化。
  • 切换代价模型版本可能会引起查询计划的变动。
  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:2
  • 取值范围:[1, 2]
  • 可选值:
  • 1:使用 Cost Model Version 1 代价模型。TiDB v6.4.0 及之前的版本默认使用 Cost Model Version 1。
  • 2:使用 Cost Model Version 2 代价模型。TiDB v6.5.0 正式发布了代价模型 Cost Model Version 2,在内部测试中比 Version 1 版本的代价模型更加准确。
  • 代价模型会影响优化器对计划的选择,具体可见代价模型。

tidb_current_ts

  • 作用域:SESSION
  • 类型:整数型
  • 默认值:0
  • 取值范围:[0, 9223372036854775807]
  • 这个变量是一个只读变量,用来获取当前事务的时间戳。

tidb_ddl_disk_quota 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:107374182400 (100 GiB)
  • 范围:[107374182400, 1125899906842624] ([100 GiB, 1 PiB])
  • 单位:字节
  • 这个变量仅在 tidb_ddl_enable_fast_reorg 开启的情况下生效,用于设置创建索引的回填过程中本地存储空间的使用限制。

tidb_ddl_enable_fast_reorg 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用来控制是否开启添加索引加速功能,来提升创建索引回填过程的速度。开启该变量对于数据量较大的表有一定的性能提升。
  • 要验证已经完成的 ADD INDEX 操作是否使用了添加索引加速功能,可以执行 ADMIN SHOW DDL JOBS 语句查看 JOB_TYPE 一列中是否含有 ingest 字样。

系统变量 - 图12

警告

当前索引加速功能未完全兼容添加唯一索引操作。在添加唯一索引时,建议关闭索引加速功能(将 tidb_ddl_enable_fast_reorg 设置为 OFF)。

当关闭 PITR (Point-in-time recovery) 时使用索引加速功能,添加索引的速度预期是 v6.1.0 的 10 倍。但是同时开启 PITR 和索引加速时,不会有性能提升。为了优化性能,建议你先停止 PITR 后台备份任务,以索引加速的方式快速添加索引,然后再启动 PITR 备份任务。否则,可能会发生以下行为:

  • 如果先启动 PITR 备份任务,再添加索引,此时即使索引加速功能打开,添加索引任务默认会自动回退到旧模式,即以较慢的速度添加索引,但 PITR 的备份任务能够正常运行并备份新增的索引数据。
  • 如果先启动添加索引加速任务,再尝试启动 PITR 备份任务,此时 PITR 备份任务会抛出错误并退出,但这不会影响正在添加索引的任务。在索引加速任务完成后,你需要重新启动 PITR 日志备份任务,并手动执行一次全量备份。
  • 如果同时启动 PITR 备份任务和添加索引加速任务,可能会由于两个任务无法察觉到对方而导致 PITR 不能成功备份新增的索引数据。在添加索引任务完成后,你仍需要重新启动 PITR 日志备份任务,并手动执行一次全量备份。

tidb_ddl_error_count_limit

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:512
  • 范围:[0, 9223372036854775807]
  • 这个变量用来控制 DDL 操作失败重试的次数。失败重试次数超过该参数的值后,会取消出错的 DDL 操作。

tidb_ddl_flashback_concurrency 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:64
  • 范围:[1, 256]
  • 这个变量用来控制 FLASHBACK CLUSTER TO TIMESTAMP 的并发数。

tidb_ddl_reorg_batch_size

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:256
  • 范围:[32, 10240]
  • 单位:行
  • 这个变量用来设置 DDL 操作 re-organize 阶段的 batch size。比如 ADD INDEX 操作,需要回填索引数据,通过并发 tidb_ddl_reorg_worker_cnt 个 worker 一起回填数据,每个 worker 以 batch 为单位进行回填。

  • 如果 ADD INDEX 操作时有较多 UPDATE 操作或者 REPLACE 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32。

  • 在没有事务冲突的情况下,batch size 可设为较大值(需要参考 worker 数量,见线上负载与 ADD INDEX 相互影响测试),这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。

tidb_ddl_reorg_priority

  • 作用域:SESSION
  • 类型:枚举型
  • 默认值:PRIORITY_LOW
  • 可选值:PRIORITY_LOW、PRIORITY_NORMAL、PRIORITY_HIGH
  • 这个变量用来设置 ADD INDEX 操作 re-organize 阶段的执行优先级,可设置为 PRIORITY_LOW/PRIORITY_NORMAL/PRIORITY_HIGH。

tidb_ddl_reorg_worker_cnt

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:4
  • 范围:[1, 256]
  • 单位:线程
  • 这个变量用来设置 DDL 操作 re-organize 阶段的并发度。

tidb_default_string_match_selectivity 从 v6.2.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:浮点型
  • 默认值:0.8
  • 范围:[0, 1]
  • 这个变量用来设置过滤条件中的 like、rlike、regexp 函数在行数估算时的默认选择率,以及是否对这些函数启用 TopN 辅助估算。
  • TiDB 总是会尝试利用统计信息对过滤条件中的 like 进行估算,但是当 like 匹配的字符串太复杂时,或者面对 rlike 或 regexp 时,往往无法充分利用统计信息,转而使用 0.8 作为选择率,造成行数估算的误差较大。
  • 该变量可以用于修改这个行为,当变量被设为 0 以外的值时,会使用变量的值而不是默认的 0.8 作为选择率。
  • 如果将该变量的值设为 0,TiDB 在对上述三个函数进行行数估算时,会尝试利用统计信息中的 TopN 进行求值来提高估算精度,同时也会考虑统计信息中的 NULL 数。求值操作预计会造成少量性能损耗。这个功能生效的前提是统计信息是在 tidb_analyze_version 设为 2 时收集的。
  • 当该变量的值被设为默认值以外的值的时候,会对 not like、not rlike、not regexp 的行数估算也进行相应的调整。

tidb_disable_txn_auto_retry

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用来设置是否禁用显式的乐观事务自动重试,设置为 ON 时,不会自动重试,如果遇到事务冲突需要在应用层重试。

如果将该变量的值设为 OFF,TiDB 将会自动重试事务,这样在事务提交时遇到的错误更少。需要注意的是,这样可能会导致数据更新丢失。

这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 tidb_retry_limit 的值来决定最大重试次数。

关于是否需要禁用自动重试,请参考重试的局限性。

该变量只适用于乐观事务,不适用于悲观事务。悲观事务的重试次数由 max_retry_count 控制。

tidb_distsql_scan_concurrency

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:15
  • 范围:[1, 256]
  • 单位:线程
  • 这个变量用来设置 scan 操作的并发度。
  • AP 类应用适合较大的值,TP 类应用适合较小的值。对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
  • 若表的分区较多可以适当调小该参数(取决于扫描数据量的大小以及扫描频率),避免 TiKV 内存溢出 (OOM)。

tidb_dml_batch_size

系统变量 - 图13

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:0
  • 范围:[0, 2147483647]
  • 单位:行
  • 这个变量的值大于 0 时,TiDB 会将 INSERT 或 LOAD DATA 等语句在更小的事务中批量提交。这样可减少内存使用,确保大批量修改时事务大小不会达到 txn-total-size-limit 限制。
  • 只有变量值为 0 时才符合 ACID 要求。否则无法保证 TiDB 的原子性和隔离性要求。
  • 要使该特性生效,还需要开启 tidb_enable_batch_dml,以及至少开启 tidb_batch_insert 和 tidb_batch_delete 中的一个。

tidb_enable_1pc 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 指定是否在只涉及一个 Region 的事务上启用一阶段提交特性。比起传统两阶段提交,一阶段提交能大幅降低事务提交延迟并提升吞吐。

系统变量 - 图14

注意

  • 对于新创建的集群,默认值为 ON。对于升级版本的集群,如果升级前是 v5.0 以下版本,升级后默认值为 OFF。
  • 启用 TiDB Binlog 后,开启该选项无法获得性能提升。要获得性能提升,建议使用 TiCDC 替代 TiDB Binlog。
  • 启用该参数仅意味着一阶段提交成为可选的事务提交模式,实际由 TiDB 自行判断选择最合适的提交模式进行事务提交。

tidb_enable_amend_pessimistic_txn 从 v4.0.7 版本开始引入

系统变量 - 图15

警告

该变量从 v6.5.0 开始废弃,并计划将从 v6.6.0 移除。TiDB 默认使用元数据锁机制解决 Information schema is changed 报错的问题。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用于控制是否开启 AMEND TRANSACTION 特性。在悲观事务模式下开启该特性后,如果该事务相关的表存在并发 DDL 操作和 SCHEMA VERSION 变更,TiDB 会尝试对该事务进行 amend 操作,修正该事务的提交内容,使其和最新的有效 SCHEMA VERSION 保持一致,从而成功提交该事务而不返回 Information schema is changed 报错。该特性对以下并发 DDL 变更生效:

  • ADD COLUMN 或 DROP COLUMN 类型的 DDL 操作。

  • MODIFY COLUMN 或 CHANGE COLUMN 类型的 DDL 操作,且只对增大字段长度的操作生效。
  • ADD INDEX 或 DROP INDEX 类型的 DDL 操作,且操作的索引列须在事务开启之前创建。

系统变量 - 图16

注意

目前该特性可能造成事务语义的变化,且与 TiDB Binlog 存在部分不兼容的场景,可以参考事务语义行为区别和与 TiDB Binlog 兼容问题汇总了解更多关于该特性的使用注意事项。

tidb_enable_analyze_snapshot 从 v6.2.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 该变量控制 ANALYZE 读取历史时刻的数据还是读取最新的数据。当该变量设置为 ON 时,ANALYZE 读取 ANALYZE 开始时刻的历史数据。当该变量设置为 OFF 时,ANALYZE 读取最新的数据。
  • 在 v5.2 之前,ANALYZE 读取最新的数据。v5.2 至 v6.1 版本 ANALYZE 读取 ANALYZE 开始时刻的历史数据。

系统变量 - 图17

警告

如果 ANALYZE 读取 ANALYZE 开始时刻的历史数据,长时间的 AUTO ANALYZE 可能会因为历史数据被 GC 而出现 GC life time is shorter than transaction duration 的报错。

tidb_enable_async_commit 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 该变量控制是否启用 Async Commit 特性,使事务两阶段提交的第二阶段于后台异步进行。开启本特性能降低事务提交的延迟。

系统变量 - 图18

注意

  • 对于新创建的集群,默认值为 ON。对于升级版本的集群,如果升级前是 v5.0 以下版本,升级后默认值为 OFF。
  • 启用 TiDB Binlog 后,开启该选项无法获得性能提升。要获得性能提升,建议使用 TiCDC 替代 TiDB Binlog。
  • 启用该参数仅意味着 Async Commit 成为可选的事务提交模式,实际由 TiDB 自行判断选择最合适的提交模式进行事务提交。

tidb_enable_auto_analyze 从 v6.1.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 该变量控制 TiDB 是否以后台操作自动更新表的统计信息。
  • 在 v6.1.0 之前这个开关通过 TiDB 配置文件 (performance.run-auto-analyze) 进行配置,升级到 v6.1.0 时会自动继承原有设置。

tidb_enable_auto_increment_in_generated

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用于控制是否允许在创建生成列或者表达式索引时引用自增列。

tidb_enable_batch_dml

系统变量 - 图19

警告

该变量与废弃的 batch-dml 特性相关,可能会导致数据损坏。因此,不建议开启该变量来使用 batch-dml。作为替代,请使用非事务 DML 语句。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 该变量控制是否启用废弃的 batch-dml 特性。启用该变量后,部分语句可能会被拆分为多个事务执行,这是非原子性的,使用时需谨慎。使用 batch-dml 时,必须确保正在操作的数据没有并发操作。要使该变量生效,还需要为 tidb_batch_dml_size 指定一个正值,并启用 tidb_batch_insert 和 tidb_batch_delete 中的至少一个。

tidb_enable_cascades_planner

系统变量 - 图20

警告

目前 cascades planner 为实验特性,不建议在生产环境中使用。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用于控制是否开启 cascades planner。

tidb_enable_chunk_rpc 从 v4.0 版本开始引入

  • 作用域:SESSION
  • 默认值:ON
  • 这个变量用来设置是否启用 Coprocessor 的 Chunk 数据编码格式。

tidb_enable_clustered_index 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 可选值:OFF,ON,INT_ONLY
  • 这个变量用于控制默认情况下表的主键是否使用聚簇索引。“默认情况”即不显式指定 CLUSTERED/NONCLUSTERED 关键字的情况。可设置为 OFF/ON/INT_ONLY。
  • OFF 表示所有主键默认使用非聚簇索引。
  • ON 表示所有主键默认使用聚簇索引。
  • INT_ONLY 此时的行为受配置项 alter-primary-key 控制。如果该配置项取值为 true,则所有主键默认使用非聚簇索引;如果该配置项取值为 false,则由单个整数类型的列构成的主键默认使用聚簇索引,其他类型的主键默认使用非聚簇索引。

tidb_enable_collect_execution_info

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:ON
  • 这个变量用于控制是否同时将各个执行算子的执行信息记录入 slow query log 中。

tidb_enable_column_tracking 从 v5.4.0 版本开始引入

系统变量 - 图21

警告

收集 PREDICATE COLUMNS 的统计信息目前为实验特性,不建议在生产环境中使用。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用于控制是否开启 TiDB 对 PREDICATE COLUMNS 的收集。关闭该变量后,之前收集的 PREDICATE COLUMNS 会被清除。详情见收集部分列的统计信息。

tidb_enable_concurrent_ddl 从 v6.2.0 版本开始引入

系统变量 - 图22

警告

请勿修改该变量值,因为关闭后风险不确定,有可能导致集群元数据出错。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • 这个变量用于控制是否让 TiDB 使用并发 DDL 语句。在开启并发 DDL 语句后,DDL 语句的执行流程有所改变,DDL 语句不容易被其他 DDL 语句阻塞,并且能够同时添加多个索引。

tidb_enable_ddl 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
  • 默认值:ON
  • 可选值:OFF,ON
  • 用于设置该 TiDB 实例是否可以成为 DDL owner。若当前 TiDB 集群中只有一台 TiDB 实例,则不能禁止该实例成为 DDL owner,即不能设置为 OFF。

tidb_enable_enhanced_security

  • 作用域:NONE
  • 默认值:OFF
  • 这个变量表示所连接的 TiDB 服务器是否启用了安全增强模式 (SEM)。若要改变该变量值,你需要在 TiDB 服务器的配置文件中修改 enable-sem 项的值,并重启 TiDB 服务器。
  • 安全增强模式受安全增强式 Linux 等系统设计的启发,削减拥有 MySQL SUPER 权限的用户能力,转而使用细粒度的 RESTRICTED 权限作为替代。这些细粒度的 RESTRICTED 权限如下:
  • RESTRICTED_TABLES_ADMIN:能够写入 mysql 库中的系统表,能查看 information_schema 表上的敏感列。
  • RESTRICTED_STATUS_ADMIN:能够在 SHOW STATUS 命令中查看敏感内容。
  • RESTRICTED_VARIABLES_ADMIN:能够在 SHOW [GLOBAL] VARIABLES 和 SET 命令中查看和设置包含敏感内容的变量。
  • RESTRICTED_USER_ADMIN:能够阻止其他用户更改或删除用户帐户。
  • RESTRICTED_CONNECTION_ADMIN:能够阻止其它用户使用 KILL 语句终止连接。

tidb_enable_external_ts_read 从 v6.4.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 当此变量设置为 ON 时,TiDB 会读取 tidb_external_ts 指定时间戳前的历史数据。

tidb_external_ts 从 v6.4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:整数型
  • 默认值:0
  • 当 tidb_enable_external_ts_read 设置为 ON 时,TiDB 会依据该变量指定的时间戳读取历史数据。

tidb_restricted_read_only 从 v5.2.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 可选值:OFF 和 ON
  • tidb_restricted_read_only和 tidb_super_read_only 的作用相似。在大多数情况下,你只需要使用 tidb_super_read_only 即可。
  • 拥有 SUPER 或 SYSTEM_VARIABLES_ADMIN 权限的用户可以修改该变量。如果 TiDB 开启了安全增强模式,你还需要额外的 RESTRICTED_VARIABLES_ADMIN 权限才能读取或修改该变量。
  • tidb_restricted_read_only 的设置将影响 tidb_super_read_only 的值:

  • 当设置 tidb_restricted_read_only 为 ON 时,tidb_super_read_only 的将自动被设置为 ON。

  • 当设置 tidb_restricted_read_only 为 OFF 时,tidb_super_read_only 的值将不受影响。
  • 当 tidb_restricted_read_only 为 ON 时,tidb_super_read_only 的值无法设置为 OFF。
  • 对于 TiDB 的 DBaaS 供应商,当 TiDB 为另一个数据库的下游数据库时,如果要将整个 TiDB 集群设置为只读模式,你需要开启安全增强模式 并将 tidb_restricted_read_only 设置为 ON,从而防止你的用户通过 tidb_super_read_only 将 TiDB 集群设置为可写。实现方法:首先开启安全增强模式,然后由你(作为 DBaaS 的控制面)使用一个 admin 用户控制 tidb_restricted_read_only(需要拥有 SYSTEM_VARIABLES_ADMIN 和 RESTRICTED_VARIABLES_ADMIN 权限),由你的数据库用户使用 root 用户控制 tidb_super_read_only(需要拥有 SUPER 权限)。
  • 该变量可以控制整个集群的只读状态。开启后(即该值为 ON),整个集群中的 TiDB 服务器都将进入只读状态,只有 SELECT、USE、SHOW 等不会修改数据的语句才能被执行,其他如 INSERT、UPDATE 等语句会被拒绝执行。
  • 该变量开启只读模式只保证整个集群最终进入只读模式,当变量修改状态还没被同步到其他 TiDB 服务器时,尚未同步的 TiDB 仍然停留在非只读模式。
  • 在执行 SQL 语句之前,TiDB 会检查集群的只读标志。从 v6.2.0 起,在提交 SQL 语句之前,TiDB 也会检查该标志,从而防止在服务器被置于只读模式后某些长期运行的 auto commit 语句可能修改数据的情况。
  • 在变量开启时,对于尚未提交的事务:

  • 如果有尚未提交的只读事务,可正常提交该事务。

  • 如果尚未提交的事务为非只读事务,在事务内执行写入的 SQL 语句会被拒绝。
  • 如果尚未提交的事务已经有数据改动,其提交也会被拒绝。
  • 当集群开启只读模式后,所有用户(包括 SUPER 用户)都无法执行可能写入数据的 SQL 语句,除非该用户被显式地授予了 RESTRICTED_REPLICA_WRITER_ADMIN 权限。

tidb_enable_exchange_partition

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • 该变量用于设置是否启用 exchange partitions with tables 特性。默认值为 ON,即默认开启该功能。
  • 该变量自 v6.3.0 开始废弃,其取值将固定为默认值 ON,即默认开启 exchange partitions with tables。

tidb_enable_extended_stats

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 该变量指定 TiDB 是否收集扩展统计信息来指导优化器。

tidb_enable_fast_analyze

系统变量 - 图23

警告

目前快速分析功能为实验特性,不建议在生产环境中使用。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 这个变量用来控制是否启用统计信息快速分析功能。默认值 0 表示不开启。
  • 快速分析功能开启后,TiDB 会随机采样约 10000 行的数据来构建统计信息。因此在数据分布不均匀或者数据量比较少的情况下,统计信息的准确度会比较低。这可能导致执行计划不优,比如选错索引。如果可以接受普通 ANALYZE 语句的执行时间,则推荐关闭快速分析功能。

tidb_enable_foreign_key 从 v6.3.0 版本开始引入

系统变量 - 图24

警告

当前版本中该变量控制的功能尚未完全生效,请保留默认值。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制是否开启 FOREIGN KEY 特性。

tidb_enable_gc_aware_memory_track

系统变量 - 图25

警告

该变量为 TiDB 内部调试变量,可能会在未来版本中删除,请勿设置该变量。

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制是否开启可感知到垃圾回收的内存追踪 (GC-Aware memory track)。

tidb_enable_general_plan_cache 从 v6.3.0 版本开始引入

系统变量 - 图26

警告

当前版本中该变量控制的功能尚未完全生效,请保留默认值。

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用来控制是否开启 General Plan Cache。

tidb_enable_gogc_tuner 从 v6.4.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • 该变量来用控制是否开启 GOGC Tuner。

tidb_enable_historical_stats

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 该变量用于一个未发布的特性,请勿修改该变量值。

tidb_enable_index_merge 从 v4.0 版本开始引入

系统变量 - 图27

注意

  • 当集群从 v4.0.0 以下版本升级到 v5.4.0 及以上版本时,该变量开关默认关闭,防止升级后计划发生变化导致回退。
  • 当集群从 v4.0.0 及以上版本升级到 v5.4.0 及以上版本时,该变量开关保持升级前的状态。
  • 对于 v5.4.0 及以上版本的新建集群,该变量开关默认开启。
  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用于控制是否开启 index merge 功能。

tidb_enable_index_merge_join

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 表示是否启用 IndexMergeJoin 算子。
  • 该变量为 TiDB 内部变量,不推荐使用,否则可能会造成数据正确性问题。

tidb_enable_legacy_instance_scope 从 v6.0.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用于允许使用 SET SESSION 对 INSTANCE 作用域的变量进行设置,用法同 SET GLOBAL。
  • 为了兼容之前的 TiDB 版本,该变量值默认为 ON。

tidb_enable_list_partition 从 v5.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用来设置是否开启 LIST (COLUMNS) TABLE PARTITION 特性。

tidb_enable_local_txn

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 该变量用于一个未发布的特性,请勿修改该变量值。

tidb_enable_metadata_lock 从 v6.3.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 这个变量用来设置是否开启元数据锁特性。需要注意,在设置该变量时,集群中不能有 DDL 任务,以免造成非预期数据正确性、一致性问题。

tidb_enable_mutation_checker 从 v6.0.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • 这个变量用于设置是否开启 mutation checker。mutation checker 是一项在 DML 语句执行过程中进行的数据索引一致性校验,校验报错会回滚当前语句。开启该校验会导致 CPU 使用轻微上升。详见数据索引一致性报错。
  • 对于新创建的 v6.0.0 及以上的集群,默认值为 ON。对于升级版本的集群,如果升级前是低于 v6.0.0 的版本,升级后默认值为 OFF。

tidb_enable_new_cost_interface 从 v6.2.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:ON
  • TiDB v6.2.0 对代价模型的实现进行了代码层面的重构,这个变量用来控制是否使用重构后的代价模型 Cost Model Version 2。
  • 重构后的代价模型使用完全一样的代价公式,因此不会引起计划选择的变动,此开关默认打开。
  • 从 v6.1 升级至 v6.2 的用户,此开关保持升级前的 OFF 状态,此时建议直接打开;对于从 v6.1 之前版本升级至 v6.2 的用户,此开关默认为 ON。

tidb_enable_new_only_full_group_by_check 从 v6.1.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 该变量用于控制 TiDB 执行 ONLY_FULL_GOUP_BY 检查时的行为。有关 ONLY_FULL_GROUP_BY 的信息可以参考 MySQL 文档。在 v6.1 中 TiDB 对该项检查做了更严格正确的处理。
  • 由于可能存在版本升级造成的兼容性问题,在 v6.1 中该变量默认值是 OFF,即默认关闭。

tidb_enable_noop_functions 从 v4.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 默认值:OFF
  • 默认情况下,用户尝试将某些语法用于尚未实现的功能时,TiDB 会报错。若将该变量值设为 ON,TiDB 则自动忽略此类功能不可用的情况,即不会报错。若用户无法更改 SQL 代码,可考虑将变量值设为 ON。
  • 启用 noop 函数可以控制以下行为:
  • LOCK IN SHARE MODE 语法
  • SQL_CALC_FOUND_ROWS 语法
  • START TRANSACTION READ ONLY 和 SET TRANSACTION READ ONLY 语法
  • tx_read_only、transaction_read_only、offline_mode、super_read_only、read_only 以及 sql_auto_is_null 系统变量
  • GROUP BY <expr> ASC|DESC 语法

系统变量 - 图28

警告

该变量只有在默认值 OFF 时,才算是安全的。因为设置 tidb_enable_noop_functions=1 后,TiDB 会自动忽略某些语法而不报错,这可能会导致应用程序出现异常行为。例如,允许使用语法 START TRANSACTION READ ONLY 时,事务仍会处于读写模式。

tidb_enable_noop_variables 从 v6.2.0 版本开始引入

  • 作用域:GLOBAL
  • 是否持久化到集群:是
  • 默认值:ON
  • 若该变量值为 OFF,TiDB 具有以下行为:
  • 使用 SET 设置 noop 的系统变量时会报 "setting *variable_name* has no effect in TiDB" 的警告。
  • SHOW [SESSION | GLOBAL] VARIABLES 的结果不显示 noop 的系统变量。
  • 使用 SELECT 读取 noop 的系统变量时会报 "variable *variable_name* has no effect in TiDB" 的警告。
  • 你可以通过 SELECT * FROM INFORMATION_SCHEMA.CLIENT_ERRORS_SUMMARY_GLOBAL; 语句来检查 TiDB 实例是否曾设置和读取 noop 系统变量。

tidb_enable_null_aware_anti_join 从 v6.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用于控制 TiDB 对特殊集合算子 NOT IN 和 != ALL 引导的子查询产生的 ANTI JOIN 是否采用 Null Aware Hash Join 的执行方式。

(本文超出站点单文档体积上限,已截断)