0、说明
AWR报告全称Automatic Workload Repository,自动负载信息库,是一种性能收集和分析工具,提供了一个时间段内整个系统的报表数据,熟悉Oracle的人想必都不陌生。
可是在postgresql中并没有AWR这一功能,不过我们可以通过自定义一些监控脚本来实现相似的功能。
1、安装
下载地址:https://download.csdn.net/download/weixin_39540651/13026044
说明:这里我是安装在pg13中的,之前的版本需要将pg_stat_statements的total_plan_time字段改成total_time
1.1、添加pg_stat_statements插件
需要用到pg_stat_statements插件:
$ vi postgresql.conf
shared_preload_libraries='pg_stat_statements'
$ pg_ctl restart -m fast
1.2、解压安装
pg13@cnndr4pptliot-> cd postgresql-13beta3/contrib/
pg13@cnndr4pptliot-> tar -zxvf pg_awr.tar.gz
pg13@cnndr4pptliot-> cd pg_awr/
pg13@cnndr4pptliot-> make&make install
[1] 31553
make: Nothing to be done for `all’.
/bin/mkdir -p ‘/home/pg13/pgsql13.3/share/extension’
/bin/mkdir -p ‘/home/pg13/pgsql13.3/share/extension’
/bin/install -c -m 644 .//pg_awr.control ‘/home/pg13/pgsql13.3/share/extension/’
/bin/install -c -m 644 .//pg_awr–0.0.1.sql ‘/home/pg13/pgsql13.3/share/extension/’
[1]+ Done make
1.3、创建扩展
bill=# create extension pg_awr;
CREATE EXTENSION
bill=# \dx+ pg_awr
Objects in extension "pg_awr"
Object description
---------------------------------------------------------------
function __monitor__.sequence_stats()
function __monitor__.snap_database(boolean)
function __monitor__.snap_delete(bigint)
function __monitor__.snap_delete(timestamp without time zone)
function __monitor__.snap_delete_data(bigint)
function __monitor__.snap_global(boolean)
function __monitor__.snap_report_database(bigint,bigint,text)
function __monitor__.snap_report_global(bigint,bigint,text)
function __monitor__.vacuumlo(bigint)
schema __monitor__
sequence __monitor__.snap_list_id_seq
table __monitor__.snap_list
table __monitor__.snap_pg_conn_stats
table __monitor__.snap_pg_cputime_topsql
table __monitor__.snap_pg_database_age
table __monitor__.snap_pg_db_conn_limit
table __monitor__.snap_pg_db_rel_size
table __monitor__.snap_pg_db_role_setting
table __monitor__.snap_pg_db_size
table __monitor__.snap_pg_dead_tup
table __monitor__.snap_pg_hash_idx
table __monitor__.snap_pg_index_bloat
table __monitor__.snap_pg_long_2pc
table __monitor__.snap_pg_long_xact
table __monitor__.snap_pg_many_indexes_rel
table __monitor__.snap_pg_notused_indexes
table __monitor__.snap_pg_rel_age
table __monitor__.snap_pg_rel_space_bucket
table __monitor__.snap_pg_role_conn_limit
table __monitor__.snap_pg_seq_deadline
table __monitor__.snap_pg_stat_activity
table __monitor__.snap_pg_stat_archiver
table __monitor__.snap_pg_stat_bgwriter
table __monitor__.snap_pg_stat_database
table __monitor__.snap_pg_stat_statements
table __monitor__.snap_pg_statio_all_indexes
table __monitor__.snap_pg_statio_all_tables
table __monitor__.snap_pg_table_bloat
table __monitor__.snap_pg_tbs_size
table __monitor__.snap_pg_unlogged_table
table __monitor__.snap_pg_user_deadline
table __monitor__.snap_pg_vacuumlo
table __monitor__.snap_pg_waiting
(43 rows)
2、使用
2.1、生成快照(全局)
select __monitor__.snap_global(); -- 给全局打快照(注意包含的是全局信息,并不是每个库的快照信息)。
2.2、生产快照(库级)
select __monitor__.snap_database(); -- 给当前数据库打快照。
2.3、查看快照列表
select * from __monitor__.snap_list;
2.4、指定快照起始ID,生成全局报告(text模式)
select * from __monitor__.snap_report_global($begin_snap_id, $end_snap_id);
2.5、指定快照起始ID,生成库级报告(text模式)
select * from __monitor__.snap_report_database($begin_snap_id, $end_snap_id);
2.6、 删除指定snap_ID以前的快照。
select __monitor__.snap_delete(10::int8);
2.7、 删除指定时间以前的快照。
select __monitor__.snap_delete('2020-10-23 12:00:00');
3、配置
create_snap.sql:
创建快照
select __monitor__.snap_global();
select __monitor__.snap_database();
delete_snap.sql:
删除一天前的快照
select __monitor__.snap_delete((current_date-1)::timestamp);
snapshot.sh:

#!/bin/bash
# #################################################
# create and delete global&database snapshot.
# #################################################
psql --pset=pager=off -q -U bill -d bill -f create_snap.sql > create_snap.log
psql --pset=pager=off -q -U bill -d bill -f delete_snap.sql > delete_snap.log
定时任务:
可以设置成和oracle一样每小时生成一次快照
00 * * * * nohup sh /home/pg13/snapshot.sh &