MySQL环境变量
1. 查看所有系统变量
可见mysql5.7的参数一共有519个 参数很多,支持使用like进行通配符查询
sql
SHOW variables LIKE 'character%';
2. mysql系统变量特性
- 从作用域上可分为global和session。
- 从类型上可分为可修改的和只读系统变量。
- 用户可在线修改非只读系统变量。
- 修改的系统变量并没有持久化,持久化需要修改my.cnf文件。
3. 查看系统变量
- 使用命令:
show [global] variables
查看系统变量值。
查看系统变量long_query_time值:
4. 修改系统变量
4.1 使用set命令配置系统变量
在mysql客户端中使用set命令:
sql
SET long_query_time=5;
4.2 查看系统变量
在其他客户端连接数据库,查看long_query_time参数值: 可见设置的系统变量仅对当前连接有效。如果需要全局所有连接都看到最新系统变量值, 需要使用global参数:
sql
SET GLOBAL long_query_time=15;
SHOW GLOBAL variables LIKE 'long_query_time';
但是当前会话的值还是没变:
另外一个会话退出再登录进来查询:
目前没有办法使得现有连接中的系统变量强制生效,类似windows的cmd窗口在修改环境变量后需要重新开启。另外还有一些系统变量是不能修改的:
往往这些系统变量在启动的时候就被确定了下来。
提示
- 修改全局系统变量并没有持久化,MySQL重启后系统变量值会丢失。
- 修改只读系统变量的话需要停机修改配置文件。
- 查询表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';
- 查询所有会话设置系统变量值 如果想知道所有的会话设置了哪些变量参数值,在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;
同样的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。