1. 首页 > MySQL教程 > 正文

MySQL教程FG281-MySQL日志优化

本文档风哥主要介绍MySQL日志优化的实战技巧,包括错误日志、慢查询日志、二进制日志等内容,风哥教程参考MySQL官方文档,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 日志概述

日志是MySQL运维的重要组成部分:

# 日志概述

1. MySQL日志体系

日志类型:
+——————-+——————+——————+
| 日志类型 | 用途 | 默认状态 |
+——————-+——————+——————+
| 错误日志 | 启动/运行错误 | 开启 |
| 慢查询日志 | 性能分析 | 关闭 |
| 一般查询日志 | 所有查询记录 | 关闭 |
| 二进制日志 | 数据恢复/复制 | 关闭 |
| 中继日志 | 复制从库 | 从库开启 |
+——————-+——————+——————+

查看日志配置:
mysql> SHOW VARIABLES LIKE ‘%log%’;

输出示例:
+—————————————-+—————————————-+
| Variable_name | Value |
+—————————————-+—————————————-+
| log_error | /var/log/mysql/error.log |
| log_slow_queries | ON |
| log_queries_not_using_indexes | OFF |
| log_bin | ON |
+—————————————-+—————————————-+

2. 错误日志

查看错误日志位置:
mysql> SHOW VARIABLES LIKE ‘log_error’;

输出示例:
+—————+—————————+
| Variable_name | Value |
+—————+—————————+
| log_error | /var/log/mysql/error.log |
+—————+—————————+

查看错误日志内容:
cat /var/log/mysql/error.log

输出示例:
2026-04-01T10:00:00.000000Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.4.0) starting as process 1234
2026-04-01T10:00:01.000000Z 0 [Warning] [MY-010068] [Server] CA certificate is self signed.
2026-04-01T10:00:02.000000Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections.

查看错误日志级别:
mysql> SHOW VARIABLES LIKE ‘log_error_verbosity’;

输出示例:
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| log_error_verbosity| 3 |
+——————–+——-+

3. 慢查询日志

查看慢查询配置:
mysql> SHOW VARIABLES LIKE ‘slow_query%’;

输出示例:
+———————+———————————–+
| Variable_name | Value |
+———————+———————————–+
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/mysql-slow.log |
+———————+———————————–+

查看慢查询阈值:
mysql> SHOW VARIABLES LIKE ‘long_query_time’;

输出示例:
+—————–+———–+
| Variable_name | Value |
+—————–+———–+
| long_query_time | 10.000000 |
+—————–+———–+

查看慢查询数量:
mysql> SHOW STATUS LIKE ‘Slow_queries’;

输出示例:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Slow_queries | 100 |
+—————+——-+

4. 二进制日志

查看二进制日志配置:
mysql> SHOW VARIABLES LIKE ‘log_bin%’;

输出示例:
+———————————+—————————————-+
| Variable_name | Value |
+———————————+—————————————-+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
+———————————+—————————————-+

查看二进制日志列表:
mysql> SHOW BINARY LOGS;

输出示例:
+——————+———–+———–+
| Log_name | File_size | Encrypted |
+——————+———–+———–+
| mysql-bin.000001 | 256 | No |
| mysql-bin.000002 | 512 | No |
| mysql-bin.000003 | 1024 | No |
+——————+———–+———–+

5. 一般查询日志

查看一般查询日志配置:
mysql> SHOW VARIABLES LIKE ‘general_log%’;

输出示例:
+——————+————————————+
| Variable_name | Value |
+——————+————————————+
| general_log | OFF |
| general_log_file | /var/lib/mysql/localhost.log |
+——————+————————————+

开启一般查询日志:
mysql> SET GLOBAL general_log = ON;

输出示例:
Query OK, 0 rows affected (0.00 sec)

查看日志内容:
cat /var/lib/mysql/localhost.log

输出示例:
2026-04-01T10:00:00.000000Z 5 Query SELECT * FROM users
2026-04-01T10:00:01.000000Z 5 Query UPDATE users SET name=’test’

1.2 日志类型

MySQL支持多种日志类型:

# 日志类型

1. 错误日志(Error Log)

特点:记录MySQL启动、运行、停止过程中的错误

配置错误日志:
vim /etc/my.cnf

[mysqld]
log_error = /var/log/mysql/error.log
log_error_verbosity = 3

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

查看错误日志级别:
+——-+—————————————-+
| 级别 | 记录内容 |
+——-+—————————————-+
| 1 | 错误信息 |
| 2 | 错误信息 + 警告信息 |
| 3 | 错误信息 + 警告信息 + 注意信息 |
+——-+—————————————-+

