HWR 可以帮助我们找出 Halo 数据库中大多数资源消耗活动,并可以生成类似 Oracle AWR 的分析报告。
HWR 扩展是基于 Halo 的标准统计视图。它在指定时间生成快照,并提供 HTML 格式来解释快照之间的统计数据。假设几个小时前报告数据库性能下降,定期采样快照可以帮助查找过去时间段内最耗资源的活动。我们可以在两个快照之间生成一个报告,查看数据库的负载配置文件,从而定位性能问题发生的时间窗口。
HWR 是用纯 PL/pgSQL 编写的,不需要任何外部库或软件,只需 Halo 数据库运行在 Oracle 兼容模式下。通过调用 take_sample() 函数获取快照样本。建议使用 cron 定期调度该任务。
每次获取样本时,都会调用 pg_stat_statements_reset(),以避免因达到 pg_stat_statements.max 而丢失 SQL 语句统计信息。
1、前置条件
设置 postgresql.conf 文件中的参数:
database_compat_mode = 'oracle'
track_activities = on
track_counts = on
track_io_timing = on
track_wal_io_timing = on # Since Halo 14
track_functions = all
pg_stat_statements.max = 1000
pg_stat_statements.track = 'top'并在数据库中创建 Oracle 扩展:
psql
# CREATE EXTENSION aux_oracle CASCADE;2、HWR 的安装
步骤1:创建扩展
psql
# CREATE SCHEMA hwr;
# CREATE EXTENSION hwr SCHEMA hwr CASCADE;
# \dx所有 HWR 对象都将创建在 hwr 模式下。
在 postgresql.conf 中配置:
shared_preload_libraries = 'pg_stat_statements' # (change requires restart)步骤2:准备脚本 hwr_take_sample.sh
以 halo 用户操作:
cd $HALO_HOME/admin/hwr
cp hwr_take_sample.sh.sample hwr_take_sample.sh修改 hwr_take_sample.sh 中的 HALO_HOME、PGHOST 等环境变量(根据实际路径配置),例如:
export HALO_HOME=/u01/app/halo/product/dbms/14
export LD_LIBRARY_PATH=$HALO_HOME/lib
export PATH=$HALO_HOME/bin:$PATH
export PGHOST=/var/run/halo
psql -c 'SELECT hwr.take_sample()'授权脚本:
chmod 750 hwr_take_sample.sh步骤3:为用户 halo 启用 crontab
若未启用,以 root 用户执行:
echo halo >> /etc/cron.allow步骤4:将 hwr_take_sample.sh 添加到 crontab
# 编辑 crontab
crontab -e
# 查看 crontab
crontab -l例如每小时执行一次:
0 * * * * /u01/app/halo/product/dbms/14/admin/hwr/hwr_take_sample.sh > /u01/app/halo/product/dbms/14/admin/hwr/hwr_take_sample.sh.log 2>&1可根据需求调整采集频率。
3、如何使用 HWR
设置扩展参数
在 postgresql.conf 中定义以下 HWR 参数(默认值):
# 报告中每个表格显示的 Top N 对象数量(影响样本大小)
hwr.topn = 20
# 样本保留天数,超期样本在下次 take_sample() 时自动清理
hwr.max_sample_age = 7
# 是否记录详细的采样耗时
hwr.track_sample_timings = off
# 报告中查询文本的最大长度(不影响采集,仅截断显示)
hwr.max_query_length = 20000样品(Snapshot)
每个采样包含自上一个采样以来的数据库工作负载统计信息。
核心函数:
• take_sample():收集所有已启用服务器的样本,顺序执行。
该函数返回一个表:
server | result | elapsed
---------|--------|--------
server_name | "OK" 或错误信息 | 耗时(interval)示例:
halo0root=# SELECT * FROM hwr.take_sample();
server | result | elapsed
----------+--------+----------
HaloTest | OK | 00:00:00.37
(1 行记录)查看已有样本:
halo0root=# SELECT * FROM hwr.samples;
server_id | sample_id | sample_time
-----------+-----------+---------------------
1 | 49 | 2023-07-27 09:40:01+08
1 | 50 | 2023-07-27 09:45:01+08
...show_samples([server name,] [days integer]) 函数用于列出指定服务器最近若干天的样本:
halo0root=# SELECT hwr.show_samples('HaloTest', 1);
show_samples
-------------------------------------
(117,"2023-08-01 18:00:02+08",t,,,)
(118,"2023-08-01 18:05:02+08",t,,,)
...返回字段说明:
• sample:样本 ID • sample_time:采集时间 • sizes_collected:是否收集了关系大小 • dbstats_reset / clustats_reset / archstats_reset:统计重置时间戳(通常为空)
采集建议:
至少需要 2 个样本才能生成报告。通常每小时采集 1~2 次即可。可使用 cron 调度,例如每 5 分钟:
*/5 * * * * psql -c 'SELECT hwr.take_sample()' > /dev/null 2>&1但更推荐通过监控系统调用 take_sample() 并检查返回结果,以便及时发现异常。
实例数据保留
HWR 支持自动清理过期样本,保留策略由 hwr.max_sample_age 控制(单位:天)。旧样本将在下次 take_sample() 调用时被删除。
4、报告
HWR 报告以 HTML 格式生成,支持多种调用方式:
• get_report([server], start_id, end_id [, description, with_growth]):按样本 ID 生成报告 • get_report([server], time_range tstzrange [, ...]):按时间范围生成覆盖该区间的最短样本间隔报告 • get_report([server], baseline varchar(25) [, ...]):基于命名基线生成报告 • get_report_latest([server]):为最新两个样本生成报告
参数说明:
• server:服务器名(省略则为本地) • with_growth:是否扩展区间并显示增长趋势(默认 false) • description:附加到报告中的描述文本
常用生成方式:
1. 使用内置脚本:
psql -f $HALO_HOME/admin/hwr/hwrrpt.sql2. 直接调用函数生成 HTML 文件:
# 按样本 ID
psql -Aqtc "SELECT hwr.get_report(126,129)" -o report_126_129.html
# 按时间范围
psql -Aqtc "SELECT hwr.get_report(tstzrange('2023-08-01 18:00:02+08','2023-08-02 09:20:02+08'))" -o report_range.html
# 最近 24 小时
psql -Aqtc "SELECT hwr.get_report(tstzrange(now() - interval '1 day', now()))" -o last24h_report.html生成的 HTML 报告可用任意 Web 浏览器打开查看。
