CentOS で PL/pgSQL デバッガ

PostgreSQL 用の GUI インタフェースである pgAdmin-III (pgAdmin: PostgreSQL administration and management tools) ですが、出来が良いわりにはあまり用いられていないようです。コマンドラインのツールでだいたい足りてしまうからでしょうが、ストアドプロシージャのデバッグの際などには、変数の状態等を見ながら作業ができる GUI もそれなりにありがたいですので、pgAdmin-III で動作する PL/pgSQL のデバッガ (PgFoundry: PLpgSQL Debugger by EnterpriseDB: Project Info) を CentOS-5.5 上で試してみたいと思います。

pgAdmin-III でのデバッグ

Red Hat Enterprise Linux (RHEL) なり CentOS の ver. 5 系は 2005 年のデビューですので、ずっと PostgreSQL のバージョンが 8.1 と、いくらなんでも古かったのですが、RHEL-5.5 からは PostgreSQL-8.4 が使えるようになりました。ここでは、そちらで行ってみたいと思います。

サーバの設定

パッケージ “postgresql-server” と “postgresql84-server” は排他です。何かの依存で “postgresql-server” が先に入ってしまうと、後から “postgresql84-server” を入れられませんので、注意してください。

[root@queen-centos ~]# yum install -y postgresql84 postgresql84-server
(中略)
[root@queen-centos ~]#

データベースを初期化、起動し、システム起動時に起動するようにします。

[root@queen-centos ~]# service postgresql initdb
データベースを初期化中:                                    [  OK  ]
[root@queen-centos ~]# service postgresql start
postgresql サービスを開始中:                               [  OK  ]
[root@queen-centos ~]# chkconfig postgresql on
[root@queen-centos ~]#

CentOS のデフォルトだと、PostgreSQL は ident 認証になっていますので、”postgres” ユーザに su して、テスト用のデータベースと DB ロールを作成します。ついでに、リモートからアクセスできるようにしておきます。pg_hba.conf のアクセス制御のネットワークの指定については、環境ごとに適宜読み替えてください。

[root@queen-centos ~]# su - postgres
-bash-3.2$ createdb pgtest
-bash-3.2$ createuser --encrypted --pwprompt \
 --superuser --createrole --createdb pgtest
新しいロールのパスワード:
もう一度入力してください:
-bash-3.2$ cp /var/lib/pgsql/data/postgresql.conf \
 /var/lib/pgsql/data/postgresql.conf.orig
-bash-3.2$ vi /var/lib/pgsql/data/postgresql.conf
-bash-3.2$ diff -uNr /var/lib/pgsql/data/postgresql.conf.orig \
 /var/lib/pgsql/data/postgresql.conf
--- /var/lib/pgsql/data/postgresql.conf.orig    2010-08-20 15:23:50.000000000 +0
+++ /var/lib/pgsql/data/postgresql.conf 2010-08-20 15:24:41.000000000 +0900
@@ -56,7 +56,7 @@

 # - Connection Settings -

-#listen_addresses = 'localhost'                # what IP address(es) to listen;
+listen_addresses = '*'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
                                        # (change requires restart)
-bash-3.2$ cp /var/lib/pgsql/data/pg_hba.conf \
 /var/lib/pgsql/data/pg_hba.conf.orig
-bash-3.2$ vi /var/lib/pgsql/data/pg_hba.conf
-bash-3.2$ diff -uNr /var/lib/pgsql/data/pg_hba.conf.orig \
 /var/lib/pgsql/data/pg_hba.conf
--- /var/lib/pgsql/data/pg_hba.conf.orig        2010-08-20 15:26:04.000000000 +0
+++ /var/lib/pgsql/data/pg_hba.conf     2010-08-20 15:27:07.000000000 +0900
@@ -72,3 +72,6 @@
 host    all         all         127.0.0.1/32          ident
 # IPv6 local connections:
 host    all         all         ::1/128               ident
+# IPv4 local network connections:
+host    pgtest      pgtest      192.168.1.0/24        md5
+
-bash-3.2$ exit
logout
[root@queen-centos ~]# service postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]
[root@queen-centos ~]# iptables -I INPUT -p tcp --dport 5432 -j ACCEPT
[root@queen-centos ~]# service iptables save
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
[root@queen-centos ~]#

PL/pgSQL デバッガのインストール

本家からダウンロードできる tar ball のソースは PostgreSQL-8.4 には古いのですが、かといって CVS 版も 64bit 環境だと微妙にコケるので、パッチをあてた SRPM を置いておきます:

以下のようにビルドしてインストールしてください:

[root@queen-centos ~]# yum install -y rpm-build gcc \
 postgresql84-devel openssl-devel
