1. 首页 > MySQL教程 > 正文

MySQL教程FG029-MySQL安装后的日志配置

本文档风哥主要介绍MySQL 8.4安装后的日志配置,包括错误日志、慢查询日志、二进制日志和一般查询日志等的配置和管理。风哥教程参考MySQL官方文档MySQL Server
Administration等。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 MySQL日志的重要性

MySQL日志是数据库管理和故障排查的重要工具,通过日志可以追踪数据库操作历史、排查错误和异常、分析性能问题、进行安全审计并实现数据恢复。学习交流加群风哥微信: itpux-com

1.2 MySQL日志类型

MySQL提供了多种类型的日志,每种日志都有其特定的用途:

  • 错误日志:记录服务器启动、运行和关闭过程中的错误信息,用于故障排查
  • 慢查询日志:记录执行时间超过阈值的SQL语句,用于性能优化
  • 一般查询日志:记录所有SQL语句的执行情况,用于审计和故障排查
  • 二进制日志:记录数据修改操作,用于复制和数据恢复
  • 中继日志:从主库接收的二进制日志,用于复制
  • DDL日志:记录DDL语句的执行情况,用于故障恢复

1.3 MySQL日志系统架构

MySQL日志系统采用分层架构,不同类型的日志由不同的组件负责生成和管理:

  • 服务器层日志:错误日志、一般查询日志、慢查询日志
  • 存储引擎层日志:InnoDB重做日志、回滚日志
  • 复制相关日志:二进制日志、中继日志

Part02-生产环境规划与建议

2.1 日志配置规划

在生产环境中配置MySQL日志时,需要考虑以下因素:

  • 日志类型选择:根据业务需求选择需要启用的日志类型
  • 日志级别设置:根据故障排查需求设置适当的日志级别
  • 日志文件路径:将日志文件存储在独立的磁盘分区,避免影响数据文件性能
  • 日志轮转策略:配置合理的日志轮转策略,避免日志文件过大

2.2 日志存储策略

日志存储策略建议:

  • 将日志文件存储在与数据文件不同的磁盘分区
  • 对于二进制日志,考虑使用SSD存储以提高写入性能
  • 配置适当的日志保留期限,平衡存储成本和故障排查需求
  • 定期备份日志文件,用于长期归档和审计

2.3 日志安全考虑

日志安全是数据库安全的重要组成部分:

  • 设置正确的日志文件权限,仅允许MySQL用户和管理员访问
  • 对于包含敏感信息的日志,考虑加密存储
  • 限制日志文件的访问网络范围
  • 定期审查日志访问记录

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

3.1 错误日志配置

错误日志记录了MySQL服务器启动、运行和关闭过程中的错误信息,是故障排查的重要依据。学习交流加群风哥QQ113257174

# 在my.cnf中配置错误日志
vi /etc/my.cnf

[mysqld]
# 错误日志文件路径
log_error=/mysql/logs/error.log

# 错误日志级别 (0=错误, 1=警告, 2=注意, 3=信息)
error_log_verbosity=3

# 重启MySQL服务使配置生效
systemctl restart mysqld

# 验证错误日志配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘log_error%’;”
Enter password: Fgedu123!
+———————+——————+
| Variable_name | Value |
+———————+——————+
| log_error | /mysql/logs/error.log |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_suppression_list | |
| log_error_verbosity | 3 |
+———————+——————+

3.1.1 错误日志轮转配置

为了避免错误日志过大,可以配置logrotate进行日志轮转:

# 创建logrotate配置文件
cat > /etc/logrotate.d/mysql << 'EOF' /mysql/logs/error.log { daily rotate 7 missingok compress delaycompress notifempty create 640 mysql mysql postrotate # 通知MySQL重新打开日志文件 if [ -f /mysql/data/mysqld.pid ]; then kill -HUP $(cat /mysql/data/mysqld.pid) fi endscript } EOF

3.1.2 查看错误日志

# 查看最近的错误日志
tail -n 100 /mysql/logs/error.log

# 搜索特定错误
grep “ERROR” /mysql/logs/error.log

# 实时监控错误日志
tail -f /mysql/logs/error.log

3.2 慢查询日志配置

慢查询日志记录了执行时间超过阈值的SQL语句,是性能优化的重要工具。

# 在my.cnf中配置慢查询日志
vi /etc/my.cnf

[mysqld]
# 启用慢查询日志
slow_query_log=ON

# 慢查询日志文件路径
slow_query_log_file=/mysql/logs/slow-query.log

# 慢查询阈值(秒)
long_query_time=1

# 记录未使用索引的查询
log_queries_not_using_indexes=ON

# 记录管理语句
log_slow_admin_statements=ON

# 记录包含绑定变量的语句
log_slow_slave_statements=ON

# 重启MySQL服务使配置生效
systemctl restart mysqld

# 验证慢查询日志配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%slow%’;”
Enter password: Fgedu123!
+—————————+—————————+
| Variable_name | Value |
+—————————+—————————+
| log_slow_admin_statements | ON |
| log_slow_extra | OFF |
| log_slow_slave_statements | ON |
| slow_query_log | ON |
| slow_query_log_file | /mysql/logs/slow-query.log |
+—————————+—————————+

3.2.1 慢查询日志格式

慢查询日志的格式示例:

# Time: 2026-04-01T10:00:00.000000Z
# User@Host: root[root] @ localhost [] Id: 12345
# Query_time: 2.500000 Lock_time: 0.000000 Rows_sent: 1000 Rows_examined: 1000000
SET timestamp=1772570400;
SELECT * FROM fgedu_users WHERE age > 30;

3.2.2 分析慢查询日志

使用mysqldumpslow工具分析慢查询日志:

# 查看最慢的10条查询
mysqldumpslow -s t -t 10 /mysql/logs/slow-query.log

# 查看最多查询的SQL模板
mysqldumpslow -s c -t 10 /mysql/logs/slow-query.log

# 查看扫描行数最多的查询
mysqldumpslow -s r -t 10 /mysql/logs/slow-query.log

# 查看带有完整SQL语句的慢查询
mysqldumpslow -v /mysql/logs/slow-query.log

3.3 一般查询日志配置

一般查询日志记录了所有SQL语句的执行情况,主要用于审计和故障排查。注意:一般查询日志会产生大量日志,建议仅在需要时临时启用。风哥提示:一般查询日志包含敏感信息,生产环境中应谨慎使用。

# 在my.cnf中配置一般查询日志
vi /etc/my.cnf

[mysqld]
# 启用一般查询日志(生产环境建议关闭)
general_log=OFF

# 一般查询日志文件路径
general_log_file=/mysql/logs/general-query.log

# 重启MySQL服务使配置生效
systemctl restart mysqld

# 验证一般查询日志配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘general_log%’;”
Enter password: Fgedu123!
+——————+————————–+
| Variable_name | Value |
+——————+————————–+
| general_log | OFF |
| general_log_file | /mysql/logs/general-query.log |
+——————+————————–+

3.3.1 临时启用一般查询日志

# 临时启用一般查询日志
mysql -u root -p -e “SET GLOBAL general_log = ‘ON’;”
Enter password: Fgedu123!

# 临时禁用一般查询日志
mysql -u root -p -e “SET GLOBAL general_log = ‘OFF’;”
Enter password: Fgedu123!

3.4 二进制日志配置

二进制日志记录了数据修改操作,用于复制和数据恢复,是MySQL高可用架构的基础。

# 在my.cnf中配置二进制日志
vi /etc/my.cnf

[mysqld]
# 启用二进制日志
log_bin=mysql-bin

# 二进制日志文件路径
default_storage_engine=InnoDB
server-id=1

# 二进制日志格式 (ROW, STATEMENT, MIXED)
binlog_format=ROW

# 二进制日志过期时间(天)
binlog_expire_logs_seconds=604800 # 7天

# 二进制日志大小限制
max_binlog_size=100M

# 同步二进制日志到磁盘的方式
sync_binlog=1

# 重启MySQL服务使配置生效
systemctl restart mysqld

# 验证二进制日志配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%binlog%’;”
Enter password: Fgedu123!
+——————————————–+———————-+
| Variable_name | Value |
+——————————————–+———————-+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_expire_logs_seconds | 604800 |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_rotate_age_wait | 0 |
| binlog_rotate_size | 0 |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
| binlog_use_v1_row_events | OFF |
| log_bin | ON |
| log_bin_basename | /mysql/data/mysql-bin |
| log_bin_index | /mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| max_binlog_size | 104857600 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+——————————————–+———————-+

3.4.1 二进制日志管理

# 查看二进制日志文件列表
mysql -u root -p -e “SHOW BINARY LOGS;”
Enter password: Fgedu123!
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 154 |
| mysql-bin.000002 | 120 |
+——————+———–+

# 查看当前二进制日志文件
mysql -u root -p -e “SHOW MASTER STATUS;”
Enter password: Fgedu123!
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000002 | 120 | | | |
+——————+———-+————–+——————+——————-+

# 刷新二进制日志
mysql -u root -p -e “FLUSH BINARY LOGS;”
Enter password: Fgedu123!

# 清理二进制日志(保留最近的3个)
mysql -u root -p -e “PURGE BINARY LOGS TO ‘mysql-bin.000003’;”
Enter password: Fgedu123!

# 清理指定日期之前的二进制日志
mysql -u root -p -e “PURGE BINARY LOGS BEFORE ‘2026-04-01 00:00:00’;”
Enter password: Fgedu123!

Part04-生产案例与实战讲解

4.1 日志轮转配置案例

配置完整的MySQL日志轮转策略:

# 创建完整的logrotate配置
cat > /etc/logrotate.d/mysql << 'EOF' /mysql/logs/error.log { daily rotate 7 missingok compress delaycompress notifempty create 640 mysql mysql postrotate if [ -f /mysql/data/mysqld.pid ]; then kill -HUP $(cat /mysql/data/mysqld.pid) fi endscript } /mysql/logs/slow-query.log { weekly rotate 4 missingok compress delaycompress notifempty create 640 mysql mysql postrotate if [ -f /mysql/data/mysqld.pid ]; then kill -HUP $(cat /mysql/data/mysqld.pid) fi endscript } /mysql/logs/general-query.log { daily rotate 3 missingok compress delaycompress notifempty create 640 mysql mysql postrotate if [ -f /mysql/data/mysqld.pid ]; then kill -HUP $(cat /mysql/data/mysqld.pid) fi endscript } EOF # 手动执行日志轮转测试 logrotate -v /etc/logrotate.d/mysql

4.2 慢查询日志分析案例

使用pt-query-digest工具分析慢查询日志:

# 安装Percona Toolkit
yum install -y percona-toolkit

# 使用pt-query-digest分析慢查询日志
pt-query-digest /mysql/logs/slow-query.log

# 分析并输出到文件
pt-query-digest /mysql/logs/slow-query.log > slow_query_analysis.txt

# 查看分析结果
tail -n 50 slow_query_analysis.txt

4.3 基于二进制日志的数据恢复

使用二进制日志恢复误删除的数据:

# 模拟数据误删除
mysql -u root -p -e “CREATE DATABASE IF NOT EXISTS fgedudb; USE fgedudb; CREATE TABLE
fgedu_users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT); INSERT INTO
fgedu_users (name, age) VALUES (‘张三’, 25), (‘李四’, 30);”
Enter password: Fgedu123!