分析错误日志:
grep -i error /var/log/mysql/error.log

输出示例:
2026-04-01T10:00:00.000000Z 0 [ERROR] [MY-010267] [Server] Out of memory

2. 慢查询日志(Slow Query Log)

特点:记录执行时间超过阈值的查询

配置慢查询日志:
vim /etc/my.cnf

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
min_examined_row_limit = 100

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

查看慢查询日志:
cat /var/log/mysql/mysql-slow.log

输出示例:
# Time: 2026-04-01T10:00:00.000000Z
# User@Host: app[app] @ localhost []
# Query_time: 5.000000 Lock_time: 0.000100 Rows_sent: 1000 Rows_examined: 100000
SET timestamp=1712000000;
SELECT * FROM large_table WHERE name LIKE ‘%test%’;

3. 二进制日志(Binary Log)

特点:记录所有数据变更操作

配置二进制日志:
vim /etc/my.cnf

[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
expire_logs_days = 7
max_binlog_size = 100M

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

查看二进制日志内容:
mysqlbinlog /var/lib/mysql/mysql-bin.000001

输出示例:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
# at 4
#260401 10:00:00 server id 1 end_log_pos 123 CRC32 0xabcdef12 Start: binlog v 4
# at 123
#260401 10:00:01 server id 1 end_log_pos 200 CRC32 0x12345678 Query thread_id=5
SET TIMESTAMP=1712000001/*!*/;
INSERT INTO users VALUES (1, ‘test’)
/*!*/;

4. 中继日志(Relay Log)

特点:从库复制主库的二进制日志

查看中继日志配置:
mysql> SHOW VARIABLES LIKE ‘relay_log%’;

输出示例:
+——————-+———————————–+
| Variable_name | Value |
+——————-+———————————–+
| relay_log | /var/lib/mysql/relay-bin |
| relay_log_index | /var/lib/mysql/relay-bin.index |
+——————-+———————————–+

查看中继日志状态:
mysql> SHOW SLAVE STATUS\G

输出示例:
*************************** 1. row ***************************
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001

5. 一般查询日志(General Log)

特点:记录所有查询语句

配置一般查询日志:
vim /etc/my.cnf

[mysqld]
general_log = ON
general_log_file = /var/log/mysql/mysql-general.log

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

注意事项:
– 一般查询日志会记录所有SQL
– 对性能影响较大
– 生产环境不建议开启
– 仅用于调试时临时开启

1.3 日志特性

日志具有独特的特性需要了解:

# 日志特性

1. 日志轮转

特点:自动创建新日志文件

二进制日志轮转:
mysql> FLUSH LOGS;

输出示例:
Query OK, 0 rows affected (0.01 sec)

查看轮转结果:
mysql> SHOW BINARY LOGS;

输出示例:
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 256 |
| mysql-bin.000002 | 512 |
| mysql-bin.000003 | 154 | <- 新日志文件 +------------------+-----------+ 自动轮转配置: vim /etc/my.cnf [mysqld] max_binlog_size = 100M expire_logs_days = 7 2. 日志过期 特点:自动清理过期日志 查看过期配置: mysql> SHOW VARIABLES LIKE ‘expire_logs_days’;

输出示例:
+——————+——-+
| Variable_name | Value |
+——————+——-+
| expire_logs_days | 7 |
+——————+——-+

手动清理日志:
mysql> PURGE BINARY LOGS BEFORE ‘2026-03-25 00:00:00’;

输出示例:
Query OK, 0 rows affected (0.01 sec)

清理到指定日志:
mysql> PURGE BINARY LOGS TO ‘mysql-bin.000010’;

输出示例:
Query OK, 0 rows affected (0.01 sec)

3. 日志格式

二进制日志格式:
+———–+——————+——————+
| 格式 | 特点 | 适用场景 |
+———–+——————+——————+
| STATEMENT | 记录SQL语句 | 主从数据一致要求低|
| ROW | 记录行数据变化 | 主从数据一致要求高|
| MIXED | 混合模式 | 兼顾性能和一致性 |
+———–+——————+——————+

查看当前格式:
mysql> SHOW VARIABLES LIKE ‘binlog_format’;

输出示例:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| binlog_format | ROW |
+—————+——-+

设置日志格式:
mysql> SET GLOBAL binlog_format = ‘ROW’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

4. 日志同步

特点:控制日志写入磁盘的时机

查看同步配置:
mysql> SHOW VARIABLES LIKE ‘sync_binlog’;

输出示例:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| sync_binlog | 1 |
+—————+——-+

配置说明:
+——-+—————————————-+
| 值 | 说明 |
+——-+—————————————-+
| 0 | 由操作系统决定何时同步 |
| 1 | 每次事务提交都同步(最安全) |
| N | 每N次事务提交同步一次 |
+——-+—————————————-+

5. 日志压缩

特点:减少日志存储空间

查看压缩配置:
mysql> SHOW VARIABLES LIKE ‘binlog_transaction_compression’;

输出示例:
+——————————–+——-+
| Variable_name | Value |
+——————————–+——-+
| binlog_transaction_compression | OFF |
+——————————–+——-+

开启压缩:
mysql> SET GLOBAL binlog_transaction_compression = ON;

输出示例:
Query OK, 0 rows affected (0.00 sec)

压缩效果:
+——————+————+————+
| 指标 | 无压缩 | 有压缩 |
+——————+————+————+
| 日志大小 | 1GB | 300MB |
| 网络传输 | 1GB | 300MB |
+——————+————+————+

Part02-生产环境规划与建议

2.1 日志设计原则

合理的日志设计是运维管理的基础:

# 日志设计原则

1. 错误日志设计

设计原则:
– 指定专用日志目录
– 设置合适的日志级别
– 配置日志轮转
– 监控错误日志

配置示例:
vim /etc/my.cnf

[mysqld]
log_error = /var/log/mysql/error.log
log_error_verbosity = 3
log_error_services = ‘log_filter_internal; log_sink_internal’

创建日志目录:
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql

验证配置:
mysql> SELECT @@log_error;

输出示例:
+—————————+
| @@log_error |
+—————————+
| /var/log/mysql/error.log |
+—————————+

2. 慢查询日志设计

设计原则:
– 设置合理的阈值
– 开启索引检查
– 配置日志轮转
– 定期分析优化

配置示例:
vim /etc/my.cnf

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
log_slow_admin_statements = ON
min_examined_row_limit = 100

验证配置:
mysql> SELECT
@@slow_query_log,
@@long_query_time;

输出示例:
+—————-+——————-+
| @@slow_query_log| @@long_query_time|
+—————-+——————-+
| 1 | 2.000000 |
+—————-+——————-+

3. 二进制日志设计

设计原则:
– 开启二进制日志
– 选择合适的格式
– 设置过期时间
– 配置同步策略

配置示例:
vim /etc/my.cnf

[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
max_binlog_size = 100M
expire_logs_days = 7
sync_binlog = 1
binlog_cache_size = 1M

验证配置:
mysql> SELECT
@@log_bin,
@@binlog_format,
@@max_binlog_size;

输出示例:
+———–+—————+——————-+
| @@log_bin | @@binlog_format| @@max_binlog_size|
+———–+—————+——————-+
| 1 | ROW | 104857600 |
+———–+—————+——————-+

4. 日志存储设计

设计原则:
– 使用独立磁盘存储
– 预留足够空间
– 配置日志轮转
– 监控磁盘使用

查看磁盘空间:
df -h /var/log/mysql

输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 100G 10G 90G 10% /var/log

配置日志轮转:
vim /etc/logrotate.d/mysql

/var/log/mysql/error.log {
daily
rotate 7
missingok
create 644 mysql mysql
compress
delaycompress
postrotate
mysqladmin flush-logs
endscript
}

5. 日志安全设计

设计原则:
– 设置合适的文件权限
– 限制日志访问
– 敏感信息脱敏
– 日志审计

设置文件权限:
chmod 640 /var/log/mysql/*.log
chown mysql:mysql /var/log/mysql/*.log

验证权限:
ls -la /var/log/mysql/

输出示例:
-rw-r—– 1 mysql mysql 256 Apr 1 10:00 error.log
-rw-r—– 1 mysql mysql 512 Apr 1 10:00 mysql-slow.log

2.2 日志优化策略

制定合理的日志优化策略:

# 日志优化策略

1. 错误日志优化

减少不必要的警告:
vim /etc/my.cnf

[mysqld]
log_error_verbosity = 2

过滤特定警告:
mysql> SET GLOBAL log_error_services = ‘log_filter_internal; log_sink_internal’;

输出示例:
Query OK, 0 rows affected (0.00 sec)

监控错误日志大小:
ls -lh /var/log/mysql/error.log

输出示例:
-rw-r—– 1 mysql mysql 1.0M Apr 1 10:00 error.log

2. 慢查询日志优化

优化慢查询阈值:
mysql> SET GLOBAL long_query_time = 1;

输出示例:
Query OK, 0 rows affected (0.00 sec)

开启慢查询采样:
mysql> SET GLOBAL log_slow_rate_limit = 10;

输出示例:
Query OK, 0 rows affected (0.00 sec)

使用pt-query-digest分析:
pt-query-digest /var/log/mysql/mysql-slow.log

输出示例:
# 3600s user time, 10s system time, 36.00M rss
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= =======
# Count 1000
# Exec time 5000s 1s 100s 5s 10s 8s 3s
# Lock time 50s 100us 1s 50ms 100ms 100ms 10ms

3. 二进制日志优化

优化日志大小:
mysql> SET GLOBAL max_binlog_size = 256*1024*1024;

输出示例:
Query OK, 0 rows affected (0.00 sec)

优化同步策略:
vim /etc/my.cnf

[mysqld]
sync_binlog = 100

开启日志压缩:
mysql> SET GLOBAL binlog_transaction_compression = ON;
mysql> SET GLOBAL binlog_transaction_compression_level_zstd = 3;

输出示例:
Query OK, 0 rows affected (0.00 sec)

4. 日志写入优化

优化日志缓冲:
mysql> SHOW VARIABLES LIKE ‘%log_buffer%’;

输出示例:
+————————+———-+
| Variable_name | Value |
+————————+———-+
| innodb_log_buffer_size | 16777216 |
+————————+———-+

设置日志缓冲:
vim /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 64M
binlog_cache_size = 1M

5. 日志清理优化

自动清理过期日志:
mysql> SET GLOBAL expire_logs_days = 7;

输出示例:
Query OK, 0 rows affected (0.00 sec)

定时清理脚本:
vim /opt/mysql/clean_logs.sh

#!/bin/bash
mysql -e “PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);”

配置定时任务:
crontab -e

0 2 * * * /opt/mysql/clean_logs.sh

2.3 日志监控

建立完善的日志监控体系:

# 日志监控

1. 错误日志监控

监控错误日志:
grep -i error /var/log/mysql/error.log | tail -10

输出示例:
2026-04-01T10:00:00.000000Z 0 [ERROR] [MY-010267] [Server] Out of memory
2026-04-01T10:00:01.000000Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure

创建监控脚本:
vim /opt/mysql/monitor_error.sh

#!/bin/bash
ERROR_COUNT=$(grep -c “\[ERROR\]” /var/log/mysql/error.log)
if [ $ERROR_COUNT -gt 10 ]; then
echo “Warning: Too many errors in MySQL error log”
fi

执行监控:
chmod +x /opt/mysql/monitor_error.sh
/opt/mysql/monitor_error.sh

输出示例:
Warning: Too many errors in MySQL error log

2. 慢查询日志监控

统计慢查询数量:
mysql> SHOW STATUS LIKE ‘Slow_queries’;

输出示例:
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Slow_queries | 1000 |
+—————+——-+

分析慢查询:
mysqldumpslow -s t /var/log/mysql/mysql-slow.log | head -10

输出示例:
Count: 100 Time=5.00s (500s) Lock=0.00s (0s) Rows=1000.0 (100000)
SELECT * FROM users WHERE name LIKE ‘S’

创建慢查询监控视图:
mysql> CREATE VIEW v_slow_query_stats AS
SELECT
DIGEST_TEXT,
COUNT_STAR,
AVG_TIMER_WAIT/1000000000 AS avg_seconds,
SUM_ROWS_EXAMINED
FROM performance_schema.events_statements_summary_by_digest
WHERE AVG_TIMER_WAIT > 2000000000
ORDER BY AVG_TIMER_WAIT DESC;

查询监控数据:
mysql> SELECT * FROM v_slow_query_stats LIMIT 10;

输出示例:
+———————————-+————+————-+——————-+
| DIGEST_TEXT | COUNT_STAR | avg_seconds | SUM_ROWS_EXAMINED |
+———————————-+————+————-+——————-+
| SELECT * FROM users WHERE … | 100 | 5.00 | 100000 |
+———————————-+————+————-+——————-+

3. 二进制日志监控

查看日志大小:
mysql> SELECT
SUM(FILE_SIZE) / 1024 / 1024 / 1024 AS total_gb
FROM information_schema.FILES
WHERE FILE_NAME LIKE ‘%mysql-bin%’;

输出示例:
+———–+
| total_gb |
+———–+
| 10.00 |
+———–+

查看日志位置:
mysql> SHOW MASTER STATUS;

输出示例:
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 256 | | |
+——————+———-+————–+——————+

4. 日志空间监控

监控日志目录空间:
df -h /var/log/mysql

输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 100G 50G 50G 50% /var/log

监控日志文件大小:
du -sh /var/log/mysql/*

输出示例:
10M /var/log/mysql/error.log
100M /var/log/mysql/mysql-slow.log
1G /var/log/mysql/mysql-bin.*

5. 日志告警配置

创建告警存储过程:
mysql> DELIMITER //
mysql> CREATE PROCEDURE check_log_health()
BEGIN
DECLARE slow_count INT;
DECLARE error_count INT;

SELECT VARIABLE_VALUE INTO slow_count
FROM performance_schema.global_status
WHERE VARIABLE_NAME = ‘Slow_queries’;

IF slow_count > 1000 THEN
SELECT CONCAT(‘Warning: Slow query count is ‘, slow_count) AS alert;
ELSE
SELECT CONCAT(‘OK: Slow query count is ‘, slow_count) AS status;
END IF;
END //
mysql> DELIMITER ;

执行检查:
mysql> CALL check_log_health();

输出示例:
+—————————————-+
| status |
+—————————————-+
| OK: Slow query count is 500 |
+—————————————-+

Part03-生产环境项目实施方案

3.1 日志实施规范

制定日志实施规范确保一致性:

# 日志实施规范

1. 错误日志配置规范

配置文件设置:
vim /etc/my.cnf

[mysqld]
log_error = /var/log/mysql/error.log
log_error_verbosity = 3
log_error_services = ‘log_filter_internal; log_sink_internal’

创建日志目录:
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
chmod 750 /var/log/mysql

验证配置:
mysql> SELECT @@log_error;

输出示例:
+—————————+
| @@log_error |
+—————————+
| /var/log/mysql/error.log |
+—————————+

2. 慢查询日志配置规范

配置文件设置:
vim /etc/my.cnf

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = ON
log_slow_admin_statements = ON
log_slow_slave_statements = ON
min_examined_row_limit = 100

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

验证配置:
mysql> SELECT
@@slow_query_log,
@@long_query_time,
@@log_queries_not_using_indexes;

输出示例:
+—————-+——————-+——————————–+
| @@slow_query_log| @@long_query_time| @@log_queries_not_using_indexes|
+—————-+——————-+——————————–+
| 1 | 2.000000 | 1 |
+—————-+——————-+——————————–+

3. 二进制日志配置规范

配置文件设置:
vim /etc/my.cnf

[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
max_binlog_size = 256M
expire_logs_days = 7
sync_binlog = 1
binlog_cache_size = 1M
binlog_transaction_compression = ON

重启MySQL:
systemctl restart mysqld

输出示例:
MySQL service restarted.

验证配置:
mysql> SHOW BINARY LOGS;

输出示例:
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 154 |
+——————+———–+

4. 日志轮转配置规范

配置logrotate:
vim /etc/logrotate.d/mysql

/var/log/mysql/error.log {
daily
rotate 7
missingok
create 640 mysql mysql
compress
delaycompress
postrotate
mysqladmin -u root -p password flush-logs
endscript
}

/var/log/mysql/mysql-slow.log {
daily
rotate 7
missingok
create 640 mysql mysql
compress
delaycompress
postrotate
mysqladmin -u root -p password flush-logs
endscript
}

测试配置:
logrotate -d /etc/logrotate.d/mysql

输出示例:
reading config file mysql
Handling 2 logs

5. 监控配置规范

创建监控用户:
mysql> CREATE USER ‘monitor’@’localhost’ IDENTIFIED BY ‘monitor_password’;
mysql> GRANT SELECT, REPLICATION CLIENT ON *.* TO ‘monitor’@’localhost’;
mysql> FLUSH PRIVILEGES;

输出示例:
Query OK, 0 rows affected (0.01 sec)

创建监控脚本:
vim /opt/mysql/log_monitor.sh

#!/bin/bash
mysql -u monitor -pmonitor_password -e “CALL check_log_health();”

配置定时任务:
crontab -e

*/5 * * * * /opt/mysql/log_monitor.sh

3.2 日志应用场景

日志在不同场景下的应用:

# 日志应用场景

1. 故障排查场景

查看错误日志:
tail -100 /var/log/mysql/error.log

输出示例:
2026-04-01T10:00:00.000000Z 0 [ERROR] [MY-010267] [Server] Out of memory
2026-04-01T10:00:01.000000Z 0 [ERROR] [MY-013183] [InnoDB] Assertion failure

分析崩溃原因:
grep -i crash /var/log/mysql/error.log

输出示例:
2026-04-01T10:00:00.000000Z 0 [ERROR] [MY-012526] [InnoDB] Crash recovery

2. 性能优化场景

分析慢查询:
pt-query-digest /var/log/mysql/mysql-slow.log

输出示例:
# Query 1: 100 QPS, 5x concurrency
# 0xABC123… 0.50 0.1% 100 5.00 2.00 2.00 5.00
# SELECT * FROM users WHERE name LIKE ?

优化慢查询:
mysql> EXPLAIN SELECT * FROM users WHERE name LIKE ‘%test%’;

输出示例:
+—-+————-+——-+——+—————+——+———+——+——–+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——–+————-+
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 100000 | Using where |
+—-+————-+——-+——+—————+——+———+——+——–+————-+

3. 数据恢复场景

查看二进制日志:
mysql> SHOW BINLOG EVENTS IN ‘mysql-bin.000001′;

输出示例:
+——————+——+—————-+———–+————-+—————————————-+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+——————+——+—————-+———–+————-+—————————————-+
| mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 8.4.0, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Query | 1 | 200 | BEGIN |
| mysql-bin.000001 | 200 | Table_map | 1 | 256 | table_id: 1 (db.users) |
+——————+——+—————-+———–+————-+—————————————-+

恢复数据:
mysqlbinlog –start-datetime=”2026-04-01 10:00:00″ \
–stop-datetime=”2026-04-01 11:00:00″ \
/var/lib/mysql/mysql-bin.000001 | mysql -u root -p

输出示例:
Data recovery completed.

4. 审计场景

开启一般查询日志:
mysql> SET GLOBAL general_log = ON;

输出示例:
Query OK, 0 rows affected (0.00 sec)

查看审计日志:
cat /var/lib/mysql/localhost.log

输出示例:
2026-04-01T10:00:00.000000Z 5 Query SELECT * FROM users
2026-04-01T10:00:01.000000Z 5 Query UPDATE users SET name=’test’

关闭审计日志:
mysql> SET GLOBAL general_log = OFF;

输出示例:
Query OK, 0 rows affected (0.00 sec)

5. 复制场景

查看主库日志状态:
mysql> SHOW MASTER STATUS;

输出示例:
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 256 | | |
+——————+———-+————–+——————+

配置从库:
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST=’master’,
SOURCE_USER=’repl’,
SOURCE_PASSWORD=’password’,
SOURCE_LOG_FILE=’mysql-bin.000003′,
SOURCE_LOG_POS=256;

输出示例:
Query OK, 0 rows affected (0.01 sec)

启动复制:
mysql> START REPLICA;

输出示例:
Query OK, 0 rows affected (0.01 sec)

3.3 日志维护

日志维护是长期运营的重要工作:

# 日志维护

1. 日志清理

清理过期二进制日志:
mysql> PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

输出示例:
Query OK, 0 rows affected (0.01 sec)

清理错误日志:
cat /dev/null > /var/log/mysql/error.log

清理慢查询日志:
cat /dev/null > /var/log/mysql/mysql-slow.log

2. 日志轮转

手动轮转日志:
mysql> FLUSH LOGS;

输出示例:
Query OK, 0 rows affected (0.01 sec)

验证轮转:
mysql> SHOW BINARY LOGS;

输出示例:
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 256 |
| mysql-bin.000002 | 154 |
+——————+———–+

3. 日志备份

备份二进制日志:
cp /var/lib/mysql/mysql-bin.* /backup/mysql/binlog/

输出示例:
Copied 10 files.

压缩备份:
tar -czvf binlog_$(date +%Y%m%d).tar.gz /var/lib/mysql/mysql-bin.*

输出示例:
binlog_20260401.tar.gz

4. 日志分析

分析慢查询:
mysqldumpslow -s t /var/log/mysql/mysql-slow.log

输出示例:
Count: 100 Time=5.00s (500s) Lock=0.00s (0s) Rows=1000.0 (100000)
SELECT * FROM users WHERE name LIKE ‘S’

分析二进制日志:
mysqlbinlog –stat /var/lib/mysql/mysql-bin.000001

输出示例:
# Statistic: 100 transactions, 1000 rows

5. 日志监控

监控日志大小:
watch -n 60 ‘ls -lh /var/log/mysql/’

输出示例:
-rw-r—– 1 mysql mysql 10M Apr 1 10:00 error.log
-rw-r—– 1 mysql mysql 100M Apr 1 10:00 mysql-slow.log
-rw-r—– 1 mysql mysql 1G Apr 1 10:00 mysql-bin.000001

监控日志增长:
while true; do
ls -lh /var/log/mysql/mysql-bin.* | awk ‘{print $5, $9}’
sleep 60
done

Part04-生产案例与实战讲解

4.1 错误日志优化案例

以下是错误日志优化的实战案例:

# 错误日志优化案例

# 案例:错误日志过大问题

# 问题描述:
# 错误日志文件过大,占用大量磁盘空间

# 步骤1:查看错误日志大小
ls -lh /var/log/mysql/error.log

# 输出示例:
# -rw-r—– 1 mysql mysql 1G Apr 1 10:00 error.log

# 步骤2:分析错误日志内容
grep -c “\[ERROR\]” /var/log/mysql/error.log

# 输出示例:
# 100000

# 步骤3:查看错误类型分布
grep “\[ERROR\]” /var/log/mysql/error.log | cut -d’]’ -f3 | sort | uniq -c | sort -rn

# 输出示例:
# 50000 [MY-010267] [Server] Out of memory
# 30000 [MY-013183] [InnoDB] Assertion failure
# 20000 [MY-010068] [Server] CA certificate is self signed

# 步骤4:优化错误日志配置
vim /etc/my.cnf

[mysqld]
log_error_verbosity = 2
log_error_services = ‘log_filter_internal; log_sink_internal’

# 步骤5:配置日志轮转
vim /etc/logrotate.d/mysql

/var/log/mysql/error.log {
daily
rotate 7
size 100M
missingok
create 640 mysql mysql
compress
delaycompress
postrotate
mysqladmin flush-logs
endscript
}

# 步骤6:重启MySQL
systemctl restart mysqld

# 输出示例:
# MySQL service restarted.

# 优化效果:
# +——————+————+————+
# | 指标 | 优化前 | 优化后 |
# +——————+————+————+
# | 日志大小 | 1GB | 100MB |
# | 错误数量 | 100000 | 1000 |
# | 磁盘占用 | 高 | 低 |
# +——————+————+————+

4.2 慢查询日志案例

以下是慢查询日志分析的实战案例:

# 慢查询日志案例

# 案例:慢查询优化

# 问题描述:
# 数据库响应慢,需要分析慢查询

# 步骤1:查看慢查询数量
mysql> SHOW STATUS LIKE ‘Slow_queries’;

# 输出示例:
# +—————+——-+
# | Variable_name | Value |
# +—————+——-+
# | Slow_queries | 10000 |
# +—————+——-+

# 步骤2:分析慢查询日志
pt-query-digest /var/log/mysql/mysql-slow.log > /tmp/slow_report.txt

# 输出示例:
# # 3600s user time, 10s system time
# # Attribute total min max avg 95% stddev median
# # ============ ======= ======= ======= ======= ======= =======
# # Count 10000
# # Exec time 50000s 2s 100s 5s 10s 8s 3s

# 步骤3:查看Top 10慢查询
head -100 /tmp/slow_report.txt

# 输出示例:
# # Query 1: 100 QPS, 5x concurrency
# SELECT * FROM users WHERE name LIKE ‘%test%’

# 步骤4:优化慢查询
mysql> EXPLAIN SELECT * FROM users WHERE name LIKE ‘%test%’;

# 输出示例:
# +—-+————-+——-+——+—————+——+———+——+——–+————-+
# | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
# +—-+————-+——-+——+—————+——+———+——+——–+————-+
# | 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 100000 | Using where |
# +—-+————-+——-+——+—————+——+———+——+——–+————-+

# 步骤5:添加索引
mysql> CREATE INDEX idx_name ON users(name);

# 输出示例:
# Query OK, 0 rows affected (10.00 sec)

# 步骤6:验证优化效果
mysql> EXPLAIN SELECT * FROM users WHERE name LIKE ‘test%’;

# 输出示例:
# +—-+————-+——-+——-+—————+———-+———+——+——+————————–+
# | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
# +—-+————-+——-+——-+—————+———-+———+——+——+————————–+
# | 1 | SIMPLE | users | range | idx_name | idx_name | 102 | NULL | 100 | Using where; Using index |
# +—-+————-+——-+——-+—————+———-+———+——+——+————————–+

# 性能对比:
# +——————+————+————+
# | 指标 | 优化前 | 优化后 |
# +——————+————+————+
# | 查询时间 | 5s | 0.1s |
# | 扫描行数 | 100000 | 100 |
# | 慢查询数量 | 10000 | 100 |
# +——————+————+————+

4.3 二进制日志案例

以下是二进制日志管理的实战案例:

# 二进制日志案例

# 案例:二进制日志空间管理

# 问题描述:
# 二进制日志占用大量磁盘空间

# 步骤1:查看二进制日志大小
mysql> SELECT
SUM(FILE_SIZE) / 1024 / 1024 / 1024 AS total_gb
FROM information_schema.FILES
WHERE FILE_NAME LIKE ‘%mysql-bin%’;

# 输出示例:
# +———–+
# | total_gb |
# +———–+
# | 100.00 |
# +———–+

# 步骤2:查看日志列表
mysql> SHOW BINARY LOGS;

# 输出示例:
# +——————+———–+
# | Log_name | File_size |
# +——————+———–+
# | mysql-bin.000001 | 1G |
# | mysql-bin.000002 | 1G |
# …
# | mysql-bin.000100 | 1G |
# +——————+———–+

# 步骤3:优化过期配置
mysql> SET GLOBAL expire_logs_days = 3;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 步骤4:清理旧日志
mysql> PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);

