1. 为什么需要在不关闭数据库的情况下启用sys_stat_statements
在数据库运维和性能调优工作中,sys_stat_statements插件是PostgreSQL及其衍生数据库(如金仓KES)中极为重要的性能监控工具。它能够记录SQL语句的执行统计信息,包括执行次数、总耗时、内存使用等关键指标。然而,传统启用方式往往需要重启数据库实例,这对于7×24小时运行的生产环境来说是不可接受的停机代价。
金仓KES作为国产数据库的重要代表,在金融、政务等关键领域广泛应用,这些场景对系统可用性要求极高。我曾参与某省级医保系统的性能优化,当时就面临必须收集SQL性能数据但又不能停机的困境。通过实践发现,KES实际上支持动态加载sys_stat_statements插件,但需要特定的操作技巧和参数配置。
重要提示:虽然KES基于PostgreSQL,但插件加载机制存在差异,直接使用PG的方法可能导致不可预知的问题。必须遵循KES特有的操作流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置检查
2.1 确认KES版本兼容性
不同版本的KES对动态加载的支持程度不同。通过以下SQL查询版本信息:
sql复制SELECT version();
在KES V8R3及以上版本中,动态加载功能较为完善。如果使用的是早期版本,建议先联系金仓技术支持确认兼容性。我曾遇到过V8R1版本在动态加载后出现WAL日志异常的情况,最终不得不安排维护窗口进行完整重启。
2.2 检查当前插件状态
执行以下命令查看已加载插件:
sql复制SELECT * FROM pg_available_extensions WHERE name = 'sys_stat_statements';
如果显示为未安装,需要先确认$KINGBASE_SHAREDIR/extension目录下是否存在sys_stat_statements.control文件。某次客户现场实施时,发现该文件意外缺失,原因是安装包不完整,重新安装KES后解决。
2.3 参数预配置
在kingbase.conf中添加或修改以下参数:
code复制shared_preload_libraries = 'sys_stat_statements'
sys_stat_statements.max = 10000
sys_stat_statements.track = all
虽然我们的目标是不重启加载,但这些配置能确保重启后插件状态持久化。特别注意sys_stat_statements.max参数,在内存充足的生产环境中建议设置为5000-10000,避免高频SQL被滚动淘汰。
3. 动态加载插件的关键步骤
3.1 使用KES特有加载命令
不同于PostgreSQL的CREATE EXTENSION,KES需要使用特殊函数加载:
sql复制SELECT sys_manage_extension('load', 'sys_stat_statements');
这个命令是金仓的私有API,官方文档中较少提及。第一次使用时我通过分析KES的系统函数列表偶然发现,后来在技术社区确认这是推荐做法。执行后应当检查kingbase.log确认无错误。
3.2 验证加载结果
通过以下查询确认插件状态:
sql复制SELECT * FROM sys_stat_statements LIMIT 1;
如果返回"relation does not exist"错误,可能是权限问题。需要以SYSDBA身份执行:
sql复制GRANT USAGE ON SCHEMA public TO [当前用户];
某次银行项目中,即使使用SYSDBA账号也遇到权限异常,最终发现是KES的权限模型特殊,需要通过ALTER USER语句额外授权。
3.3 初始化统计信息
新加载的插件不会立即开始统计,需要执行:
sql复制SELECT sys_stat_statements_reset();
然后执行几个测试SQL,再次查询sys_stat_statements视图确认数据收集正常。建议在业务低峰期操作,避免reset操作影响现有统计数据的连续性。
4. 生产环境中的注意事项
4.1 内存占用监控
sys_stat_statements会占用共享内存,在大型系统中可能达到数百MB。通过以下查询监控:
sql复制SELECT sum(pg_column_size(query)) FROM sys_stat_statements;
曾有一个案例:某交易系统启用插件后OOM频发,分析发现是设置了过高的max参数(20000)导致。调整为8000后稳定运行。
4.2 统计信息持久化
KES默认不会将统计信息写入磁盘,重启后数据丢失。可以通过定时任务导出:
bash复制ksql -U user -d db -c "COPY sys_stat_statements TO '/path/to/stats_$(date +%Y%m%d).csv' CSV HEADER"
某证券客户要求保留30天历史数据,我们开发了自动归档脚本,结合grafana实现趋势分析。
4.3 与KES特有功能的兼容性
特别注意与KES的并行查询、国密加密等特性的交互。遇到过启用加密传输时,插件统计的SQL文本出现乱码的情况,需要通过配置sys_stat_statements.track_utility参数调整。
5. 典型问题排查指南
5.1 插件加载失败
错误现象:函数执行后无报错但查询不到数据
排查步骤:
- 检查kingbase.log是否有权限拒绝记录
- 确认$KINGBASE_SHAREDIR权限为755
- 尝试静态加载测试(需停机)
5.2 统计信息不更新
常见原因:
- 未执行reset()初始化
- track参数配置为none
- 达到max限制后旧语句被淘汰
可通过ALTER SYSTEM SET命令动态调整参数,无需重启:
sql复制ALTER SYSTEM SET sys_stat_statements.track = 'top';
SELECT sys_reload_conf();
5.3 性能影响评估
在大型OLTP系统中,插件可能增加5%-10%的CPU开销。建议首次启用后密切监控:
sql复制SELECT calls, total_time FROM sys_stat_statements
ORDER BY total_time DESC LIMIT 10;
某电商平台在618前启用监控,发现一个不起眼的查询单日执行2000万次,优化后系统负载下降15%。
6. 高级应用技巧
6.1 与KES审计功能结合
金仓的审计模块可以与性能统计联动:
sql复制CREATE AUDIT POLICY sql_perf_policy
FILTERS (STATEMENT_TYPE = 'SELECT')
ACTIONS AUDIT;
这样可以在审计日志中标记出高耗时的敏感查询,满足等保要求。
6.2 自定义统计视图
创建业务专属视图简化分析:
sql复制CREATE VIEW app_slow_queries AS
SELECT query, calls, total_time/calls AS avg_time
FROM sys_stat_statements
WHERE total_time/calls > 100 -- 单位毫秒
ORDER BY total_time DESC;
某政务云项目中将此视图集成到自研监控平台,实现自动告警。
6.3 历史数据分析
使用KES的定时任务功能定期快照:
sql复制CREATE TABLE stat_history AS
SELECT now() AS snapshot_time, * FROM sys_stat_statements;
配合window函数可以分析查询性能退化趋势,提前发现潜在问题。
