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 ...