1.1 为什么需要日志
- 用于排错
- 用来做数据分析
- 了解程序的运行情况,了解 MySQL 的性能
1.2 日志作用
在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这种情况下,就必须保证数据的安全性和完整性,可以借助日志查看操作记录或者完成数据恢复。
1.3 日志文件查看方法
不同 MySQL 安装方式,日志存储位置、文件名会有差异,优先通过 MySQL 内置变量查询日志位置,也可以查看配置文件。
Windows 系统: 主配置文件 my.ini 路径:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
datadir=C:/ProgramData/MySQL/MySQL Server 8.0\Data
log-error="LEGION.err"
错误日志实际路径:C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION.err
Linux 系统: 很多二进制安装的 MySQL 不会在 /etc/my.cnf 放置配置文件,直接在 MySQL 内部查询日志参数是最稳妥的方式,数据目录一般存放所有日志文件。
小贴士:不要只依赖配置文件查找日志,优先
show variables like 'xxx';查询。
1.4 常见日志类型之错误日志 error log
错误日志是 MySQL 最基础的日志,记录服务启停、运行报错、调度事件、从库复制进程相关信息。 记录内容:
- 服务器启动和关闭过程中的信息
- 服务器运行过程中的错误信息
- 事件调度器运行定时事件产生的信息
- 从服务器上 slave 进程运行产生的信息
日志分级:[System] 系统信息、[Warning] 警告、[Error] 错误,重点排查 Error 级别内容。
Windows 查看
mysql> show variables like 'log_error';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| log_error | .\DESKTOP-QKBUKAS.err |
+---------------+-----------------------+
1 row in set, 1 warning (0.01 sec)
配置文件设置:log-error=文件路径/文件名 指定错误日志位置。
Linux 查看
mysql> show variables like 'log_error';
+---------------+-------------+
| Variable_name | Value |
+---------------+-------------+
| log_error | ./Mysql.err |
+---------------+-------------+
1 row in set (0.01 sec)
1.5 常见日志类型之通用查询日志 general log
通用查询日志会记录客户端所有连接、所有 SQL 操作,包括查询、更新语句,登录退出等。
⚠️ 生产默认关闭!开启后会大量消耗磁盘、CPU、内存,只适合临时排查问题,用完立刻关闭。
日志输出方式由 log_output 控制,可选值:
FILE:写入文本文件(默认)TABLE:存入 mysql 库的 general_log 表NONE:不记录
Windows 操作
查看状态
mysql> show global variables like '%general_log%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| general_log | OFF |
| general_log_file | DESKTOP-QKBUKAS.log |
+------------------+---------------------+
临时开启
mysql> set global general_log=on;
查看输出类型
mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
临时关闭
mysql> set global general_log=off;
永久配置(my.ini)
general-log=1
general_log_file="C:/xxx/mysql.log"
log-output=FILE
Linux 操作
# 查看状态
show global variables like '%general_log%';
# 开启
set global general_log=on;
# 关闭
set global general_log=off;
默认日志路径示例:/usr/local/mysql/data/Mysql.log
1.6 常见日志类型之慢查询日志 slow log
慢查询日志用来捕获执行耗时超过阈值的 SQL,是 SQL 优化的核心工具,记录执行时间超过 long_query_time 的语句,也可以记录不走索引的查询。
- 默认阈值:10 秒,最小支持 0,精度到微秒
- 生产环境建议开启,阈值一般调整为 1 秒
Windows
# 查看慢日志状态
show global variables like '%slow_query_log%';
# 开启慢查询日志
set global slow_query_log=on;
# 查看时间阈值
show global variables like 'long_query_time';
日志示例路径:C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-QKBUKAS-slow.log
Linux
# 查看状态
show global variables like '%slow_query_log%';
# 开启,0关闭
set global slow_query_log=1;
# 查看阈值
show global variables like 'long_query_time';
默认日志路径:/usr/local/mysql/data/Mysql-slow.log
1.7 常见日志类型之撤销日志 undo log
Undo log 回滚日志,相当于 MySQL 的撤销操作,支持事务回滚、MVCC 多版本并发控制。 记录逻辑反向操作:
- INSERT:记录对应的 DELETE
- DELETE:标记行删除位,回滚时恢复标记
- UPDATE:记录修改前旧数据,回滚时覆盖回去
MySQL8.0.20 之后独立存放,Windows 示例路径:C:\ProgramData\MySQL\MySQL Server 8.0\Data\undo_001
区分:undo 是逻辑日志,记录反向 SQL;redo 是物理日志,记录页的变更。
1.8 常见日志类型之重做日志 redo log
InnoDB 预写式日志(WAL)核心组件。 InnoDB 数据先写入内存缓冲池 Buffer Pool,后台线程异步刷盘;如果宕机,内存数据丢失,依靠 redo log 完成崩溃恢复,保证已经提交的事务一定持久化。
MySQL8 redo log 独立目录:#innodb_redo 文件两类:
#ib_redoN:正在使用的 redo 文件#ib_redoN_tmp:空闲备用 redo 文件
查看 redo 信息 SQL:
select * from performance_schema.innodb_redo_log_files\G
show global status like '%innodb%redo%';
1.9 常见日志类型之二进制日志 binlog(重点)
binlog 二进制日志,记录所有修改数据的 DML/DDL 语句,SELECT 查询语句不会记录。 三大核心用途:
- 主从复制:从库拉取主库 binlog,重放 SQL 实现数据同步
- 数据恢复:结合全量备份 + binlog,恢复到任意时间点
- 安全审计:追溯数据变更,排查注入、误删操作
常用操作
# 查看binlog开关状态
show variables like "%log_bin%";
# 列出所有binlog文件
show binary logs;
# 查看当前正在写入的binlog
show master status;
# 在线查看binlog事件
show binlog events in "LEGION-bin.000008";
mysqlbinlog 命令导出(Windows 示例)
cd C:\ProgramData\MySQL\MySQL Server 8.0\Data
mysqlbinlog DESKTOP-QKBUKAS-bin.000035 > test.sql
日志刷新 & 切换日志文件
刷新日志会关闭当前日志,生成全新 binlog 文件,常用于日志分割、维护。
# SQL内刷新
flush logs;
show master status;
shell / 命令行执行
mysqladmin flush-logs -uroot -p
# refresh 等价 flush logs
mysqladmin refresh -uroot -p
注意:命令行直接带密码有安全警告,生产尽量交互式输入密码。
1.10 常见日志类型之中继日志 relay log
中继日志 只存在于主从复制架构的从库,单机环境看不到。 工作流程:从库 IO 线程拉取主库 binlog,写入本地 relay log;再由 SQL 线程读取 relay log,重放 SQL,同步数据。 relay log 相当于主从同步的中转站,复制完成后可按策略清理。
小结汇总表
| 日志类型 | 作用 | 是否默认开启 | 适用场景 |
|---|---|---|---|
| error log | 记录启停、警告、错误 | ✅ 默认开启 | 故障排查 |
| general log | 记录全部 SQL、连接 | ❌ 默认关闭 | 临时问题溯源 |
| slow log | 记录慢 SQL | ❌ 默认关闭 | SQL 优化 |
| undo log | 事务回滚、MVCC | ✅ 默认开启 | InnoDB 事务基础 |
| redo log | 崩溃恢复、WAL | ✅ 默认开启 | InnoDB 持久化 |
| binlog | 数据变更记录、复制、恢复 | ❌ 默认关闭 | 主从、数据恢复、审计 |
| relay log | 从库中转 binlog | - | 仅主从从节点 |