[root@queen-centos ~]# rpmbuild --rebuild \
 postgresql84-pldebugger-8.4.4-0.cvs20100919.src.rpm
[root@queen-centos ~]# rpm -Uvh \
 /usr/src/redhat/RPMS/x86_64/postgresql84-pldebugger-8.4.4-0.cvs20100919.x86_64.rpm
[root@queen-centos ~]#

PL/pgSQL 用のデバッグプラグインがロードされるように設定ファイルを書きかえ、PostgreSQL を再起動します。

[root@queen-centos ~]# cp /var/lib/pgsql/data/postgresql.conf \
 /var/lib/pgsql/data/postgresql.conf.orig2
[root@queen-centos ~]# vi /var/lib/pgsql/data/postgresql.conf
[root@queen-centos ~]# diff -uNr /var/lib/pgsql/data/postgresql.conf.orig2 \
 /var/lib/pgsql/data/postgresql.conf
--- /var/lib/pgsql/data/postgresql.conf.orig2    2010-09-20 17:33:05.000000000 +0900
+++ /var/lib/pgsql/data/postgresql.conf 2010-09-20 17:34:28.000000000 +0900
@@ -121,7 +121,7 @@

 #max_files_per_process = 1000          # min 25
                                        # (change requires restart)
-shared_preload_libraries = ''          # (change requires restart)
+shared_preload_libraries = '$libdir/plugins/plugin_debugger'

 # - Cost-Based Vacuum Delay -

[root@queen-centos ~]# service postgresql restart
postgresql サービスを停止中:                               [  OK  ]
postgresql サービスを開始中:                               [  OK  ]
[root@queen-centos ~]#

pldbgapi.sql を読み込んで、デバッグ用の型と共有ライブラリへのコネクタを定義し、PL/pgSQL 言語を組み込めば、サーバ側は準備完了です。

[root@queen-centos ~]# psql -h queen-centos.priv -p 5432 -U pgtest pgtest
ユーザ pgtest のパスワード:
psql (8.4.4)
"help" でヘルプを表示します.

pgtest=# \i /usr/share/pgsql/contrib/pldbgapi.sql
(中略)
pgtest=# create language 'plpgsql';
CREATE LANGUAGE
pgtest=# \q
[root@queen-centos ~]#

なお、下記で CVS からのソースの anonymous ダウンロードができます:

[root@queen-centos ~]# yum install -y cvs
(中略)
[root@queen-centos ~]# cvs \
 -d :pserver:anonymous@cvs.pgfoundry.org:/cvsroot/edb-debugger login
[root@queen-centos ~]# cvs \
 -d :pserver:anonymous@cvs.pgfoundry.org:/cvsroot/edb-debugger checkout server
[root@queen-centos ~]#

バージョン違いでビルドできない場合:

edb-debugger のソースは、本来は PostgreSQL のソースツリーの contrib/ に入れてビルドするものですが、今回は postgresql84-server をそのまま使いたかったので、分離してあります。しかし、postgresql84-devel パッケージは、残念ながら PL/pgSQL のヘッダを含んでいませんので、上記 SRPM は、postgresql84 の SRPM から持ってきた plpgsql.h を含んでいます。そのため、本体 (postgresql84) のマイナーバージョンが進んだら、適宜ヘッダファイルを更新して作り直す必要があります。

参考:

なお、これらの手順が面倒で、なおかつ RPM でのパッケージ管理がなくても良いのであれば、下記よりダウンロードできる EnterpriseDB 社の Postgres Plus のパッケージを入れるのも手です:

デバッガの開発元ですので、普通にデバッガを利用できる状態でインストールできます。

pgAdmin-III のインストール

PostgreSQL の GUI クライアントである pgAdmin-III は CentOS の標準レポジトリに入っていませんので、EPEL から入れます。この例では、別のホストにインストールしています。

[root@queen-centos2 ~]# rpm -Uvh $(printf \
 ftp://download.fedora.redhat.com/pub/epel/%s/%s/epel-release-*-*.noarch.rpm \
 $(rpm -q --qf "%{version}" $(rpm -q --whatprovides redhat-release)) \
 $(uname --hardware-platform) )
(中略)
[root@queen-centos2 ~]# yum install -y pgadmin3
(中略)
[root@queen-centos2 ~]#

参考:

デバッグをしてみる

メニューから pgAdmin-III を実行します:

メニュー

データベースに接続し、適当なストアドプロシージャかトリガを作成します。そこにブレークポイントを設定します:

ブレークポイントの選択

その関数がどこかから呼ばれるまで待機します:

デバッグセッションが待機中

関数が呼ばれると実行が停止され、ステップ実行が可能になります:

ステップ実行中

One Comment

Leave a Reply