MySQL 二轮学习笔记·运维篇·(一) 日志
日志
所有日志的配置均通过 my.cnf(Linux) 或 my.ini(Windows) 配置文件生效,修改后需 重启 MySQL 服务 才能生效(部分日志支持动态开启)。
通用配置步骤
- 找到 MySQL 配置文件:通过
mysql --help | grep my.cnf
查看默认路径(如/etc/my.cnf
)。 - 在
[mysqld]
模块下添加日志相关配置项。 - 重启 MySQL 服务:
systemctl restart mysqld
(Linux)或 “服务” 中重启(Windows)。 - 验证日志是否生效:查看日志文件是否生成,或通过
show variables like '%日志关键字%'
确认配置。
注意事项
- 磁盘空间监控:所有日志(尤其是二进制日志、查询日志)会持续占用磁盘,需配置自动过期(如
expire_logs_days
),并定期检查磁盘使用率(避免日志占满导致数据库崩溃)。 - 权限控制:日志文件需设置 MySQL 所属权限(如
chown mysql:mysql /var/log/mysql/
),避免其他用户篡改或泄露数据。 - 按需开启:除错误日志默认开启外,二进制日志(主从 / 恢复必开)、慢查询日志(性能优化必开)建议长期开启;查询日志仅临时开启,用完即关。
1.错误日志(Error Log)
作用:记录 MySQL 启动 / 关闭过程中的错误、运行中 critical 级别的故障(如内存不足、索引损坏、连接失败等),是 排查 “数据库起不来”“服务崩溃” 的首要日志。
默认状态:默认开启,无需额外配置(仅需确认路径即可)。
核心配置(my.cnf 中添加):
[mysqld]
log-error=/var/log/mysql/mysqld-error.log # 日志路径(建议放在非系统盘,避免占满根目录)
log-warnings=2 # 可选:记录警告信息(1=默认,2=记录所有警告,0=关闭)
查看方式:直接查看文件:tail -f /var/log/mysql/mysqld-error.log
(实时跟踪最新错误)。
关键场景示例:若 MySQL 启动失败,执行 systemctl status mysqld
会提示 “查看错误日志”,此时打开上述文件,搜索 ERROR
关键字即可定位原因(如 “端口被占用”“配置文件语法错误”“数据目录权限不足”)。
2.二进制日志(Binary Log)
作用:记录所有数据变更操作(如 INSERT/UPDATE/DELETE、CREATE TABLE 等 DML/DDL 语句),但不记录查询操作(如 SELECT)。
核心用途:
- 数据恢复:通过二进制日志恢复指定时间点的数据(配合全量备份)。
- 主从复制:主库通过二进制日志将数据变更同步给从库(后续主从复制章节的核心依赖)。
默认状态:默认关闭,需手动开启。
核心配置(my.cnf 中添加):
[mysqld]
server-id=1 # 必须配置:唯一标识(主从复制中主库和从库的 server-id 不能重复)
log-bin=/var/log/mysql/mysql-bin # 开启二进制日志,日志文件前缀为 mysql-bin(会自动生成 mysql-bin.000001、mysql-bin.000002 等)
binlog_format=ROW # 二进制日志格式(3种可选,推荐 ROW):
# - ROW:记录行数据变更(最安全,主从复制无歧义,推荐)
# - STATEMENT:记录执行的 SQL 语句(可能有函数/存储过程导致主从不一致)
# - MIXED:混合模式(自动切换,兼容场景)
expire_logs_days=7 # 可选:日志自动过期时间(7天,避免日志占满磁盘)
关键操作命令:
命令 | 作用 |
---|---|
show binary logs; | 查看所有二进制日志文件列表 |
show master status; | 查看当前正在写入的二进制日志文件及偏移量(主从复制必用) |
flush logs; | 手动切换二进制日志(生成新文件,如从 000001 切换到 000002) |
purge binary logs to 'mysql-bin.000003'; | 删除指定文件之前的所有二进制日志(避免手动删文件导致索引错乱) |
3.查询日志(General Query Log)
作用:记录 所有发送到 MySQL 服务器的 SQL 语句(包括 SELECT 查询、连接请求等),相当于 “数据库的全量操作日记”。
默认状态:默认关闭(因会记录大量无关查询,占用磁盘且影响性能,仅在排查特定问题时临时开启)。
核心配置(my.cnf 中添加):
[mysqld]
general_log=ON # 开启查询日志
general_log_file=/var/log/mysql/mysql-general.log # 日志路径
使用场景:仅用于临时排查 “某条 SQL 是否被执行”“谁在频繁连接数据库” 等场景,问题解决后需立即关闭(避免日志膨胀)。
4.慢查询日志(Slow Query Log)
作用:记录 执行时间超过指定阈值的 SQL 语句(默认 10 秒),是 定位慢 SQL、优化数据库性能 的核心工具(如发现 “全表扫描”“未走索引” 的 SQL)。
默认状态:默认关闭,生产环境建议开启(对性能影响极小,收益极高)。
核心配置(my.cnf 中添加):
[mysqld]
slow_query_log=ON # 开启慢查询日志
slow_query_log_file=/var/log/mysql/mysql-slow.log # 日志路径
long_query_time=2 # 慢查询阈值(单位:秒,建议设为 2-5 秒,根据业务调整)
log_queries_not_using_indexes=ON # 可选:记录未使用索引的 SQL(即使执行时间未超过阈值,帮助发现索引缺失问题)
查看与分析工具:
直接查看:cat /var/log/mysql/mysql-slow.log
(日志中会标注 SQL 执行时间、锁等待时间、涉及的表等)。
专业工具:使用 mysqldumpslow
(MySQL 自带)或 pt-query-digest
(Percona 工具集,更强大)分析慢查询日志,快速定位 “最耗时的 SQL”“出现次数最多的慢 SQL”。
示例(mysqldumpslow 用法):mysqldumpslow -s t /var/log/mysql/mysql-slow.log
(按执行时间(t)排序,展示前 10 条慢 SQL)。
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据