MySQL修改long_query_time不生效的解决方法
mysql server 使用了 5.7 以上版本,在 mysql 客户端修改 long_query_time 全局变量由 10 修改为 1,但重新查询 long_query_time 仍显示 10 ,难道set global long_query_time 不起作用吗?
我们来测试一下:
root@localhost:mysql3306.sock [(none)]> show global variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 10.00000 | +-----------------+----------+ 1 row in set (0.00 sec) root@localhost:mysql3306.sock [(none)]> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 10.00000 | +-----------------+----------+ 1 row in set (0.00 sec) root@localhost:mysql3306.sock [(none)]> set global long_query_time=2; Query OK, 0 rows affected (0.00 sec) root@localhost:mysql3306.sock [(none)]> show global variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 2.000000 | +-----------------+----------+ 1 row in set (0.00 sec) root@localhost:mysql3306.sock [(none)]> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 10.00000 | +-----------------+----------+ 1 row in set (0.01 sec)
结果显示修改long_query_time全局变量后仅全局变量变更了,但当前session的long_query_time没有变更,那原因又是什么呢?
经查官方文档 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html 显示,long_query_time属于全局和会话范围的系统变量。
https://dev.mysql.com/doc/refman/8.0/en/using-system-variables.html 显示修改全局变量仅对新会话生效而对当前会话不起作用。
再查看slow log发现修改全局变量后所谓的不生效日志记录都是同一个Id: 1041729,也就是说这个会话在修改全局变量前就已创建了,这并非是MySQL的Bug。
如果要立即生效,需要怎么办呢?
- 第一种办法:重启 mysqld 服务;
- 第二种办法:关闭当前会话,重新开启一个会话。
在MySQL中可以使用IF()、IFNULL()、NULLIF()、ISNULL()函数进行流程的控制。1、IF()函数的使用IF(expr1,expr2,ex ...