通过监听数据库的 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
| mysql> set global general_log_file='/tmp/general_log'; Query OK, 0 rows affected (0.00 sec)
mysql> set global general_log=on; Query OK, 0 rows affected (0.02 sec)
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>
[root@git-server ~] 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)
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)
|