GoldenDB教程FG022-GoldenDB日志管理-慢查询日志与审计日志分析
本文主要介绍GoldenDB数据库的日志管理,包括慢查询日志和审计日志的配置、分析与优化。风哥教程参考GoldenDB官方文档GoldenDB8系统管理员手册、GoldenDB8安全管理等相关文档。
通过本文的学习,您将掌握GoldenDB日志系统的工作原理,学会如何配置和分析慢查询日志,以及如何利用审计日志进行安全监控和合规检查。
本教程适用于GoldenDB数据库管理员和开发人员,帮助您在生产环境中有效地管理和分析数据库日志。
目录大纲
Part01-基础概念与理论知识
1.1 GoldenDB日志系统概述
GoldenDB数据库的日志系统包含多种类型的日志,主要包括:
- 运行日志:记录数据库服务的启动、停止、错误等信息
- 慢查询日志:记录执行时间超过阈值的SQL语句
- 审计日志:记录用户的登录、操作等安全相关信息
- Binlog日志:记录数据变更,用于主备复制和恢复
这些日志对于数据库的运行监控、性能优化、安全审计和故障排查都具有重要意义。
更多视频教程www.fgedu.net.cn
1.2 慢查询日志原理与作用
慢查询日志用于记录执行时间超过设定阈值的SQL语句,帮助数据库管理员识别和优化性能瓶颈。
慢查询日志的主要作用包括:
- 识别执行效率低下的SQL语句
- 分析SQL语句的执行计划
- 优化数据库性能
- 监控应用程序的SQL执行情况
学习交流加群风哥微信: itpux-com
1.3 审计日志原理与作用
审计日志用于记录用户对数据库的操作,包括登录、查询、修改等,帮助实现安全审计和合规检查。
审计日志的主要作用包括:
- 记录用户的所有操作,实现操作可追溯
- 检测和防止未授权访问
- 满足合规要求,如等保、分保等
- 用于安全事件的调查和分析
学习交流加群风哥QQ113257174
Part02-生产环境规划与建议
2.1 日志存储规划
在生产环境中,日志存储规划需要考虑以下因素:
- 存储容量:根据日志生成速度和保留时间计算所需空间
- 存储位置:建议将日志存储在独立的磁盘分区,避免影响数据库性能
- 备份策略:定期备份重要日志,防止日志丢失
- 访问权限:设置适当的权限,确保日志安全
风哥提示:日志存储位置应与数据文件分离,避免I/O竞争影响数据库性能。
2.2 日志级别与保留策略
合理设置日志级别和保留策略对于日志管理至关重要:
- 慢查询日志:设置适当的时间阈值,避免日志过大
- 审计日志:根据安全要求设置审计级别,平衡安全性和性能
- 保留策略:根据业务需求和合规要求设置日志保留时间
- 轮转策略:定期轮转日志,避免单个日志文件过大
更多学习教程公众号风哥教程itpux_com
2.3 性能影响评估
日志系统会对数据库性能产生一定影响,需要进行评估:
- 慢查询日志:开启会增加一定的CPU和I/O开销
- 审计日志:详细的审计会显著增加系统开销
- 优化建议:根据实际需求调整日志级别,在性能和可观测性之间取得平衡
from GoldenDB视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 慢查询日志配置
在GoldenDB中配置慢查询日志的步骤:
$ mysql -h 192.168.1.10 -P 3306 -u fgedu -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1001
Server version: 8.0.28 GoldenDB 8.0.28-1.0.0-log
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>
mysql> SHOW VARIABLES LIKE ‘%slow%’;
| Variable_name | Value |
+—————————+——————————-+
| slow_query_log | OFF |
| slow_query_log_file | /goldendb/fgdata/slow.log |
| long_query_time | 10.000000 |
| log_queries_not_using_indexes | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
+—————————+——————————-+
6 rows in set (0.00 sec)
mysql> SET GLOBAL slow_query_log = ‘ON’;
mysql> SET GLOBAL long_query_time = 1;
mysql> SET GLOBAL log_queries_not_using_indexes = ‘ON’;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE ‘%slow%’;
| Variable_name | Value |
+—————————+——————————-+
| slow_query_log | ON |
| slow_query_log_file | /goldendb/fgdata/slow.log |
| long_query_time | 1.000000 |
| log_queries_not_using_indexes | ON |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
+—————————+——————————-+
6 rows in set (0.00 sec)
3.2 审计日志配置
在GoldenDB中配置审计日志的步骤:
mysql> SHOW VARIABLES LIKE ‘%audit%’;
| Variable_name | Value |
+————————–+——————————-+
| audit_log_enabled | OFF |
| audit_log_file | /goldendb/fgdata/audit.log |
| audit_log_format | OLD |
| audit_log_policy | ALL |
| audit_log_rotate_on_size | 104857600 |
+————————–+——————————-+
5 rows in set (0.00 sec)
mysql> SET GLOBAL audit_log_enabled = ‘ON’;
mysql> SET GLOBAL audit_log_format = ‘JSON’;
mysql> SET GLOBAL audit_log_rotate_on_size = 1048576000; — 1GB
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE ‘%audit%’;
| Variable_name | Value |
+————————–+——————————-+
| audit_log_enabled | ON |
| audit_log_file | /goldendb/fgdata/audit.log |
| audit_log_format | JSON |
| audit_log_policy | ALL |
| audit_log_rotate_on_size | 1048576000 |
+————————–+——————————-+
5 rows in set (0.00 sec)
3.3 日志轮转与清理策略
配置日志轮转与清理策略,避免日志文件过大:
# log_rotate.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# GoldenDB日志轮转脚本
# 日志目录
LOG_DIR=”/goldendb/fgdata”
# 慢查询日志轮转
mv ${LOG_DIR}/slow.log ${LOG_DIR}/slow.log.$(date +%Y%m%d)
touch ${LOG_DIR}/slow.log
chown goldendb:goldendb ${LOG_DIR}/slow.log
# 审计日志轮转
mv ${LOG_DIR}/audit.log ${LOG_DIR}/audit.log.$(date +%Y%m%d)
touch ${LOG_DIR}/audit.log
chown goldendb:goldendb ${LOG_DIR}/audit.log
# 清理7天前的日志
find ${LOG_DIR} -name “*.log.*” -mtime +7 -delete
echo “Log rotation completed at $(date)”
# crontab -e
0 0 * * * /goldendb/app/scripts/log_rotate.sh >> /goldendb/app/scripts/log_rotate.log 2>&1
Part04-生产案例与实战讲解
4.1 慢查询日志分析实战
分析慢查询日志,识别性能问题:
# tail -n 100 /goldendb/fgdata/slow.log
# User@Host: fgedu[ fgedu] @ 192.168.1.20 [192.168.1.20]
# Query_time: 2.567890 Lock_time: 0.000123 Rows_sent: 1000 Rows_examined: 1000000
SELECT * FROM fgedu_user WHERE age > 30;
# Time: 2024-01-01T10:05:00.000000Z
# User@Host: fgedu[ fgedu] @ 192.168.1.20 [192.168.1.20]
# Query_time: 1.897654 Lock_time: 0.000098 Rows_sent: 500 Rows_examined: 500000
SELECT * FROM fgedu_order WHERE order_date >= ‘2024-01-01’;
$ pt-query-digest /goldendb/fgdata/slow.log
# Current date: Mon Jan 1 10:10:00 2024
# Hostname: fgedu.net.cn
# Files: /goldendb/fgdata/slow.log
# Overall: 2 total, 2 unique, 0.00 QPS, 0.00x concurrency, 2.23s avg query time, 4.46s total
# Time range: 2024-01-01T10:00:00 to 2024-01-01T10:05:00
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 4s 1.9s 2.6s 2.2s 2.6s 0.5s 2.2s
# Lock time 221us 98us 123us 110us 123us 17us 110us
# Rows sent 1.5k 500 1.0k 750 1.0k 354 750
# Rows examine 1.5M 500k 1.0M 750k 1.0M 354k 750k
# Query size 84 40 44 42 44 2.8 42
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============= ===== ====== ===== ==========
# 1 0xF1A2B3C4D5E6F7 2.57s 57.6% 1 2.57s 0.00 SELECT fgedu_user
# 2 0xA1B2C3D4E5F678 1.89s 42.4% 1 1.89s 0.00 SELECT fgedu_order
# Query 1: 0 QPS, 0.00x concurrency, ID 0xF1A2B3C4D5E6F7 at byte 0
# This item is included in the report because it matches –limit.
# Scores: V/M = 0.00
# Time range: 2024-01-01T10:00:00 to 2024-01-01T10:00:00
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 50 1
# Exec time 58 2.6s 2.6s 2.6s 2.6s 2.6s 0 2.6s
# Lock time 56 123us 123us 123us 123us 123us 0 123us
# Rows sent 67 1.0k 1.0k 1.0k 1.0k 1.0k 0 1.0k
# Rows examine 67 1.0M 1.0M 1.0M 1.0M 1.0M 0 1.0M
# Query size 48 40 40 40 40 40 0 40
# String:
# Hosts 192.168.1.20
# Users fgedu
# Query_time distribution
# 1s-2s ################################################################
# 2s-5s ################################################################
# 5s+
# Tables
# Name
# fgedu_user
# EXPLAIN /*!50100 PARTITIONS*/
# SELECT * FROM fgedu_user WHERE age > 30;
mysql> CREATE INDEX idx_age ON fgedu_user(age);
Records: 0 Duplicates: 0 Warnings: 0
mysql> CREATE INDEX idx_order_date ON fgedu_order(order_date);
Records: 0 Duplicates: 0 Warnings: 0
4.2 审计日志分析实战
分析审计日志,监控用户操作:
# tail -n 10 /goldendb/fgdata/audit.log
{“timestamp”: “2024-01-01T10:00:01Z”, “record_id”: “2”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “select”, “query”: “SELECT * FROM fgedu_user WHERE age > 30”, “status”: 0, “error_code”: 0}
{“timestamp”: “2024-01-01T10:00:02Z”, “record_id”: “3”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “select”, “query”: “SELECT * FROM fgedu_order WHERE order_date >= ‘2024-01-01′”, “status”: 0, “error_code”: 0}
{“timestamp”: “2024-01-01T10:00:03Z”, “record_id”: “4”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “create index”, “query”: “CREATE INDEX idx_age ON fgedu_user(age)”, “status”: 0, “error_code”: 0}
{“timestamp”: “2024-01-01T10:00:04Z”, “record_id”: “5”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “create index”, “query”: “CREATE INDEX idx_order_date ON fgedu_order(order_date)”, “status”: 0, “error_code”: 0}
{“timestamp”: “2024-01-01T10:00:05Z”, “record_id”: “6”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “disconnect”, “query”: “DISCONNECT”, “status”: 0, “error_code”: 0}
$ cat /goldendb/fgdata/audit.log | jq ‘. | select(.command_class == “select”) | {timestamp: .timestamp, user: .user, query: .query}’
“timestamp”: “2024-01-01T10:00:01Z”,
“user”: “fgedu”,
“query”: “SELECT * FROM fgedu_user WHERE age > 30”
}
{
“timestamp”: “2024-01-01T10:00:02Z”,
“user”: “fgedu”,
“query”: “SELECT * FROM fgedu_order WHERE order_date >= ‘2024-01-01′”
}
4.3 日志监控与告警配置
配置日志监控与告警,及时发现异常:
# log_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# GoldenDB日志监控脚本
# 慢查询日志监控
SLOW_LOG=”/goldendb/fgdata/slow.log”
THRESHOLD=5
# 检查慢查询数量
SLOW_COUNT=$(grep -c “Query_time:” $SLOW_LOG)
if [ $SLOW_COUNT -gt $THRESHOLD ]; then
echo “警告:慢查询数量超过阈值!”
# 发送告警邮件或短信
# mail -s “GoldenDB慢查询告警” admin@fgedu.net.cn << EOF
# 慢查询数量:$SLOW_COUNT
# 请及时分析慢查询日志
# EOF
fi
# 审计日志监控
AUDIT_LOG="/goldendb/fgdata/audit.log"
# 检查失败登录
FAILED_LOGIN=$(grep -c "error_code":[1-9] $AUDIT_LOG)
if [ $FAILED_LOGIN -gt 0 ]; then
echo "警告:发现失败登录尝试!"
# 发送告警邮件或短信
fi
echo "日志监控完成于 $(date)"
# crontab -e
*/5 * * * * /goldendb/app/scripts/log_monitor.sh >> /goldendb/app/scripts/log_monitor.log 2>&1
Part05-风哥经验总结与分享
5.1 日志管理最佳实践
- 合理设置日志级别:根据实际需求调整日志级别,避免过度记录导致性能下降
- 定期分析慢查询:每周至少分析一次慢查询日志,及时优化SQL语句
- 实施日志轮转:配置合理的日志轮转策略,避免日志文件过大
- 备份重要日志:定期备份审计日志等重要日志,满足合规要求
- 使用工具分析:利用pt-query-digest等工具进行慢查询分析,提高效率
5.2 常见问题与解决方案
- 慢查询日志过大:
- 原因:设置的时间阈值过低,导致大量SQL被记录
- 解决方案:根据业务特点调整long_query_time参数,通常设置为1-3秒
- 审计日志影响性能:
- 原因:审计级别过高,记录了过多的操作
- 解决方案:根据安全要求调整audit_log_policy参数,只记录必要的操作
- 日志文件丢失:
- 原因:磁盘空间不足或权限问题
- 解决方案:定期检查磁盘空间,确保日志目录有足够权限
5.3 性能优化建议
- 索引优化:为常用查询字段创建索引,减少全表扫描
- SQL优化:避免使用SELECT *,只查询必要的字段;使用WHERE条件过滤数据
- 参数调优:根据服务器配置调整数据库参数,如innodb_buffer_pool_size等
- 硬件优化:使用SSD存储日志,提高I/O性能
- 监控优化:建立完善的监控体系,及时发现和解决性能问题
风哥提示:日志管理是数据库运维的重要组成部分,合理的日志配置和分析可以帮助我们及时发现和解决问题,提高数据库的性能和安全性。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
