MySQL 如何监听执行的 SQL 语句?

通过监听数据库的 SQL 语句:

  • 可以了解业务逻辑。
  • 可以知道哪些表查询很频繁,如果该表不是经常变化,可以做cache,提高客户端响应速度。
  • 对主备延迟要求不高的表,读可以放到备库。
  • 等待……

在 SQL Server 中想要监听执行了哪些 SQL 语句,可以通过自带的可视化界面工具 SQL Server Profiler,由于是可视化的,所以使用起来也是非常的简单。

那么 MySQL 怎么监听执行的 SQL 语句呢?
一般数据库开启了 SQL 监听是会影响数据性能的,那么开启后又如何关闭呢?

show log 和 general log

  • slow log 可以定位一些有性能问题的 SQL。
  • general log 会记录所有的 SQL,非常消耗资源,为了性能,因此默认是关闭的。

MySQL 5.0 版本,如果要开启 slow log、general log,需要重启。
MySQL 5.1.6 版开始,general query log 和 slow query log 开始支持写到文件或者数据库表两种方式,并且日志的开启,输出方式的修改,都可以在Global级别动态修改。

1
2
3
4
5
6
7
MariaDB [(none)]> select version();
+----------------+
| version() |
+----------------+
| 5.5.68-MariaDB |
+----------------+
1 row in set (0.00 sec)

永久监听方法(不推荐)

通过编辑 my.cnf 文件,设置 general_log 为1,并且配置 general_log_file 的 log 文件。然后重启 MySQL,此操作永久生效。

1
2
3
[root@git-server ~]# grep general_log /etc/my.cnf
general_log = 1
general_log_file = /tmp/general.log

当然这种方式是不允许在生产上采用的。因为要重启MySQL,会中断MySQL的业务。同时日志文件会记录所有的关于 MySQL 的 DDL 和 DML 语句,非常消耗资源,一般都是在协助排除 MySQL 故障时,临时短暂的开启几分钟。事后都要关闭的。

临时监听方法(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Step 1:设置日志文件位置。
mysql> set global general_log_file='/tmp/general_log';
Query OK, 0 rows affected (0.00 sec)

# Step 2:开启日志监听。
mysql> set global general_log=on;
Query OK, 0 rows affected (0.02 sec)

# Step 3:查看配置是否生效。
mysql> show global variables like '%general%';
+------------------+------------------+
| Variable_name | Value |
+------------------+------------------+
| general_log | ON |
| general_log_file | /tmp/general_log |
+------------------+------------------+
2 rows in set (0.00 sec)

mysql>

# Step 4:通过 tail 命令查看监听到的 SQL 语句。
[root@git-server ~]# tailf /tmp/general_log
180717 22:55:51 2 Query show databases
180717 22:56:04 2 Query SELECT DATABASE()
2 Init DB test
180717 22:56:14 2 Query select * from student3

注意在第四步的时候,执行 tail 命令可能提示找不到 tmp 目录下面的 general_log 文件,执行 sudo find /tmp/ -name general_log 这条命令查找下即可。

最后一定要记住关闭监听。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MariaDB [(none)]> show global variables like '%general%';
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| general_log | ON |
| general_log_file | Main.log |
+------------------+----------+
2 rows in set (0.01 sec)

# Step 5:关闭日志监听。
MariaDB [(none)]> set global general_log=off;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show global variables like '%general%';
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| general_log | OFF |
| general_log_file | Main.log |
+------------------+----------+
2 rows in set (0.00 sec)

MySQL 如何监听执行的 SQL 语句?

https://ganzhixiong.com/p/db917aa9/

Author

干志雄

Posted on

2021-08-19

Updated on

2021-08-19

Licensed under

Comments