一、前言
艺术来源于生活高于生活,所谓性能诊断报告,类似于我们人的体检报告。我们去医院看病,医生肯定首先让我们做医学检查,例如CT等,根据检查报告来判断我们身体有没有问题。同样的道理,在数据库中,我们直观的判断一套数据库集群有没有问题,也是根据类似于体检报告的性能诊断报告。

二、WDR相关概念
WDR报告提供数据库性能诊断报告,该报告基于基线性能数据和增量数据两个版本,从性能变化得到性能报告。
WDR(Workload Diagnosis Report)基于两次不同时间点系统的性能快照数据,生成这两个时间点之间的性能表现报表,用于诊断数据库内核的性能故障。
使用 select generate_wdr_report(...) 函数可以生成基于两个性能快照的非库级性能报告。
使用 **select generate_wdr_db_report(...)**函数可以生成基于两个性能快照的库级性能报告。
三、WDR默认采集和保存策略
WDR性能快照数据存储在postgres库的snapshot schema下,默认的采集和保存策略为:
1.每小时采集一个快照(wdr_snapshot_interval=1h)。
2.每十二个快照中有一个全量快照(wdr_snapshot_full_backup_interval=12)。
3.保留8天(wdr_snapshot_retention_days=8)。
4.不启用空间维度控制阈值(wdr_snapshot_space_threshold=0)。
四、WDR重要组件
1.SNAPSHOT性能快照:
性能快照可以配置成按一定时间间隔从内核采集一定量的性能数据,持久化在用户表空间。任何一个SNAPSHOT可以作为一个性能基线,其他SNAPSHOT与之比较的结果,可以分析出与基线的性能表现。
2.WDR Reporter:
报表生成工具基于两个SNAPSHOT,分析系统总体性能表现,并能计算出更多项具体的性能指标在这两个时间段之间的变化量,生成SUMMARY 和DETAIL两个不同级别的性能数据。
五、WDR特性约束条件
1.WDR snapshot性能快照会采集不同database的性能数据,如果数据库实例中有大量的database或者大量表,做一次WDR snapshot会花费很长时间。
2.如果在大量DDL期间做WDR snapshot可能造成WDR snapshot失败。
3.在drop database时,做WDR snapshot可能造成WDR snapshot失败。
4.如果生成WDR报告的两次快照期间进行过降副本、节点重启和主备切换等操作,则无法生成WDR报告。
5.数据库实例只读状态会造成WDR snapshot失败。
6.如果在两次快照之间有对表、索引进行删除的操作,则在WDR报告中, Index Scan、Index Tup Fetch、Idx Blks Hit Ratio、Idx Blks Read、Idx Blks Hit、Heap Blks Read可能会出现负数。
六、控制WDR开关的参数
WDR Snapshot启动,即GUC参数enable_wdr_snapshot值为on时(GUC参数详细介绍及设置方法请参考enable_wdr_snapshot部分内容),且快照数量大于等于2。

七、导出并查看WDR诊断报告
1.查看集群状态。
sql
[root@gs01 ~]# su - Ruby
Last login: Sat Nov 22 16:09:16 CST 2025 on pts/2
[Ruby@gs01 ~]$
[Ruby@gs01 ~]$ cm_ctl query -Cvdip
[ CMServer State ]
node node_ip instance state
---------------------------------------------------------------------
1 gs01 192.168.3.60 1 /data/cluster/cmserver/cm_server Primary
[ Cluster State ]
cluster_state : Normal
redistributing : No
balanced : Yes
current_az : AZ_ALL
[ Datanode State ]
node node_ip instance state
--------------------------------------------------------------------------------------
1 gs01 192.168.3.60 6001 8000 /data/cluster/master/datanode1 P Primary Normal
[Ruby@gs01 ~]$
2.创建报告文件。
sql
touch /home/Ruby/wdrTestNode.html
touch /home/Ruby/wdrTestCluster.html
3.进入GaussDB数据库。
sql
gsql -d postgres -p 8000 -r
4.查询已经生成的快照。
sql
gaussdb=# SELECT * FROM snapshot.snapshot;
snapshot_id | start_ts | end_ts | version | snap_flag | base_snapshot_id
-------------+-------------------------------+-------------------------------+---------+-----------+------------------
1 | 2025-11-22 14:40:40.107067+08 | 2025-11-22 14:40:44.584866+08 | 2 | 0 | 1
2 | 2025-11-22 15:45:04.197657+08 | 2025-11-22 15:45:10.228653+08 | 2 | 0 | 2
3 | 2025-11-22 16:40:07.101588+08 | 2025-11-22 16:40:12.444485+08 | 2 | 0 | 3
4 | 2025-11-22 17:40:07.510408+08 | 2025-11-22 17:40:12.730143+08 | 2 | 1 | 3
5 | 2025-11-22 18:40:08.488665+08 | 2025-11-22 18:40:14.776325+08 | 2 | 0 | 5
6 | 2025-11-22 19:40:09.284507+08 | 2025-11-22 19:40:17.529907+08 | 2 | 1 | 5
7 | 2025-11-22 20:40:10.268873+08 | 2025-11-22 20:40:18.037195+08 | 2 | 1 | 5
8 | 2025-11-22 21:40:11.080656+08 | 2025-11-22 21:40:19.562993+08 | 2 | 0 | 8
9 | 2025-11-22 22:40:11.266506+08 | 2025-11-22 22:40:22.029121+08 | 2 | 1 | 8
(9 rows)
5.生成格式化性能报告wdrTestNode.html。
sql
gaussdb=# \a \t \o /home/Ruby/wdrTestNode.html
Output format is unaligned.
Showing only tuples.
gaussdb=#
6.向性能报告wdrTestNode.html中写入数据。
sql
gaussdb=# SELECT generate_wdr_report(6, 7, 'all', 'node', 'dn_6001');
7.关闭性能报告wdrTestNode.html。
sql
gaussdb=# \o
8.生成格式化性能报告wdrTestCluster.html。
sql
gaussdb=# \o /home/Ruby/wdrTestCluster.html
9.向格式化性能报告wdrTestCluster.html中写入数据。
sql
gaussdb=# SELECT generate_wdr_report(6, 7, 'all', 'cluster');
10.关闭性能报告wdrTestCluster.html。
sql
gaussdb=# \o \a \t
Output format is aligned.
Tuples only is off.
gaussdb=#
11.通过网页查看生成的WDR性能报告。
