# [FAQ] TiDB 中变量作用域的解释

## Key Words

Global, Instance, Session, 变量作用域

## Description

在 TiDB 版本演进中，分别出现基于 Global, Instance, Session 这几个级别的作用域，本文会详细解释这些级别在不同版本中的行为。

## Content

1、在 TiDB 4.0 版本之前，虽然只有两个作用域 Global 和 Session，但实际上有部分变量的作用域是基于 Instance 的

```yaml
tidb_general_log
tidb_pprof_sql_cpu
ddl_slow_threshold
tidb_force_priority
tidb_expensive_query_time_threshold
tidb_max_delta_schema_count
tidb_store_limit
tidb_slow_log_threshold
tidb_record_plan_in_slow_log
tidb_enable_slow_log
tidb_query_log_max_len
tidb_check_mb4_value_in_utf8
tidb_enable_collect_execution_info
```

例如，如果我们在指定某个 tidb-server，设置 session 级别的 `tidb_query_log_max_len` 变量，会发现退出重连 session，该参数的修改还是生效的，而其他的 tidb-server 则不受影响。对应的，重启了该 tidb-server 之后，该变量恢复默认值，很明显它的作用域应该是 Instance 级别的。

2、在 TiDB 4.x 和 5.x 的版本中，为了更好的解释这些变量的作用域，引入了 Instance Level 的概念，详见 [https://docs.pingcap.com/zh/tidb/v5.4/system-variables#%E7%B3%BB%E7%BB%9F%E5%8F%98%E9%87%8F](https://docs.pingcap.com/zh/tidb/v5.4/system-variables#%E7%B3%BB%E7%BB%9F%E5%8F%98%E9%87%8F) 

这里并不存在 `set instance var_name = ''`; 的语法，实际上要设置 Instance level 的变量，还是使用 set var_name 的语法即可。

3、TiDB 6.1 版本开始，取消了 Instance Level 的概念，即仅支持 Global 及 Session 这两个级别。但是考虑到兼容性问题，还是保留了 Instance Level 的行为，可以通过新引入的 [tidb_enable_legacy_instance_scope](https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_enable_legacy_instance_scope-%E4%BB%8E-v600-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 参数进行控制。

## Affected Versions

N/A