[pgsql-jp: 36411] pgrowlocks 1.0
Tatsuo Ishii
ishii @ sraoss.co.jp
2005年 11月 16日 (水) 22:02:43 JST
石井です.
テーブルの行ロック情報を取得する関数 pgrowlocks のバージョン1.0をリリー
スしたのでお知らせします.今のところ,PostgreSQL 8.1と8.0に対応してい
ます.
こんな感じで使います.
test=# SELECT * FROM pgrowlocks('t1');
locked_row | lock_type | locker | multi | xids | pids
------------+-----------+--------+-------+-----------+---------------
(0,1) | Shared | 19 | t | {804,805} | {29066,29068}
(0,2) | Shared | 19 | t | {804,805} | {29066,29068}
(0,3) | Exclusive | 804 | f | {804} | {29066}
(0,4) | Exclusive | 804 | f | {804} | {29066}
(4 rows)
つまり,ロックされている行のTIDと,ロックの種類,トランザクションID,
プロセスIDなどが表示されるわけです.
以前からこういう関数が欲しかったのですが,8.1では共有行ロックやマルチ
トランザクションが導入され,結構複雑なことになったのを機会に,8.1の開
発中に無理やり:-)必要なインターフェイスをPostgreSQLに仕込みました.そ
の責任上,今回pgrowlocksを公開させていただきます.
ソースの取得は,
ftp://ftp.sra.co.jp/pub/cmd/postgres/pgrowlocks/pgrowlocks-1.0.tar.gz
でどうぞ.
参考までに,READMEを付けておきます.
--
SRA OSS, Inc. Japan
Tatsuo Ishii
----------------------------------------------------------------------
pgrowlocks README 2005/11/16 石井達夫
1. pgrowlocksとは
pgrowlocksは,指定されたテーブルの行ロックに関する情報を表示します.
pgrowlocksの返す型は,以下のようになります.
CREATE TYPE pgrowlocks_type AS (
locked_row TID, -- row TID
lock_type TEXT, -- lock type
locker XID, -- locking XID
multi bool, -- multi XID?
xids xid[], -- multi XIDs
pids INTEGER[] -- locker's process id
);
実行例を示します.
test=# SELECT * FROM pgrowlocks('t1');
locked_row | lock_type | locker | multi | xids | pids
------------+-----------+--------+-------+-----------+---------------
(0,1) | Shared | 19 | t | {804,805} | {29066,29068}
(0,2) | Shared | 19 | t | {804,805} | {29066,29068}
(0,3) | Exclusive | 804 | f | {804} | {29066}
(0,4) | Exclusive | 804 | f | {804} | {29066}
(4 rows)
各項目の説明です.
locked_row -- ロックされた行のタプルID(TID)
lock_type -- 共有ロックなら"Shared",排他ロックなら"Exclusive"
locker -- ロックをかけているトランザクションID[注1]
multi -- lockerがマルチトランザクションならtそうでなければf
xids -- ロックをかけているトランザクションID[注2]
pids -- ロックをかけているバックエンドプロセスのプロセスID[注2]
[注1: lockerがマルチなら,トランザクションIDではなくてマルチIDになり
ます.]
[注2: lockerがマルチの場合,複数のデータが表示されます.]
2. pgrowlocksのインストール
pgrowlocksのインストールには,PostgreSQLをインストールしたときのソー
スツリーが必要です.今のところ対応しているバージョンはPostgreSQL
8.0と8.1です.
ここではPostgreSQLのソースは/usr/local/src/postgresql-8.1.0/に展開さ
れているものとします.
1) pgrowlocksのソースを展開します.ソースファイルは
/tmp/pgrowlocks-1.0.tar.gzに置いてあるものとします.
$ cd /usr/local/src/postgresql-8.1.0/contrib
$ tar xfz /tmp/pgrowlocks-1.0.tar.gz
2) PostgreSQL 8.0の場合は,ソースの一部に修正が必要です.
pgrowlocks.cの61行目辺りに
#undef MAKERANGEVARFROMNAMELIST_HAS_TWO_ARGS
というのがあるので,これを
#define MAKERANGEVARFROMNAMELIST_HAS_TWO_ARGS
に書き換えます(undef->defineにします).
3) コンパイルして関数の共有ライブラリをインストールします.
$ cd /usr/local/src/postgresql-8.1.0/contrib/pgrowlocks
$ make
$ make install
4) ユーザ定義関数を登録します.
$ psql -e -f /usr/local/pgsql/share/contrib/pgrowlocks.sql test
この例では"test"というデータベースに登録していますが,もし他のデー
タベースに登録する場合はここを読み替えてください.
3. pgrowlocksの使い方
pgrowlocksの呼び出し形式は以下です.
CREATE OR REPLACE FUNCTION pgrowlocks(text) RETURNS pgrowlocks_type
AS 'MODULE_PATHNAME', 'pgrowlocks'
LANGUAGE 'c' WITH (isstrict);
第一引数: テーブル名
関数の戻りはpgrowlocks_type型です.
pgrowlocksはテーブルにAccessShareLockロックをかけ,1行ずつ読み出し
ては行ロックがかかっているかどうかチェックします.以下の点に注意し
てください.
1) 該当テーブルに排他ロックがかかっていると,pgrowlocksの実行はブロッ
クされます.
2) pgrowlocksの実行中に新たにかかったり,解除された行ロックに関する
情報はpgrowlocksの実行結果に反映されていない可能性があります.
pgrowlocksはロックされた行の内容は表示しません.行内容を見たい場合
は,テーブルをpgrowlocksのlocked_rows列で結合します.例を示します.
SELECT * FROM accounts AS a, pgrowlocks('accounts') AS p WHERE p.locked_ row = a.ctid;
4. pgrowlocksのライセンス条件について
pgrowlocks.cの冒頭に書いてある通りです(修正BSDライセンスに準じてい
ます).また,pgrowlocks は完全に無保証です.pgrowlocks を使用したこ
とによって生じるいかなる結果に関しても責任を負いません.
5. 改訂履歴
2005/11/16 pgrowlocks バージョン 1.0リリース
pgsql-jp メーリングリストの案内