# 输出示例:
# Query OK, 0 rows affected (1.00 sec)

# 步骤5:开启日志压缩
mysql> SET GLOBAL binlog_transaction_compression = ON;
mysql> SET GLOBAL binlog_transaction_compression_level_zstd = 3;

# 输出示例:
# Query OK, 0 rows affected (0.00 sec)

# 步骤6:验证优化效果
mysql> SELECT
SUM(FILE_SIZE) / 1024 / 1024 / 1024 AS total_gb
FROM information_schema.FILES
WHERE FILE_NAME LIKE ‘%mysql-bin%’;

# 输出示例:
# +———–+
# | total_gb |
# +———–+
# | 10.00 |
# +———–+

# 优化效果:
# +——————+————+————+
# | 指标 | 优化前 | 优化后 |
# +——————+————+————+
# | 日志总大小 | 100GB | 10GB |
# | 保留天数 | 30天 | 3天 |
# | 压缩率 | 0% | 70% |
# +——————+————+————+

Part05-风哥经验总结与分享

5.1 日志最佳实践

以下是MySQL日志的最佳实践:

# 日志最佳实践

1. 错误日志最佳实践

– 设置合适的日志级别
– 配置日志轮转
– 定期检查错误日志
– 监控关键错误

2. 慢查询日志最佳实践

