Skip to main content

kingbase-log-analyzer

作为 KingbaseES(金仓)DBA 专家,输入金仓实例的日志目录路径与需要分析的时间段(绝对时间范围或相对时间如「最近3天」、「昨晚8点到今早8点」),对该时间段内的日志文件进行深度解析,识别错误/致命错误、慢查询、锁等待与死锁、checkpoint 与后台写入、autovacuum、临时文件、连接与认证异常、复制/WAL 问题、崩溃恢复以及金仓特有的审计/安全日志(sysaudit、sysmac、sys_hm),并输出图文并茂(含时间线图与统计表格)的 Markdown 分析报告。触发条件:用户提到「分析金仓日志」、「分析KingbaseES日志」、「分析KES日志」、「帮我看看金仓数据库日志」、「日志目录」、「sys_log」、「金仓log 目录」、「数据库日志诊断」、「这段时间金仓出了什么问题」、「帮我查一下慢查询」、「帮我看看有没有死锁」、「checkpoint是不是太频繁」、「autovacuum有没有问题」、「金仓这段时间为什么变慢」,或用户提供了一个日志目录路径 + 时间段并希望得到诊断报告。即使用户只说「帮我看看这个目录下的日志,最近有没有问题」,也应使用本 skill。

ソース情報

リポジトリ
digoal/skills
ソースの最終更新活動
2026年8月9日 13:01
検出された SKILL.md の言語
中国語
スター
39
フォーク
10

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

