1. 首页 > 国产数据库教程 > GoldenDB教程 > 正文

GoldenDB教程FG022-GoldenDB日志管理-慢查询日志与审计日志分析

本文主要介绍GoldenDB数据库的日志管理,包括慢查询日志和审计日志的配置、分析与优化。风哥教程参考GoldenDB官方文档GoldenDB8系统管理员手册、GoldenDB8安全管理等相关文档。

通过本文的学习,您将掌握GoldenDB日志系统的工作原理,学会如何配置和分析慢查询日志,以及如何利用审计日志进行安全监控和合规检查。

本教程适用于GoldenDB数据库管理员和开发人员,帮助您在生产环境中有效地管理和分析数据库日志。

目录大纲

Part01-基础概念与理论知识

Part02-生产环境规划与建议

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

Part04-生产案例与实战讲解

Part05-风哥经验总结与分享

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中配置慢查询日志的步骤:

# 登录GoldenDB数据库
$ mysql -h 192.168.1.10 -P 3306 -u fgedu -p

Enter password:
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)

# 开启慢查询日志并设置阈值为1秒
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)

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)

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 日志轮转与清理策略

配置日志轮转与清理策略,避免日志文件过大:

#!/bin/bash
# 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

# Time: 2024-01-01T10:00:00.000000Z
# 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分析慢查询日志
$ pt-query-digest /goldendb/fgdata/slow.log

# 30ms user time, 20ms system time, 23.00M rss, 242.71M vsz
# 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;

风哥提示:从分析结果可以看出,这两个查询都没有使用索引,导致全表扫描,需要为age和order_date字段创建索引。

# 为fgedu_user表的age字段创建索引
mysql> CREATE INDEX idx_age ON fgedu_user(age);

Query OK, 0 rows affected (1.23 sec)
Records: 0 Duplicates: 0 Warnings: 0

# 为fgedu_order表的order_date字段创建索引
mysql> CREATE INDEX idx_order_date ON fgedu_order(order_date);

Query OK, 0 rows affected (1.56 sec)
Records: 0 Duplicates: 0 Warnings: 0

4.2 审计日志分析实战

分析审计日志,监控用户操作:

# 查看审计日志内容
# tail -n 10 /goldendb/fgdata/audit.log

{“timestamp”: “2024-01-01T10:00:00Z”, “record_id”: “1”, “server_id”: “1”, “host”: “192.168.1.20”, “user”: “fgedu”, “db”: “fgedudb”, “command_class”: “connect”, “query”: “CONNECT”, “status”: 0, “error_code”: 0}
{“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}

# 使用jq工具分析JSON格式的审计日志
$ 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 日志监控与告警配置

配置日志监控与告警,及时发现异常:

#!/bin/bash
# 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)"

# 设置定时任务,每5分钟执行一次监控
# 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

联系我们

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

微信号:itpux-com

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