官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html
不管是哪个数据库产品,一定会有日志文件。在MariaDB/MySQL中,主要有5种日志文件:
- 1.错误日志(error log):记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。
- 2.查询日志(general log):记录建立的客户端连接和执行的语句。
- 3.二进制日志(bin log):记录所有更改数据的语句,可用于数据复制。
- 4.慢查询日志(slow log):记录所有执行时间超过long_query_time的所有查询或不使用索引的查询。
- 5.中继日志(relay log):主从复制时使用的日志。
一、错误日志
错误日志是最重要的日志之一,它记录了MariaDB/MySQL服务启动和停止正确和错误的信息,还记录了mysqld实例运行过程中发生的错误事件信息。
查看错误日志文件位置:
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.01 sec)
二、一般查询日志
查询日志分为一般查询日志和慢查询日志,它们是通过查询是否超出变量 long_query_time 指定时间的值来判定的。在超时时间内完成的查询是一般查询,可以将其记录到一般查询日志中,但是建议关闭这种日志(默认是关闭的),超出时间的查询是慢查询,可以将其记录到慢查询日志中。
变量 general_log={0|1}
决定是否启用一般查询日志,变量general_log_file=file_name
来指定查询日志的路径,不给定路径时默认的文件名以 hostname.log
命名。
和查询日志有关的变量有:
- long_query_time = 10 # 指定慢查询超时时长,超出此时长的属于慢查询,会记录到慢查询日志中
- log_output={TABLE|FILE|NONE} # 定义一般查询日志和慢查询日志的输出格式,不指定时默认为file
log_output参数说明
- TABLE 表示记录日志到表中
- FILE 表示记录日志到文件中
- NONE 表示不记录日志。只要这里指定为NONE,即使开启了一般查询日志和慢查询日志,也都不会有任何记录
和一般查询日志相关的变量有:
- general_log=off # 是否启用一般查询日志,为全局变量,必须在global上修改。
- sql_log_off=off # 在session级别控制是否启用一般查询日志,默认为off
- general_log_file=/mydata/data/hostname.log # 默认是库文件路径下主机名加上.log
1.开启一般查询日志
mysql> set @@global.general_log=1;
2.查看一般查询日志文件
show variables like 'general_log_file';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
1 row in set (0.00 sec)
[root@localhost log]# tail -999f /var/lib/mysql/localhost.log
可以看到所有sql的执行记录。
三、慢查询日志
查询超出变量 long_query_time
指定时间值的为慢查询。但是查询获取锁(包括锁等待)的时间不计入查询时间内。
mysql记录慢查询日志是在查询执行完毕且已经完全释放锁之后才记录的,因此慢查询日志记录的顺序和执行的SQL查询语句顺序可能会不一致(例如语句1先执行,查询速度慢,语句2后执行,但查询速度快,则语句2先记录)。
和慢查询有关的变量:
- long_query_time=10 # 指定慢查询超时时长(默认10秒),超出此时长的属于慢查询
- log_output={TABLE|FILE|NONE} # 定义一般查询日志和慢查询日志的输出格式,默认为file
- log_slow_queries={yes|no} # 是否启用慢查询日志,默认不启用
- slow_query_log={1|ON|0|OFF} # 也是是否启用慢查询日志,此变量和log_slow_queries修改一个另一个同时变化
- slow_query_log_file=/var/lib/mysql/localhost-slow.log #默认路径为库文件目录下主机名加上-slow.log
- log_queries_not_using_indexes=OFF # 查询没有使用索引的时候是否也记入慢查询日志
1.查看慢查询日志文件目录
mysql> show variables like 'slow_query_log_file';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
1 row in set (0.00 sec)
2.开启慢日志查询
mysql> set @@global.slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)
3.设置超时时间1秒
mysql> set @@global.long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
执行一个时间超过1秒的sql SELECT SLEEP(2);
4.查看日志
[root@localhost ~]# tail -999f /var/lib/mysql/localhost-slow.log
# Time: 2021-10-12T11:43:00.378305Z
# User@Host: root[root] @ [192.168.183.1] Id: 5
# Query_time: 2.004286 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1634038980;
SELECT SLEEP(2);
5.使用mysqldumpslow工具查看慢查询日志
[root@localhost ~]# mysqldumpslow /var/lib/mysql/localhost-slow.log
Reading mysql slow query log from /var/lib/mysql/localhost-slow.log
Count: 2 Time=2.00s (4s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@[192.168.183.1]
SELECT N as a,SLEEP(N) as b
Count: 4 Time=2.00s (8s) Lock=0.00s (0s) Rows=1.0 (4), root[root]@[192.168.183.1]
SELECT SLEEP(N)
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
# Time: N-N-12T11:N:N.378305Z
# User@Host: root[root] @ [N.N.N.N] Id: N
# Query_time: N.N Lock_time: N.N Rows_sent: N Rows_examined: N
SET timestamp=N;
SELECT SLEEP(N)
该工具归类的时候,默认会将同文本但变量值不同的查询语句视为同一类,并使用N代替其中的数值变量,使用S代替其中的字符串变量。可以使用-a来禁用这种替换。
四、特别注意
以上通过设置全局变量的方法,只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf。