PostgreSQL の状態をレポートするスクリプト


PostgreSQL の稼動状態をきれいなレポートで確認する

PostgreSQL データベースの稼動状態を HTML でキレイに見たい場合に使えそうなスクリプトを作ってみました。 2つのスクリプトから構成されていますので、どちらも同じディレクトリに配置して下さい。




PostgreSQL レポート生成用シェルスクリプト

pgsql_report.sh というファイル名で下記のシェルスクリプトを作成します。スクリプト内のデータベース接続先やポート番号、データベース名、データベースユーザー名は書き換えて使って下さい。
#!/bin/bash
#
# pgsql_report.sh
#
echo ${SQL} | psql \
  -h 127.0.0.1 \
  -p 5432 \
  -d hoge \
  -U postgres \
  -f pgsql_report.sql


PostgreSQL レポート生成用 SQL スクリプト

そして下記の SQL を pgsql_report.sql というファイル名で保存して下さい。
\o settings_report.html

\T 'cellspacing=0 cellpadding=0'
\qecho '<html><head><style>H2{background:#e6e6e6}</style>'
\qecho '<title>PostgreSQL Report</title></head><body>'
\qecho '<table><tr valign=''top''><td>'

\qecho '<h2>Report Date</h2>'
\pset format html
SELECT current_timestamp AS report_timestamp;

\qecho '<h2>PostgreSQL Basic Information</h2>'
\pset format html
SELECT version() AS PostgreSQL_Version;

\H
\qecho '<h2>PostgreSQL Database Settings</h2>'
\x on
\t on
\pset format html
SELECT category, string_agg(name || '=' || setting, E'\n' ORDER BY name) As settings
FROM pg_settings
WHERE 1 = 1
GROUP BY category
ORDER BY category;

\x off
\t off
\H
\qecho '<h2>Current Sessions</h2>'
\pset format html
SELECT procpid, usename, application_name, client_addr, query_start, waiting, current_query
FROM pg_stat_activity ORDER BY query_start;

\H
\qecho '<h2>Database Sizing Report</h2>'
\pset format html
SELECT d.datname AS Name,  pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
  CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
    THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
    ELSE 'No Access'
  END AS SIZE
FROM pg_catalog.pg_database d
ORDER BY
  CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
    THEN pg_catalog.pg_database_size(d.datname)
    ELSE NULL
  END DESC -- nulls first
;

\H
\qecho '<h2>Relation Sizing Report (Top 10)</h2>'
\pset format html
SELECT nspname || '.' || relname AS "relation",
  pg_size_pretty(pg_relation_size(C.oid)) AS "size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 10;

\qecho '</td></tr></table>'
\qecho '</body></html>'

\o


結果として生成される PostgreSQL レポートを見てみる

では上記2つのファイルを同じディレクトリに作成したら、実際にレポートを作成してみましょう。
#!/bin/bash
$ ./pgsql_report.sh


結果として次のような HTML レポートが生成されます。


生成されたレポートはシェルスクリプト内でメールで送信するようにしたりすると良いでしょう。