YAOTU INSIGHTS

MySQL日志类型详解与配置优化指南

MySQL日志类型详解与配置优化指南
1. MySQL日志类型概述MySQL数据库系统通过多种日志文件记录数据库运行过程中的各类事件这些日志是DBA进行故障排查、性能优化和数据恢复的重要依据。根据功能不同MySQL主要包含以下几种日志类型错误日志(Error Log)记录MySQL服务启动、运行和停止过程中的错误信息以及关键事件通知。这是排查服务异常的第一手资料默认文件名为hostname.err位置可通过log_error参数配置。二进制日志(Binary Log)以二进制形式记录所有修改数据的SQL语句DDL和DML用于数据复制(Replication)和时间点恢复(PITR)。通过log_bin参数启用文件命名通常为mysql-bin.000001形式。查询日志(General Query Log)记录所有到达MySQL的查询请求包括连接建立和SQL执行记录。由于会产生大量IO默认关闭通过general_log参数控制。慢查询日志(Slow Query Log)记录执行时间超过long_query_time阈值的SQL语句是性能优化的关键工具。通过slow_query_log参数启用。中继日志(Relay Log)在主从复制架构中从库(Slave)从主库(Master)接收的二进制日志事件会先写入中继日志再由SQL线程执行。事务日志(InnoDB Redo Log)InnoDB存储引擎特有的WAL(Write-Ahead Logging)机制日志保证事务的持久性。由ib_logfile0和ib_logfile1文件组成。2. 日志文件位置与配置参数2.1 查看日志文件路径通过以下命令可以查看当前MySQL实例的日志文件配置情况SHOW VARIABLES LIKE %log%;关键参数说明log_error错误日志文件路径general_log_file通用查询日志文件路径slow_query_log_file慢查询日志文件路径log_bin_basename二进制日志基础文件名datadir数据目录多数日志默认存储在此2.2 动态启用/禁用日志部分日志可以在运行时动态开启无需重启服务-- 开启通用查询日志生产环境慎用 SET GLOBAL general_log ON; -- 开启慢查询日志 SET GLOBAL slow_query_log 1; -- 设置慢查询阈值为2秒 SET GLOBAL long_query_time 2;注意二进制日志(binlog)的启用需要修改my.cnf配置文件并重启服务无法动态开启。3. 各类日志的详细查看方法3.1 错误日志查看错误日志是纯文本文件可直接使用文件查看命令# 查看最后100行错误日志 tail -100 /var/log/mysql/error.log # 实时监控错误日志新增内容 tail -f /var/log/mysql/error.log典型错误日志内容示例2023-08-20T03:25:43.234567Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2023-08-20T03:25:43.345678Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates...3.2 二进制日志查看二进制日志需要使用mysqlbinlog工具解析# 查看特定binlog文件内容 mysqlbinlog /var/lib/mysql/mysql-bin.000001 # 按时间范围查看 mysqlbinlog --start-datetime2023-08-20 00:00:00 --stop-datetime2023-08-21 00:00:00 mysql-bin.000001 # 解析为可读SQL语句 mysqlbinlog --base64-outputDECODE-ROWS -v mysql-bin.0000013.3 慢查询日志分析慢查询日志可直接查看但推荐使用专用工具分析# 使用mysqldumpslow工具分析 mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log # 使用pt-query-digest工具Percona Toolkit pt-query-digest /var/log/mysql/mysql-slow.log分析结果会显示执行最慢的SQL、出现频率高的SQL等重要信息帮助定位性能瓶颈。4. 日志轮转与清理策略4.1 二进制日志清理-- 查看当前所有binlog文件 SHOW BINARY LOGS; -- 删除指定日期前的binlog PURGE BINARY LOGS BEFORE 2023-08-01 00:00:00; -- 设置binlog过期天数自动清理 SET GLOBAL expire_logs_days 7;4.2 慢查询日志轮转可通过Linux的logrotate工具配置/var/log/mysql/mysql-slow.log { daily rotate 30 missingok compress delaycompress notifempty create 640 mysql mysql postrotate /usr/bin/mysqladmin flush-logs endscript }5. 生产环境日志配置建议5.1 推荐配置参数[mysqld] # 错误日志 log_error /var/log/mysql/error.log log_error_verbosity 3 # 详细级别1-3 # 二进制日志 log_bin /var/log/mysql/mysql-bin binlog_format ROW # 推荐使用ROW格式 binlog_row_image FULL # 记录完整行数据 expire_logs_days 7 # 自动清理7天前的binlog # 慢查询日志 slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 1 # 超过1秒的查询视为慢查询 log_queries_not_using_indexes 1 # 记录未使用索引的查询5.2 日志监控方案错误日志监控配置日志收集系统如ELK实时监控ERROR和WARNING级别日志慢查询告警对频繁出现的慢查询设置告警阈值binlog空间监控确保有足够磁盘空间存储binlog6. 高级日志分析技巧6.1 使用Performance Schema分析-- 查看最近执行缓慢的SQL SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC LIMIT 10; -- 查看全表扫描的查询 SELECT * FROM performance_schema.events_statements_summary_by_digest WHERE SUM_NO_INDEX_USED 0 OR SUM_NO_GOOD_INDEX_USED 0;6.2 使用sys schema分析-- 查看语句执行统计 SELECT * FROM sys.statement_analysis ORDER BY avg_latency DESC LIMIT 10; -- 查看全表扫描最多的表 SELECT * FROM sys.schema_tables_with_full_table_scans;6.3 使用MySQL Shell的日志分析功能// 在MySQL Shell中使用JavaScript模式分析日志 util.showSlowQueries(); util.showErrorLog();