MySQL 日志管理

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 最基础的日志,记录服务启停、运行报错、调度事件、从库复制进程相关信息。 记录内容:

  1. 服务器启动和关闭过程中的信息
  2. 服务器运行过程中的错误信息
  3. 事件调度器运行定时事件产生的信息
  4. 从服务器上 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 查询语句不会记录。 三大核心用途:

  1. 主从复制:从库拉取主库 binlog,重放 SQL 实现数据同步
  2. 数据恢复:结合全量备份 + binlog,恢复到任意时间点
  3. 安全审计:追溯数据变更,排查注入、误删操作

常用操作

复制代码
# 查看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 - 仅主从从节点
相关推荐
艺杯羹28 分钟前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
陈希12329 分钟前
负载均衡与高可用:LVS、HAProxy、Keepalived 实战
运维·负载均衡·lvs
code2cat1 小时前
【随笔】MCP工具重试:任务已经创建,响应丢了怎么办
数据库·mcp
Star(up up up)2 小时前
Redis Windows 安装教程:使用Windows 的 Redis 压缩包
redis·笔记·学习·程序人生·云原生·学习方法·改行学it
wuyk5553 小时前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite
SQL774 小时前
IT运维发展史,一部宏伟史诗
运维·运维发展史
乌暮5 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方5 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
分布式存储与RustFS5 小时前
Terraform 状态文件老在本地丢、并发还撞锁:把 state 锁进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
csdn_aspnet6 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac