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 - 仅主从从节点
相关推荐
秋风点枝1 小时前
数据库 01 · 体系结构与存储引擎
数据库·mysql
CodeGL1 小时前
15、Python 访问数据库
数据库·python
晴天的雨.9921 小时前
【Linux】make & Makefile 核心知识点
linux·运维·服务器
老郭a1 小时前
流量一涨 Pod 扩不出来?K8s HPA 弹性伸缩配置避坑指南
云原生
小此方1 小时前
Re:Mysql数据库基础篇(五):拒绝脏数据!一文吃透MySQL表的约束(主键、唯一键、外键与实战案例)
数据库·mysql
丘山望岳2 小时前
Linux基础指令入门篇
linux·运维·服务器
想做小南娘,发现自己是女生喵2 小时前
LAN Device Monitor 第二周学习文档
java·服务器·数据库
byte轻骑兵2 小时前
【TextIn xParse + WorkBuddy】把8小时的标书审查压进1小时:招标要求逐条核验与废标风险预警工作台
大数据·数据库·aigc·textin·ai数据层基础设施
hhhjhl2 小时前
Zod 跨端三方库仓颉适配全流程
linux·运维·ubuntu