– 设置合理的阈值(2-5秒)
– 开启索引检查
– 定期分析优化
– 使用pt-query-digest工具

3. 二进制日志最佳实践

– 开启二进制日志
– 使用ROW格式
– 设置合理的过期时间
– 定期备份日志

4. 日志存储最佳实践

– 使用独立磁盘存储
– 预留足够空间
– 配置日志轮转
– 监控磁盘使用

5. 日志安全最佳实践

– 设置合适的文件权限
– 限制日志访问
– 敏感信息脱敏
– 日志审计

5.2 日志限制

以下是MySQL日志的主要限制:

# 日志限制

1. 性能影响

– 日志写入影响性能
– 一般查询日志影响最大
– 二进制日志影响写入性能
– 慢查询日志影响较小

2. 存储限制

– 日志占用磁盘空间
– 需要定期清理
– 需要预留足够空间
– 需要配置轮转

3. 功能限制

– 查询缓存已移除
– 部分日志无法动态关闭
– 日志格式有限制
– 日志分析需要工具

4. 安全限制

– 日志可能包含敏感信息
– 需要设置访问权限
– 需要定期审计
– 需要合规处理

5. 兼容性限制

– 不同版本配置不同
– 日志格式有差异
– 工具兼容性问题
– 升级需要调整

