MySQL日志

Log Type Information Written to Log
Error log Problems encountered starting, running, or stopping mysqld
General query log 客户端执行的所有(成功)SQL记录
Binary log Statements that change data (also used for replication)
Relay log Data changes received from a replication source server
Slow query log 慢SQL记录,取决于 long_query_time 系统变量
DDL logs Atomic DDL operations performed by DDL statements

一、General log 和 Slow log

1、日志存储位置

支持如下存储方式:

  • FILE:文件,默认存储方式
  • TABLE: 数据表
  • NONE:不存储

1.1 查看当前日志存储方式

1
show variable like 'log_output';
1
2
3
4
5
6
7
mysql> show variables like 'log_output';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| log_output | FILE |
+---------------+------------+
1 row in set (0.00 sec)

1.2 全局修改日志存储方式

1
set global log_output = 'TABLE,FILE';

1.3 设置持久化

通过global设置的系统变量,在mysql服务重启后会重新还原为默认值,需要在my.cnf中修改进行持久化

1
2
[mysqld]
log_output=TABLE,FILE

2、General Log

记录客户端执行的所有SQL

2.1 查看当前日志记录开启以及文件保存位置

1
show variables like 'general_log%';

如果log_output支持TABLE时,日志信息会记录在 mysql.general_log数据表中

2.2 日志文件日志内容

1
2
Time                 Id Command    Argument
2024-11-08T00:42:06.651126Z 11 Query select * from learn.shop

2.3 数据表日志内容

1
2
3
4
5
6
7
8
9
10
11
mysql> select *, convert(argument using utf8) args from mysql.general_log \G

*************************** 1. row ***************************
event_time: 2024-11-08 08:42:06.651126
user_host: root[root] @ localhost []
thread_id: 11
server_id: 1
command_type: Query
argument: 0x73656C656374202A2066726F6D206C6561726E2E73686F70
args: select * from learn.shop

默认情况下,general_log数据表中存储SQL语句的字段(argument)进行了编码,需要通过convert(argument using utf8)函数进行解码

2.4 设置持久化

通过global设置的系统变量,在mysql服务重启后会重新还原为默认值,需要在my.cnf中修改进行持久化

1
2
3
[mysqld]
general_log=ON
general_log_file=/var/lib/mysql/general_08.log

修改完成后通过sudo systemctl restart mysqld重启mysql服务让配置生效

3、Slow Query Log

记录执行时间超过long_query_time变量定义的值时会记录慢SQL日志

3.1 查看慢SQL日志开启以及文件保存位置

1
show variables like 'slow_query_log%';

3.2 查看慢SQL时间阈值

1
show variables like 'long_query_time';
1
2
3
4
5
6
7
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

3.3 修改慢SQL时间阈值

1
set global long_query_time=1;

通过global修改慢SQL阈值的需要连接重新建立后才生效

System Variable long_query_time
生效范围 Global, Session
动态修改 Yes
数据类型 Numeric
默认值 10
最小值 0
最大值 31536000(365天)
单位

如果log_output支持TABLE时,日志信息会记录在 mysql.slow_log数据表中

3.4 慢SQL日志文件内容

1
2
3
4
5
# Time: 2024-11-08T00:34:07.522426Z
# User@Host: root[root] @ localhost [] Id: 11
# Query_time: 0.000312 Lock_time: 0.000004 Rows_sent: 7 Rows_examined: 7
SET timestamp=1731026047;
select * from learn.shop;

3.5 慢SQL数据表日志内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> select *, convert(sql_text using utf8) sql_detail from slow_log \G
*************************** 1. row ***************************
start_time: 2024-11-08 08:35:50.723019
user_host: root[root] @ localhost []
query_time: 00:00:00.000302
lock_time: 00:00:00.000004
rows_sent: 7
rows_examined: 7
db: mysql
last_insert_id: 0
insert_id: 0
server_id: 1
sql_text: 0x73656C656374202A2066726F6D206C6561726E2E73686F70
thread_id: 11
sql_detail: select * from learn.shop

默认情况下,slow_log数据表中存储SQL语句的字段(sql_text)进行了编码,需要通过convert(sql_text using utf8)函数进行解码

3.6 设置持久化

通过global设置的系统变量,在mysql服务重启后会重新还原为默认值,需要在my.cnf中修改进行持久化

1
2
3
4
5
[mysqld]
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/slow_08.log
long_query_time=0

修改完成后通过sudo systemctl restart mysqld重启mysql服务让配置生效

二、Bin Log

默认启用 log_bin=[base_name]系统变量,不指定默认为binlog

新文件创建:

  • 服务启动或者重启
  • 服务刷新日志
  • 日志文件达到max_binlog_size设置(采用大事物时,文件大小可能会超过max_binlog_size的限制)

mysqld采用索引文件记录当前使用的binlog文件,默认情况和binlog保持一直的文件名(扩展名为.index),可以通过 --log-bin-index=[file_name]命令选项修改

binlog文件和binlog索引文件默认存储在数据目录中,可以通过--log-bin选项指定为其他目录

文件加密


MySQL日志
https://probiecoder.cn/mysql/log.html
作者
duwei
发布于
2025年4月22日
许可协议