pg_statsinfoを使用する際の注意点

pg_statsinfoは、PostgreSQLやOSのリソース情報、統計情報をスナップショットとして取得するためのツールで、
複数のスナップショット間の差分をレポートとして出力できます。
これによって、DBで行われた活動状況の確認や性能ボトルネックの発見、また問題発生時の原因調査などが簡単になります。


数十台のPostgreSQLサーバを管理しようとすると、さすがに個別で見るのは厳しいので、半年程前に
pgstatspackで取得したスナップショット情報を集中管理し、Web上で各レポートやグラフの表示ができるものを
こっそり作成してたりしたのですが、情報取得部分だけ作って絶賛放置中でした・・・。
(取得してた情報はそれなりに役に立ったのですが。)


ですが、良さそうなツールが公開されたとのことで、早速使ってみることに。


日本で開発されているので、ドキュメントが全て日本語で書かれていて、しかも豊富です。


pg_statinfoのページはこちら


インストールは、マニュアルを見てセットアップすると問題なくできたのですが、いざスナップショットを取得しようとすると
以下のようなエラーが発生しました。

stats=# SELECT get_stats();
ERROR: sql error
DETAIL: ERROR: relation "_replication_xxxxx.partind_replication_xxxx_sl_log_1-node-21" does not exist

SQLがエラーになる箇所があるようで、うーむ、困った。
インデックス名の"-"がダメな気がするのですが、該当のインデックスはSlony-Iが自動で作成するものなので、さらに困った。
Slony-Iのsrc/backend/slony1_funcs.sqlの5747行目付近(addPartialLogIndicesの中)に書かれています。


既に、Slony-Iは稼動中なのでそこに手を入れるわけにもいかず、pg_statsinfoの方に手をいれることにしました。


修正する箇所は、stats_info/stats_info_sql.hのSQL_INSERT_T_INDEXINFO_FORMATで定義されているSQL。(386行目付近)

pg_relation_size(stat_idx.schemaname ||''.''||stat_idx.indexrelname), \

       ↓

pg_relation_size(stat_idx.schemaname ||''.''||''\"''||stat_idx.indexrelname||''\"''), \

上記の変更することで、うまくスナップショットが取得できるようになりました。
もう少し使ってみて、問題無い様でしたら本格的に運用に乗せていこうかなと考えています。
(レポートの自動取得やメール送信なんかもできたら、結構楽できそうな気がします。)



ちなみに環境は、こんな感じです。
管理DB:PostgreSQL8.3.0
対象DB:PostgreSQL8.3.3+Slony-I 1.2.14

追記1

スナップショットを削除するdelete_statsがうまく動かずに、以下のエラーが発生します。

stats=# SELECT delete_stats(1);
ERROR: relation "t_colcorr" does not exist
CONTEXT: SQL statement "DELETE FROM t_colcorr WHERE snapshot_id = $1 "
PL/pgSQL function "delete_stats" line 27 at SQL statement

「t_colcorrテーブルがない」とのことなので、テーブルを見てみると確かにない・・・。
これは、きっとt_columncorrテーブルのことだと信じて、delete_stats関数の該当箇所を修正。


すると消せるようになりました。

5/18追記

pg_statsinfo1.0.1でこのバグは修正されました。

追記2

マニュアルに間違いっぽ箇所を発見。

ソースによるインストールのPATHを通すところです。

$ cp $PGSRC/contrib/pg_statsinfo-*/target_db/pg_get_logfilterinfo $LOGFILTER
$ cp $PGSRC/contrib/pg_statsinfo-*/target_db/* $REPORT
$ export PATH=$LOGFILTER:$REPOTER:$PATH

    ↓

$ cp $PGSRC/contrib/pg_statsinfo-*/target_db/pg_get_logfilterinfo $LOGFILTER
$ cp $PGSRC/contrib/pg_statsinfo-*/reporter/* $REPORT
$ export PATH=$LOGFILTER:$REPORT:$PATH

レポート出力時のサンプルで$REPORTを指定しているので、きっと$REPORTが正しいのでしょう。

要望1

情報取得対象となるschemaを選択できるようにして欲しい。
基本的にpublic schemaだけで十分なケースが多いので、システムカタログ等の情報はサイズも大きくなるので
取らないようにできるようになったらいいですね。
(私は幾つかのSQLの条件にschema名を指定しています。)


もっとも、情報を取得しないschemaでボトルネックが発生しないことが前提ですが。

要望2

Webの管理画面とか欲しいですねー。(言うだけなら無料なので)
Open Flash Chart等を使ってグラフ表示できたら、尚いいですねー。(無茶も言うだけなら無料!!)

気が向いたら、自分で作りますか。。。