温馨提示×

Linux系统中MySQL日志如何管理

小樊
37
2025-12-06 04:22:35
栏目: 云计算

Linux下MySQL日志管理实操指南

一 日志类型与用途

  • 错误日志 Error Log:记录 MySQL 启动、运行、停止过程中的错误与重要告警,是排障首选。
  • 通用查询日志 General Query Log:记录所有客户端连接与 SQL 语句,便于审计与调试;高并发下会产生大量日志,生产环境通常关闭。
  • 慢查询日志 Slow Query Log:记录执行时间超过阈值的 SQL,用于定位性能瓶颈。
  • 二进制日志 Binary Log binlog:记录会修改数据或结构的事件,用于主从复制时间点恢复 PITR
  • 中继日志 Relay Log:仅用于复制从库,保存从主库接收的 binlog 事件。
    以上日志类型及用途是 MySQL 运维的基础,默认情况下通常只启用错误日志,其他日志需按需开启。

二 查看与临时调整日志配置

  • 查看关键配置与路径:
    • 错误日志:SHOW VARIABLES LIKE 'log_error';
    • 通用查询日志:SHOW VARIABLES LIKE 'general_log%';
    • 慢查询日志:SHOW VARIABLES LIKE 'slow_query_log%';SHOW VARIABLES LIKE 'long_query_time';
    • 二进制日志:SHOW VARIABLES LIKE 'log_bin%';
  • 运行时开关(动态生效,部分需 SUPER 权限):
    • 开启/关闭通用查询日志:SET GLOBAL general_log = ON|OFF;
    • 开启/关闭慢查询日志:SET GLOBAL slow_query_log = ON|OFF;
    • 调整慢查询阈值:SET GLOBAL long_query_time = 2;(单位:秒;会话级可再 SET SESSION long_query_time = 2;
  • 临时控制写入 binlog(会话级):SET sql_log_bin = 0|1;(常用于导入/迁移时临时关闭,注意仅影响当前会话)
  • 在线查看日志内容:tail -f /var/log/mysql/mysql_error.logless /var/log/mysql/mysql_slow.log
    以上命令覆盖日常查看与临时调整所需,便于不重启实例完成应急与验证。

三 配置文件开启与路径设置

  • 配置文件常见路径:/etc/my.cnf/etc/mysql/my.cnf、或发行版目录如 /etc/mysql/mysql.conf.d/mysqld.cnf
  • 示例片段(按需启用与调整):
    [mysqld]
    # 错误日志
    log_error = /var/log/mysql/error.log
    
    # 通用查询日志(调试时开启,生产建议关闭)
    general_log = 0
    general_log_file = /var/log/mysql/general.log
    
    # 慢查询日志
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 2
    
    # 二进制日志(用于复制与PITR)
    log_bin = /var/log/mysql/mysql-bin
    server_id = 1
    binlog_format = ROW
    
  • 目录与权限准备(示例):
    • sudo mkdir -p /var/log/mysql
    • sudo touch /var/log/mysql/{error.log,general.log,slow.log}
    • sudo chown mysql:mysql /var/log/mysql/*.log
  • 使配置生效:
    • 动态生效项(如 general_log、slow_query_log、long_query_time)可即时生效;
    • 涉及文件路径或 binlog 等静态参数需重启:sudo systemctl restart mysql
      上述路径、参数与步骤覆盖常见发行版与场景,便于快速落地。

四 日志轮转与清理

  • 使用 logrotate 管理文本日志(error/general/slow):
    • 新建配置:/etc/logrotate.d/mysql
      /var/log/mysql/*.log {
          daily
          rotate 7
          compress
          missingok
          notifempty
          create 640 mysql mysql
          sharedscripts
          postrotate
              /usr/bin/systemctl reload mysql >/dev/null 2>&1 || true
          endscript
      }
      
    • 测试与执行:
      • 语法检查:sudo logrotate -d /etc/logrotate.d/mysql
      • 强制执行:sudo logrotate -vf /etc/logrotate.d/mysql
  • 二进制日志专用清理(避免误删正在使用的 binlog):
    • 查看:SHOW BINARY LOGS;
    • 按时间/文件过期:PURGE BINARY LOGS BEFORE '2025-12-01 00:00:00';PURGE BINARY LOGS TO 'mysql-bin.000123';
    • 重置(清空所有 binlog,谨慎):RESET MASTER;(主从复制环境禁用)
  • 手动轮转错误日志(无需重启):FLUSH LOGS;(会关闭并重新打开错误日志,旧日志可归档)
    以上方案覆盖文本日志的自动化轮转与 binlog 的安全清理,兼顾可维护性与数据安全。

五 监控与最佳实践

  • 性能与空间监控:
    • 空间:df -hdu -sh /var/log/mysql
    • 日志增长与活跃度:ls -lh /var/log/mysql/tail -f 实时查看
  • 慢查询分析与优化:
    • 将慢日志导入表:SET GLOBAL slow_query_log = 0;(临时关闭写入)
    • 分析:SELECT * FROM mysql.slow_log WHERE start_time > NOW() - INTERVAL 1 DAY;(建议配合 pt-query-digest 做深度分析)
  • 配置建议:
    • 生产环境默认关闭通用查询日志慢查询日志建议开启并合理设置 long_query_time(如 1–2 秒)。
    • binlog 仅在有复制或 PITR 需求时开启,并配置合理的过期策略(如按天/按容量清理)。
    • 统一日志目录与权限,便于备份与审计;为 logrotate 配置告警与状态检查。
      这些实践有助于在保障可观测性的同时控制性能与存储成本。

0