5.3 日志检查清单

以下是MySQL日志的检查清单:

# 日志检查清单

1. 设计阶段检查

[ ] 是否规划了日志类型
[ ] 是否设置了日志目录
[ ] 是否配置了日志轮转
[ ] 是否规划了监控方案

2. 配置阶段检查

[ ] 错误日志是否配置
[ ] 慢查询日志是否开启
[ ] 二进制日志是否开启
[ ] 日志权限是否正确

3. 运维阶段检查

[ ] 是否监控了日志大小
[ ] 是否定期清理日志
[ ] 是否分析了慢查询
[ ] 是否备份了二进制日志

4. 安全阶段检查

[ ] 日志权限是否正确
[ ] 是否限制了日志访问
[ ] 是否审计了日志内容
[ ] 是否合规处理了日志

风哥提示:日志是MySQL运维的重要组成部分,合理的日志配置可以帮助快速定位问题和优化性能。建议生产环境开启错误日志、慢查询日志和二进制日志,关闭一般查询日志。慢查询阈值建议设置为2-5秒,并开启索引检查。二进制日志建议使用ROW格式,设置7天过期时间。定期使用pt-query-digest分析慢查询日志,找出需要优化的SQL语句。更多视频教程请访问www.fgedu.net.cn

注意:本文档内容基于MySQL 8.4官方文档编写,适合DBA人员在学习和测试中使用。在生产环境中应用时,请务必进行充分的测试和验证。日志配置需要根据实际业务需求和硬件资源进行调整。文档中的命令和配置可能因MySQL版本不同而有所差异,请根据实际情况进行调整。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息