ファイルエクスプローラー
7 ファイル

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
kingbase-log-analyzer
description
作为 KingbaseES(金仓)DBA 专家,输入金仓实例的日志目录路径与需要分析的时间段(绝对时间范围或相对时间如「最近3天」、「昨晚8点到今早8点」),对该时间段内的日志文件进行深度解析,识别错误/致命错误、慢查询、锁等待与死锁、checkpoint 与后台写入、autovacuum、临时文件、连接与认证异常、复制/WAL 问题、崩溃恢复以及金仓特有的审计/安全日志(sysaudit、sysmac、sys_hm),并输出图文并茂(含时间线图与统计表格)的 Markdown 分析报告。触发条件:用户提到「分析金仓日志」、「分析KingbaseES日志」、「分析KES日志」、「帮我看看金仓数据库日志」、「日志目录」、「sys_log」、「金仓log 目录」、「数据库日志诊断」、「这段时间金仓出了什么问题」、「帮我查一下慢查询」、「帮我看看有没有死锁」、「checkpoint是不是太频繁」、「autovacuum有没有问题」、「金仓这段时间为什么变慢」,或用户提供了一个日志目录路径 + 时间段并希望得到诊断报告。即使用户只说「帮我看看这个目录下的日志,最近有没有问题」,也应使用本 skill。
tags
["KingbaseES","金仓","sys_log","日志分析","csvlog"]
platform
["claude-code","cursor"]
author
digoal
version
1.0.0
# KingbaseES 日志诊断专家 对 KingbaseES(金仓)实例在指定时间段内的日志文件进行系统性解析与根因分析,产出一份可直接用于故障复盘或健康巡检的 Markdown 报告。本 skill 以只读日志文件为主;可选地只读连接数据库来确认日志相关参数与时区假设,但不修改任何配置。 > **KingbaseES 适配要点**:金仓默认采用 **PG 兼容模式**,日志体系与 PostgreSQL 高度一致(`log_*` 系列参数、stderr/csvlog 输出、时间戳格式),但存在若干金仓特有差异(`sys_log` 目录、`sys_hba.conf`、日志文件名 `kingbase-*`、审计日志 `sysaudit`、安全策略日志 `sysmac`、健康监控 `sys_hm`、崩溃自动恢复消息等),已在 Step 2 / 分类维度 / Pitfalls 中逐条说明。金仓实测默认参数与常见日志消息模式见 `references/kb-log-format.md`。 ## 前置要求 - Agent 具备读取目标日志目录的文件系统权限(无需 root,普通只读权限即可;若日志属于 kingbase 用户且当前用户无权限,需提示用户 `sudo -u kingbase` 或调整权限后重试) - 基础命令行工具:`grep`、`awk`、`sed`、`zcat/zgrep`(处理压缩轮转日志)、`python3`(用于 csvlog 结构化解析,标准库即可,无需联网安装包) - **可选**:`ksql` 或 `psql` 客户端(采集日志相关配置参数),或 `psycopg2`(等价 Python 版,见 `scripts/collect_log_settings.py`) - 不需要网络访问(官方文档 URL 仅供核对术语,不构成依赖) ## 连接约定(仅当需要连库确认参数/时区时) 按优先级解析: 1. **用户明确提供的连接参数**(host/port/user/password/dbname,或连接串); 2. **环境变量** `PGHOST` `PGPORT` `PGUSER` `PGPASSWORD`,库名变量**同时兼容** `PGDBNAME`(用户指定)与 `PGDATABASE`(PG 惯例)——即使 KingbaseES 手册把这些变量写作 `KINGBASEHOST`/`KINGBASE_HOST` 等,本 skill **一律沿用 PG 风格环境变量**; 3. **缺省值**:`PGHOST=127.0.0.1 PGPORT=5432 PGUSER=kingbase PGPASSWORD=123456 PGDATABASE=kingbase`(金仓默认库名是 `kingbase` 而非 `postgres`,注意 Pitfall)。 连接方式二选一,结果等价: - **psql/ksql shell**:`scripts/collect_log_settings.sql` - **Python SDK**:`scripts/collect_log_settings.py`(依赖 `psycopg2`,`pip install psycopg2-binary`) ## 工作流程 ### Step 1: 捕获输入,缺失则询问 必需两个输入: 1. **日志目录路径**——金仓默认日志目录是 `<data_directory>/sys_log/`(相对路径,`SHOW log_directory` 可确认,如 `/home/kingbase/userdata/data/sys_log` 或本机挂载路径);用户给的是绝对路径时直接使用 2. **分析时间段**——支持绝对区间(`2026-07-10 14:00` 到 `2026-07-10 18:00`)或相对表达("最近3天"、"昨晚到今早"),Agent 需先用 `date` 换算成绝对时间区间,并在报告开头写明换算结果 若用户只给了目录没给时间段,默认使用该目录下**最新日志文件覆盖的最后 24 小时**,并在报告中明确注明"未指定时间段,默认分析最近 24 小时"。 若目录不存在或无可读日志文件,直接告知用户,不要臆造分析结果。 ### Step 2: 探测日志格式与时区 ```bash ls -la <log_dir> | head -50 # 判断格式:stderr 文本 / csvlog(.csv) head -5 <log_dir>/kingbase-*.log 2>/dev/null head -5 <log_dir>/kingbase-*.csv 2>/dev/null ``` - 金仓默认(PG 兼容模式)`log_destination = stderr`,`logging_collector = on`,`log_directory = sys_log`,`log_filename = kingbase-%Y-%m-%d_%H%M%S.log`,`log_line_prefix = %m [%p]`(即 `2026-08-09 09:00:45.981 UTC [92] LOG: ...`) - 若用户提供了连接信息,运行 `scripts/collect_log_settings.sql` 或 `.py` 采集 `log_destination`、`log_filename`、`log_line_prefix`、`log_timezone`、`log_min_duration_statement`、`log_checkpoints` 等参数,用实测值替代假设;无法连库时则以日志内时间戳自带时区/系统本地时区为准,并在报告"数据说明"中注明假设 - csvlog 每行是标准 CSV(含内嵌换行的字段,如 SQL 语句本身可能跨行),**禁止直接用 `grep`/`awk` 按行硬切,必须用 Python `csv` 模块解析**,否则会因内嵌逗号/换行导致字段错位。直接使用 `scripts/parse_csvlog.py`(自动读表头列名、支持 .csv/.csv.gz、时间段过滤、分类统计与脱敏)即可:`python3 scripts/parse_csvlog.py <日志目录> --since "..." --until "..."`;若实例尚未开启 csvlog,用 `scripts/enable_csvlog.sql`(psql/ksql)或 `scripts/enable_csvlog.py --enable`(Python)开启(需超级用户,`stderr,csvlog` 并存,reload 即生效,可随时回滚) - 传统 stderr 文本格式中,一条日志事件可能横跨多行(`ERROR:` 主行 + 紧随其后的 `STATEMENT:`/`DETAIL:`/`CONTEXT:`/`HINT:` 续行,续行与主行**同时间戳同 PID**),解析时要把这些续行归并回它所属的事件,不能拆散统计 ### Step 3: 筛选时间段内的日志文件 - 一个绝对时间段可能跨越多个日志文件(金仓按 `log_rotation_age`(默认1440分钟)/`log_rotation_size`(默认10MB) 轮转,含 `.gz` 压缩文件),按文件名时间戳或 `mtime` 排序后,选出**所有与目标区间有交集**的文件,而不是只挑一个最接近的文件 - 大文件(>200MB)优先用流式命令(`zgrep`/`grep` + 管道)过滤,禁止一次性读入内存后再处理 - 对每个候选文件,先用时间戳做粗筛(取文件内第一条和最后一条日志的时间戳,判断是否与区间有交集),再精确过滤落在区间内的行 ### Step 4: 分类提取与统计 对区间内的日志事件,按以下维度提取并统计,每类都要给出**次数、代表性样例(脱敏后)、Top N 排序**: | 维度 | 关键字/模式 | 需要统计的内容 | |------|------------|----------------| | 致命/错误 | `PANIC`、`FATAL`、`ERROR` | 按 SQLSTATE 或错误消息模板聚类去重,列 Top 10 出现频率最高的错误 | | 崩溃/恢复(金仓常见) | `database system was interrupted`、`automatic recovery in progress`、`redo starts at`、`database system is ready to accept connections` | 崩溃次数、崩溃时刻、恢复耗时、redo 段数;区分"正常关闭"(`was shut down`) 与"异常中断"(`was interrupted`,可能被 kill/断电/主机重启) | | 慢查询 | `duration: ... ms statement:` / `duration: ... ms plan:` | 耗时分布(P50/P95/最大值)、最慢 Top 10 语句(**对字面量做脱敏**,只保留 SQL 结构) | | 锁与死锁 | `deadlock detected`、`process ... still waiting for` | 死锁次数、涉及的表/关系、锁等待最长时长 | | 连接与认证 | `connection authorized`、`connection received`、`password authentication failed`、`too many connections`、`terminating connection` | 认证失败次数与来源 IP、连接数峰值时段、异常断连次数 | | Checkpoint/后台写入 | `checkpoint starting`、`checkpoint complete` | 触发原因分布、平均耗时、写入 buffer 数、检查是否比 `checkpoint_timeout` 更频繁触发 | | Autovacuum/Autoanalyze | `automatic vacuum of table`、`automatic analyze of table`、`to prevent wraparound` | 涉及表清单、耗时 Top、dead tuples 数量趋势,判断是否有表长期未被有效清理 | | 临时文件 | `temporary file:` | 出现次数、总大小,提示可能 `work_mem` 不足 | | 复制/WAL/归档 | `streaming replication`、`could not receive data from WAL stream`、`archive command failed`、`config the real archive_command string` | 复制中断次数、WAL 归档失败次数(`config the real archive_command string as soon as possible` 是金仓特有提示,表示 archive_command 尚未配置真实值) | | 配置变更 | `ALTER SYSTEM`、`received SIGHUP, reloading configuration files`、`parameter ... changed to` | 谁在何时改了什么参数(如金仓日志中 `attention:superuser kingbase is modifying ... by ALTER SYSTEM SET statement`),判断是否与异常窗口相关 | | 金仓特有:审计/安全 | `sysaudit`、`sysmac`、`sys_hm`、`security` | 审计策略告警、MAC 策略拒绝、健康监控告警(如开启时) | | 其他告警 | `WARNING`、`could not`、`skipping` | 归类展示,避免遗漏未预期的问题类型 | 若某一类在该时间段内完全没有记录,在报告中明确写"未发现",不要跳过不提,也不要编造。 ### Step 5: 关联分析(时间维度交叉) 把上述所有关键事件按时间排序,构建一条时间线,重点检查以下关联模式(有则指出,没有就不要牵强附会): - 慢查询集中爆发的时间段是否与 checkpoint、autovacuum 的执行窗口重叠 - 连接错误/认证失败暴增是否伴随 `too many connections` 或应用侧重连风暴 - 死锁频发是否集中在特定表或特定时段(如批量任务窗口) - 临时文件暴增是否与某类慢查询的语句结构一致(提示同一 SQL 反复触发外部排序/哈希) - **金仓特有**:崩溃恢复(`was interrupted`)后是否紧接认证失败风暴/连接堆积(应用侧重连);`ALTER SYSTEM` 或 `pg_reload_conf` 之后是否出现计划/行为变化 对每一条关联结论,给出**支持证据**(引用具体时间点和事件计数),并明确这是"相关性观察"而非确诊,附上"如何进一步验证"的建议(如开启 `auto_explain`、检查具体表的统计信息等)。 ### Step 6: 生成并保存报告 用 Markdown 输出,保存到当前项目 `markdown/` 目录(不存在则创建),文件名格式:`kingbase-log-analysis_{开始时间}_{结束时间}.md`(时间用 `YYYYMMDD-HHMM`)。报告需包含时间线图(Mermaid `timeline` 或简单的 ASCII 时间轴均可)和统计表格,让 DBA 一眼看出这段时间数据库经历了什么。 ## 输出格式 ```markdown # KingbaseES 日志分析报告 ## 数据说明 - 实例日志目录:... - 分析时间段:... 至 ...(如为默认/推算得出的时间段需注明) - 涉及日志文件:文件名列表 - 日志格式:stderr / csvlog - 时区假设:...(连库采集到的 log_timezone 或推断值) ## 健康度摘要 一句话结论 + 3-5 条关键发现(按严重程度排序) ## 关键发现 Top 5 1. ...(含证据:次数、时间点) ## 时间线 (Mermaid timeline 或时间轴表格,标出致命错误/崩溃恢复/死锁/连接风暴等关键节点) ## 分类明细 ### 错误与致命错误 表格:错误类型 | 次数 | 首次出现 | 最近一次 | 代表样例(脱敏) ### 崩溃与恢复 表格:崩溃时刻 | 恢复耗时 | redo 段数 | 是否正常关闭 ### 慢查询 表格:语句结构(脱敏) | 出现次数 | 平均耗时 | 最大耗时 ### 锁与死锁 ... ### Checkpoint / 后台写入 ... ### Autovacuum / Autoanalyze ... ### 临时文件 ... ### 连接与认证 ... ### 复制 / WAL / 归档 ... ### 配置变更 ... ### 审计 / 安全日志(金仓特有) ... ## 关联分析与根因假设 每条假设附证据与验证建议 ## 优化建议 按优先级(P0/P1/P2)列出可执行的参数调整或运维动作,每条建议说明"解决什么问题" ## 附录:原始日志片段引用 关键事件的原始行(脱敏后),供人工复核 ``` ## Pitfalls & Solutions | 坑点 | 解决方案 | |------|----------| | 日志轮转导致时间段横跨多个文件,只看最新文件会漏掉信息 | 先按文件时间范围筛选出所有相交文件再处理 | | csvlog 内嵌逗号/换行用 grep/awk 按行切割会导致字段错位 | 必须用 Python csv 模块或专用解析器读取 | | stderr 文本格式的多行日志(ERROR + STATEMENT/DETAIL)被当成独立行统计,导致重复计数 | 解析时先做"事件归并"(同时间戳同 PID 的续行拼回主事件)后再统计 | | 慢查询语句里可能包含手机号、身份证、密码等敏感字面量 | 报告中一律用占位符替换字面量(如 `$1`、`'***'`),只保留 SQL 结构 | | 大文件一次性读入内存导致 OOM 或极慢 | 用 `grep`/`zgrep` 流式过滤后再精细处理,避免一次性 `read()` 整个文件 | | 时间戳时区与系统本地时区不一致,导致筛选区间偏移 | 优先确认 `log_timezone`(金仓实测常见 UTC),找不到时明确注明假设的时区,不要默默假定 UTC | | **金仓特有**:`log_min_duration_statement = -1`(默认**不记慢 SQL**)、`log_checkpoints = off`、`log_autovacuum_min_duration = -1` | 慢查询/checkpoint/autovacuum 类目日志缺失时,提示用户检查相关参数是否开启,而不是直接判定"无问题"(这是金仓默认比 PG 更保守的一处) | | **金仓特有**:客户端默认连 `postgres` 库报 `FATAL: database "postgres" does not exist` | 金仓默认库名是 `kingbase`(或安装时指定的库),报告应点明这是客户端习惯性问题而非数据库故障 | | **金仓特有**:认证失败消息里出现 `Connection matched sys_hba.conf line 63` | 金仓的 host 认证配置文件叫 `sys_hba.conf`(不是 `pg_hba.conf`),引用时注意名称 | | **金仓特有**:`2pc are not enabled` / `the prepared transaction ... does not exist` | 金仓默认未开启 2PC(`max_prepared_transactions` 相关),涉及 PREPARE TRANSACTION 的运维/SQL 需要先确认参数 | | **金仓特有**:`sys_stat_statements` 同名对象在不同 schema(`public` 扩展视图 vs `sys_catalog` 内部对象)列结构可能不同 | 查询前用 `\dn`/`information_schema.columns` 确认目标对象,报 `column ... does not exist` 时先检查 search_path | | **金仓特有**:`ALTER SYSTEM` 触发 `attention:superuser kingbase is modifying ...` 日志 | 这是金仓对超级用户改参数的审计提示,属正常行为,但应纳入"配置变更"维度关联到异常窗口 | | **金仓特有**:`config the real archive_command string as soon as possible to archive WAL files` | 金仓提示 archive_command 尚未配置真实值(可能默认占位),报告应提醒确认归档配置 | | 把相关性当因果,给出过度确定的根因结论 | 所有关联分析必须标注为"观察到的相关性",并给出证据和进一步验证方法 | ## 注意事项 - 本 skill 仅读取日志文件;如需连库(只读)确认参数,只执行 SELECT/SHOW,不执行任何 SQL 写操作、不修改任何配置或系统文件 - 日志中的字面量数据(用户输入、SQL 参数)在报告中一律脱敏,不得原样透出 - 若日志目录权限不足,提示用户调整权限或使用有权限的账户重试,不要尝试提权 - 若关键日志类别(如慢查询、checkpoint)因参数未开启而缺失数据,必须在报告中明确说明"数据不可得",不得凭经验编造结论 - 报告中的所有优化建议需说明适用前提(如"若确认瓶颈在 IO,可考虑..."),不做无条件的参数修改建议 - 连接信息解析:用户提供 > 环境变量(PG 风格,即使金仓手册写作 KINGBASE*;库名兼容 `PGDBNAME`/`PGDATABASE`)> 缺省值 `127.0.0.1:5432/kingbase/kingbase/123456` ## 脚本与参考 - `scripts/collect_log_settings.sql` — psql/ksql 版:只读采集日志相关配置(格式、轮转、内容开关、时区) - `scripts/collect_log_settings.py` — Python SDK(psycopg2)版:与 .sql 等价 - `scripts/parse_csvlog.py` — csvlog 结构化日志解析器(Python 标准库 csv/gzip,只读):动态读表头、支持 .csv/.csv.gz、`--since/--until/--json`,按 skill Step 4 维度分类统计并脱敏 - `scripts/enable_csvlog.sql` — psql/ksql 版:开启 csvlog(`stderr,csvlog` 并存 + reload,需超级用户,含回滚方法) - `scripts/enable_csvlog.py` — Python SDK 版:`--check`(只读查看,默认)/ `--enable` / `--revert` - `references/kb-log-format.md` — 金仓日志格式细节、实测默认参数、特有消息模式、csvlog 字段说明、官方文档链接 - 官方文档:[错误报告和日志(运行时配置-日志)](https://docs.kingbase.com.cn/cn/KES-V9R1C10/administration/Config_Mgmt/runtime-config-logging)(说明:docs.kingbase.com.cn 为 JS 渲染站点,`curl` 只能拿到导航壳,正文需用浏览器渲染或直接以本 skill 的实测/经验内容为准)
GitHubで見る