[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 メーリングリストの案内