日志

所有日志的配置均通过 my.cnf(Linux)my.ini(Windows) 配置文件生效,修改后需 重启 MySQL 服务 才能生效(部分日志支持动态开启)。

通用配置步骤

  1. 找到 MySQL 配置文件:通过 mysql --help | grep my.cnf 查看默认路径(如 /etc/my.cnf)。
  2. [mysqld] 模块下添加日志相关配置项。
  3. 重启 MySQL 服务:systemctl restart mysqld(Linux)或 “服务” 中重启(Windows)。
  4. 验证日志是否生效:查看日志文件是否生成,或通过 show variables like '%日志关键字%' 确认配置。

注意事项

  1. 磁盘空间监控:所有日志(尤其是二进制日志、查询日志)会持续占用磁盘,需配置自动过期(如 expire_logs_days),并定期检查磁盘使用率(避免日志占满导致数据库崩溃)。
  2. 权限控制:日志文件需设置 MySQL 所属权限(如 chown mysql:mysql /var/log/mysql/),避免其他用户篡改或泄露数据。
  3. 按需开启:除错误日志默认开启外,二进制日志(主从 / 恢复必开)、慢查询日志(性能优化必开)建议长期开启;查询日志仅临时开启,用完即关。

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)。

核心用途:

  1. 数据恢复:通过二进制日志恢复指定时间点的数据(配合全量备份)。
  2. 主从复制:主库通过二进制日志将数据变更同步给从库(后续主从复制章节的核心依赖)。

默认状态默认关闭,需手动开启。

核心配置(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)。

分类: Java-Backend 标签: MySQL

评论

暂无评论数据

暂无评论数据

目录