摘要:KingbaseES 的运行日志不仅是故障排查的“黑匣子”,更是性能优化的“听诊器”。本文系统梳理了从日志配置、采集策略到深度解析(kbbadger、file_fdw)的全链路实践,帮助 DBA 构建高效的数据库可观测性体系。
一、 核心知识点速查表
为了方便资深 DBA 快速查阅,我们将核心配置与场景对应如下:
| 运维场景 | 关键参数/工具 | 推荐配置/说明 | 注意事项 |
|---|---|---|---|
| 启用日志收集 | logging_collector |
on | 修改后需重启数据库生效 |
| 慢查询记录 | log_min_duration_statement |
>0 (如 2000 ms) |
生产环境慎用 0 (记录所有SQL) |
| 记录DDL/DML | log_statement |
'mod' |
记录数据变更,便于审计 |
| 日志格式 | log_destination |
'stderr, csvlog' |
推荐双轨制,csvlog 便于程序分析 |
| 日志分析工具 | kbbadger |
$KINGBASE_HOME/Server/bin/kbbadger |
生成 HTML 报告,直观展示性能瓶颈 |
| 连接/断开记录 | log_connections |
on | 用于安全审计和排查连接风暴 |
二、 日志配置体系详解
KingbaseES 的日志配置主要分为四大类,合理的配置是后续分析的基础。
1. 日志收集器配置
logging_collector: 核心开关。默认on。- 作用:启动后台进程捕获
stderr和csvlog输出。 - 注意:修改此参数必须重启数据库实例。
- 作用:启动后台进程捕获
2. 日志文件管理
log_directory: 默认sys_log(位于数据目录下)。log_filename: 默认kingbase-%Y-%m-%d_%H%M%S.log。log_rotation_age/log_rotation_size: 控制日志切分。- 建议:生产环境通常按时间(如
1d)或大小(如100MB)切分。
- 建议:生产环境通常按时间(如
log_truncate_on_rotation: 默认为off。- 若设为
on,同名文件会被覆盖而非追加,适合固定数量的循环日志文件。
- 若设为
3. 日志输出目标 (log_destination)
支持多种输出方式,建议使用逗号分隔组合使用:
stderr: 标准文本日志,适合人类直接阅读 (tail -f)。csvlog: CSV 格式日志,适合机器解析和导入数据库分析。syslog/alertlog: 对接系统日志或生成专门的告警日志。
4. 日志内容控制
log_min_duration_statement: 慢查询核心参数。-1: 禁用。0: 记录所有 SQL(性能损耗大,慎用)。>0: 记录超过指定毫秒数的 SQL(如1000表示 1秒)。
log_statement: 控制记录的 SQL 类型。none: 不记录。ddl: 仅记录结构变更。mod: 记录 DDL + DML (Insert/Update/Delete)。all: 记录所有 SQL(含 Select)。
log_line_prefix: 日志前缀,建议包含%t(时间),%p(进程ID),%u(用户),%d(数据库)。
5. 如何查看当前日志配置
在动手修改配置之前,了解数据库当前的运行状态是至关重要的第一步。KingbaseES 提供了两种主要方式来查看日志相关的配置。
-
查看配置文件
可以直接检查数据库数据目录下的主配置文件kingbase.conf或自动生成的kingbase.auto.conf。这些文件中记录了日志文件的位置、名称、大小及切换周期等基础信息。# 示例:查看配置文件中的关键日志参数 grep -E "logging_collector|log_directory|log_filename|log_rotation" $KINGBASE_DATA/kingbase.conf# 输出示例 logging_collector = on # 启用日志收集进程 log_directory = 'sys_log' # 日志保存的子目录 log_filename = 'kingbase-%Y-%m-%d_%H%M%S.log' # 日志文件名格式 log_rotation_age = 1d # 按时间自动轮换日志 log_rotation_size = 10MB # 按大小自动轮换日志 -
查询系统视图(推荐)
更推荐的方式是通过 SQL 查询系统视图sys_settings。这种方法可以实时获取数据库当前生效的配置值,并且能区分配置是来自配置文件、ALTER SYSTEM命令还是默认值。-- 查询所有以 'log' 开头的配置参数 SELECT name, setting, source, context FROM sys_settings WHERE name LIKE 'log%';
三、 场景化实战配置
场景 A:慢查询跟踪
目标:记录执行时间超过 10 秒的 SQL。
-- 1. 设置阈值 (单位毫秒)
alter system set log_min_duration_statement = 10000;
-- 2. 推荐使用 CSV 格式以便后续分析
alter system set log_destination = 'csvlog';
-- 3. 重载配置
select sys_reload_conf();
场景 B:审计与连接监控
目标:记录所有 DDL/DML 操作及连接断开事件。
-- 1. 记录数据变更操作
alter system set log_statement = 'mod';
-- 2. 开启连接/断开记录
alter system set log_connections = on;
alter system set log_disconnections = on;
-- 3. 重载配置
select sys_reload_conf();
场景 C:锁等待监控
目标:记录超过死锁超时时间的锁等待。
alter system set log_lock_waits = on;
select sys_reload_conf();
四、 日志解析的三种“武器”
如何将日志转化为有价值的信息?根据需求不同,有三种主流方案:
方案 1:kbbadger 工具(推荐用于巡检报告)
kbbadger 是 KingbaseES 自带的高效日志分析器,能生成直观的 HTML 报告。
- 前置条件:
logging_collector = onlog_line_prefix必须包含时间%t和进程%p。
- 常用命令:
- 生成全量报告:
kbbadger /opt/Kingbase/data/sys_log/kingbase.log -o report.html -f stderr - 分析特定时段:
kbbadger kingbase.log -b "2025-09-02 10:00:00" -e "2025-09-02 12:00:00" -o part.html - 仅分析错误:
kbbadger kingbase.log -w -o error.html
- 生成全量报告:
方案 2:COPY 导入法(推荐用于深度历史分析)
将 CSV 日志导入数据库表中,利用 SQL 进行复杂查询。
- 建表:
CREATE TABLE public.sys_log ( logtime timestamp without time zone, loguser text, logdatabase text, -- ... 其他字段需与 CSV 列对应 logquery text ); - 导入:
COPY public.sys_log FROM '/opt/Kingbase/data/sys_log/kingbase-2025-09-05.csv' WITH CSV; - 分析:
SELECT * FROM public.sys_log WHERE logquery LIKE '%UPDATE%';
注意:
logtransaction 表示记录事务的一个位置,log_level 表示日志的级别,logseverity 对应FATAL、ERROR、WARN、INFO、 ALL等等,根据设置的level去记录对应的日志。
这样可以过滤出想要的内容,查看更加直观简洁,但只能每一个日志文件copy进去一张表中。
方案 3:file_fdw 外部表(推荐用于实时排查)
无需导入,直接像查询表一样查询日志文件。
-- 1. 创建扩展
CREATE EXTENSION file_fdw;
CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw;
-- 2. 创建外部表
CREATE FOREIGN TABLE sys_log_svt (
logtime timestamp,
loguser text,
logquery text
-- ... 定义对应字段
) SERVER file_server
OPTIONS (filename '/opt/Kingbase/data/sys_log/kingbase.log', format 'csv', header 'true');
-- 3. 直接查询
SELECT * FROM sys_log_svt WHERE loguser = 'system';

注意:
- 对外部表的操作,外部表不支持insert ,update和delete操作。
- file_fdw卸载在ksql中运行drop命令进行卸载 如果有外部表依赖则需要加cascade。
- 使用kbbadger工具查看。
五、 运维避坑与最佳实践
-
性能损耗警示:
- 严禁在生产高峰期同时开启
log_statement='all'和log_duration=on。这会产生巨大的 I/O 压力,甚至拖垮数据库。 - 建议组合:
log_min_duration_statement = 1000+log_statement = 'none'。
- 严禁在生产高峰期同时开启
-
磁盘空间管理:
- 务必配置
log_rotation_age和log_rotation_size。 - 配合操作系统的
logrotate工具或脚本定期清理过期的日志文件,防止磁盘爆满。
- 务必配置
-
kbbadger 解析失败排查:
- 如果工具提示解析错误,首先检查
log_line_prefix格式是否符合工具要求(必须包含时间戳和进程ID)。 - 确保日志文件编码与工具解析编码一致(通常为 UTF-8)。
- 如果工具提示解析错误,首先检查
结语:
KingbaseES 的日志系统是数据库运维的基石。建议在生产环境中采用 stderr + csvlog 双轨制:stderr 用于日常实时监控,csvlog 用于定期的 kbbadger 分析和审计。通过合理的配置和工具利用,让日志真正成为提升系统稳定性的利器。





