Skip to content

MySQL环境变量

1. 查看所有系统变量

可见mysql5.7的参数一共有519个 Alt text 参数很多,支持使用like进行通配符查询

sql
SHOW variables LIKE 'character%';

Alt text

2. mysql系统变量特性

  1. 从作用域上可分为globalsession
  2. 从类型上可分为可修改的和只读系统变量。
  3. 用户可在线修改非只读系统变量。
  4. 修改的系统变量并没有持久化,持久化需要修改my.cnf文件。

3. 查看系统变量

  1. 使用命令: show [global] variables 查看系统变量值。
    查看系统变量long_query_time值: Alt text

4. 修改系统变量

4.1 使用set命令配置系统变量

在mysql客户端中使用set命令:

sql
SET long_query_time=5;

4.2 查看系统变量

在其他客户端连接数据库,查看long_query_time参数值: Alt text 可见设置的系统变量仅对当前连接有效。如果需要全局所有连接都看到最新系统变量值, 需要使用global参数:

sql
SET GLOBAL long_query_time=15;
SHOW GLOBAL variables LIKE 'long_query_time';

Alt text 但是当前会话的值还是没变:
Alt text 另外一个会话退出再登录进来查询: Alt text 目前没有办法使得现有连接中的系统变量强制生效,类似windows的cmd窗口在修改环境变量后需要重新开启。另外还有一些系统变量是不能修改的:
Alt text 往往这些系统变量在启动的时候就被确定了下来。

提示

  1. 修改全局系统变量并没有持久化,MySQL重启后系统变量值会丢失。
  2. 修改只读系统变量的话需要停机修改配置文件。
  1. 查询表session_variables\global_variables查询系统变量
    使用命令去查询系统变量如果遇到字段较多,使用like就不太方便查询了,MySQL提供了内置的系统变量表方便查询:
sql
-- 查询全局变量  
SELECT * FROM performance_schema.GLOBAL_VARIABLES where VARIABLE_NAME ='long_query_time'; 
-- 查询当前自己的会话变量  
SELECT * FROM performance_schema.SESSION_VARIABLES where VARIABLE_NAME ='long_query_time';
  1. 查询所有会话设置系统变量值 如果想知道所有的会话设置了哪些变量参数值,在MySQL5.7中提供了表variables_by_thread:
sql
(root@localhost)[performance_schema]>SELECT * FROM performance_schema.variables_by_thread WHERE VARIABLE_NAME ='long_query_time';
+-----------+-----------------+----------------+
| THREAD_ID | VARIABLE_NAME   | VARIABLE_VALUE |
+-----------+-----------------+----------------+
|        44 | long_query_time | 10.000000      |
|        45 | long_query_time | 10.000000      |
|        46 | long_query_time | 5.000000       |
|        49 | long_query_time | 15.000000      |
+-----------+-----------------+----------------+
4 rows in set (0.00 sec)

4.3 自定义变量

sql
-- 初始化变量
SET @num=1;
-- 赋值
SET @num:=@num+1;
-- 查询@num变量
SELECT @num;

Alt text 同样的MySQL也支持变量对应的表方便查询,使用performance_schema.user_variables_by_thread即可:

sql
(root@localhost)[performance_schema]>SELECT * FROM performance_schema.user_variables_by_thread;
+-----------+---------------+----------------+
| THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE |
+-----------+---------------+----------------+
|        46 | num           | 2              |
+-----------+---------------+----------------+
2 rows in set (0.01 sec)

其中第一列为Thread_Id,它表示MySQL内部线程ID, 下面是查询连接会话的列表,这样就可以确定是那个连接设置的系统变量,但是直接查询线程列表发现两张表的id对不上

sql
(root@localhost)[performance_schema]>SHOW processlist;
+----+------+---------------------+--------------------+---------+-------+----------+------------------+
| Id | User | Host                | db                 | Command | Time  | State    | Info             |
+----+------+---------------------+--------------------+---------+-------+----------+------------------+
| 19 | root | 192.168.101.6:10404 | NULL               | Sleep   | 31699 |          | NULL             |
| 20 | root | 192.168.101.6:10405 | NULL               | Sleep   |   641 |          | NULL             |
| 21 | root | 192.168.101.6:10406 | information_schema | Sleep   |    81 |          | NULL             |
| 24 | root | localhost           | performance_schema | Query   |     0 | starting | SHOW processlist |
+----+------+---------------------+--------------------+---------+-------+----------+------------------+
4 rows in set (0.00 sec)

匹配不上的问题,MySQL提供了表performance_schema.threads表,可以映射上两者的ID:

sql
-- 比如查询THREAD_ID为46的processID
(root@localhost)[performance_schema]>SELECT THREAD_ID , PROCESSLIST_ID  FROM performance_schema.threads WHERE THREAD_ID =46;
+-----------+----------------+
| THREAD_ID | PROCESSLIST_ID |
+-----------+----------------+
|        46 |             21 |
+-----------+----------------+
1 row in set (0.00 sec)

可以知道连接会话的线程ID是21。