# 记录当前二进制日志位置
mysql -u root -p -e “SHOW MASTER STATUS;”
Enter password: Fgedu123!

# 执行误删除操作
mysql -u root -p -e “USE fgedudb; DROP TABLE fgedu_users;”
Enter password: Fgedu123!

# 查看二进制日志内容
mysqlbinlog /mysql/data/mysql-bin.000002

# 恢复数据(假设误删除操作在位置100到200之间)
mysqlbinlog –start-position=154 –stop-position=280 /mysql/data/mysql-bin.000002 | mysql -u
root -p
Enter password: Fgedu123!

# 验证数据是否恢复
mysql -u root -p -e “USE fgedudb; SELECT * FROM fgedu_users;”
Enter password: Fgedu123!
+—-+——+—–+
| id | name | age |
+—-+——+—–+
| 1 | 张三 | 25 |
| 2 | 李四 | 30 |
+—-+——+—–+

Part05-风哥经验总结与分享

5.1 日志配置最佳实践

风哥提示:MySQL日志配置需要根据业务需求和系统规模进行调整,以下是一些通用的最佳实践:
  • 错误日志:始终启用,设置verbosity=3以获取详细信息,配置日志轮转保留7天
  • 慢查询日志:始终启用,设置long_query_time=1秒,记录未使用索引的查询
  • 一般查询日志:生产环境默认关闭,仅在故障排查时临时启用
  • 二进制日志:启用ROW格式,设置适当的过期时间,sync_binlog=1确保数据安全
  • 日志存储:将日志文件存储在与数据文件不同的磁盘分区,避免I/O冲突
  • 日志权限:设置640权限,仅允许mysql用户和管理员访问

5.2 常见问题与解决方案

# 问题1:日志文件过大导致磁盘空间不足
# 解决方案:配置合适的日志轮转策略和过期时间

# 问题2:慢查询日志无记录
# 解决方案:检查long_query_time设置是否合理,验证慢查询日志是否启用
mysql -u root -p -e “SHOW VARIABLES LIKE ‘slow_query_log%’; SHOW VARIABLES LIKE
‘long_query_time’;”

# 问题3:二进制日志丢失导致复制失败
# 解决方案:设置合理的binlog_expire_logs_seconds,定期备份二进制日志

# 问题4:错误日志权限问题导致无法写入
# 解决方案:检查日志文件和目录的权限
chown -R mysql:mysql /mysql/logs/
chmod 750 /mysql/logs/
chmod 640 /mysql/logs/*

5.3 日志监控与告警

生产环境中,建议配置日志监控和告警,及时发现数据库问题:

  • 使用Prometheus+Grafana监控日志文件大小和增长速度
  • 配置ELK Stack集中管理和分析MySQL日志
  • 使用脚本定期检查错误日志中的关键错误信息
  • 配置告警规则,当出现严重错误或慢查询增多时及时通知管理员

更多学习教程公众号风哥教程itpux_com

from MySQL:www.itpux.com

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

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

联系我们

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

微信号:itpux-com

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