pg_reorg

名前

pg_reorg -- PostgreSQLデータベース内のテーブルに対して、参照/更新処理をブロックせずに再編成を行います。

概要

pg_reorg [connection-options...] [message-options...] [order-options...] [target-options...]

指定できるオプションには4つのカテゴリがあります。 詳細はオプションを参照してください。

connection-options : 接続パラメータ
-h [--host] host
-p [--port] port
-U [--username] username
-W [--password]
message-options : 出力メッセージ
-e [--echo]
-q [--quiet]
-v [--verbose]
order-options : 並び替えの基準
-o [--order-by] columns [,...]
-n [--no-order]
target-options : 処理対象
-a [--all]
-d [--dbname] dbname
-t [--table] table

説明

pg_reorg は、PostgreSQLデータベース内のテーブルを再編成(行の並び替え)するユーティリティです。 clusterdb と異なり、参照/更新処理をブロックしません。 再編成の方式として、以下のいずれか1つを選択できます。

このユーティリティを使用するためには、以下のことに注意をしてください。

testというデータベースをオンライン CLUSTER するには、下記のコマンドを実行します。

$ pg_reorg test

testという名前のデータベースのfooという1つのテーブルに対してオンライン VACUUM FULL を行うには、下記のコマンドを実行します。

$ pg_reorg --no-order --table foo -d test

オプション

pg_reorg では、下記の4種類のコマンドライン引数を指定できます。

connection-options

PostgreSQLに接続するためのパラメータです。

-h host
--host host
サーバが稼働しているマシンのホスト名を指定します。ホスト名がスラッシュから始まる場合、Unixドメインソケット用のディレクトリとして使用されます。
-p port
--port port
サーバが接続を監視するTCPポートもしくはUnixドメインソケットファイルの拡張子を指定します。
-U username
--username username
接続するユーザ名を指定します。
-W
--password
データベースに接続する前に、pg_reorg は強制的にパスワード入力を促します。
サーバがパスワード認証を要求する場合 pg_reorg は自動的にパスワード入力を促しますので、これが重要になることはありません。 しかし、pg_reorg は、サーバにパスワードが必要かどうかを判断するための接続試行を無駄に行います。 こうした余計な接続試行を防ぐために-Wの入力が有意となる場合もあります。

message-options

pg_reorg を実行した際に任意のメッセージを出力するためのパラメータです。 --quietと他の2つのオプションを同時に指定した場合は、--quietのオプションは無視されます。

-e
--echo
pg_reorg が生成し、サーバに送るコマンドをエコー表示します。
-q
--quiet
進行メッセージを表示しません。
-v
--verbose
処理中に詳細な情報を表示します。

order-options

pg_reorg を実行する際の並び替えの基準を指定するパラメータです。 何も指定されていない場合は、cluster index順にオンライン CLUSTER を行います。 この2つを同時に指定することはできません。

-n
--no-order
オンライン VACUUM FULL の処理を行います。
-o columns [,...]
--order-by columns [,...]
指定したカラムをキーにオンライン CLUSTER を行います。

target-options

pg_reorg を実行する対象を指定するパラメータです。 --all--dbnameまたは--tableを同時に指定することはできません。

-a
--all
対象となる全てのデータベースに対してオンライン CLUSTER、または、オンラインVACUUM FULLを行います。
-d dbname
--dbname dbname
オンライン CLUSTER、または、オンライン VACUUM FULL を行うデータベース名を指定します。 データベース名が指定されておらず、-a(または--all)も指定されていない場合、 データベース名はPGDATABASE環境変数から読み取られます。この変数も設定されていない場合は、接続時に指定したユーザ名が使用されます。
-t table
--table table
オンライン CLUSTER 、または、オンライン VACUUM FULL を行うテーブルを指定します。 このオプションが指定されていない場合は、対象となったデータベースに存在する全ての対象テーブルに対して処理を行います。

環境変数

PGDATABASE
PGHOST
PGPORT
PGUSER
デフォルトの接続パラメータです。

また、このユーティリティは、他のほとんどの PostgreSQL ユーティリティと同様、 libpq でサポートされる環境変数を使用します。詳細については、環境変数の項目を参照してください。

トラブルシューティング

pg_reorg の実行に失敗した場合にエラーが表示されます。 想像されるエラー原因と対処を示します。

致命的なエラーで終了した場合、手動によるクリーンアップを行う必要があります。 クリーンアップは、エラーが発生したデータベースに対して、$PGHOME/share/contrib/uninstall_pg_reorg.sql を実行し、その後、$PGHOME/share/contrib/pg_reorg.sql を実行します。

pg_reorg : reorg database "template1" ... skipped
--allオプションを指定した際に、pg_reorg がインストールされていないデータベースに対して表示されます。
pg_reorg スキーマのインストールを行ってください。
ERROR: pg_reorg is not installed
--dbnameで指定したデータベースにpg_reorg がインストールされていません。
pg_reorg のインストールを行ってください。
ERROR: relation "table" has no primary key
指定したテーブルにPRIMARY KEYが存在していません。
対象のテーブルにPRIMARY KEYの作成を行ってください。(ALTER TABLE ADD PRIMARY KEY)
ERROR: relation "table" has no cluster key
指定したテーブルに CLUSTER KEYが存在していません。
対象のテーブルに CLUSTER KEYの作成を行ってください。(ALTER TABLE CLUSTER)
pg_reorg : query failed: ERROR: column "col" does not exist
--order-by で指定したカラムが対象のテーブルに存在していません。
対象のテーブルに存在するカラムを指定してください。
ERROR: permission denied for schema reorg
操作を行おうとした対象に権限がありません。
スーパーユーザで操作を行ってください。
pg_reorg : query failed: ERROR: trigger "z_reorg_trigger" for relation "tbl" already exists
操作を行おうとした対象にpg_reorg が処理のために作成するトリガと同名のものが存在しています。
トリガの改名か削除を行ってください。
pg_reorg : trigger conflicted for tbl
操作を行おうとした対象にpg_reorg が処理のために作成するトリガより後に実行されるトリガが存在しています。
トリガの改名か削除を行ってください。

制約

pg_reorg を使用する際には、以下の制約があります。以下の制約に関する操作を行った場合の動作は保証されません。注意してください。

一時テーブルへの操作

pg_reorg では、一時テーブルは操作の対象外です。

GiSTインデックスの使用

インデックス種別がGiSTとなっているインデックスがクラスタインデックスとなっている テーブルはpg_reorg コマンドを使用して操作を行うことはできません。 これは、GiSTインデックスのソート順序は一意ではないため、ORDER BYによる ソートが行えないためです。

DDLコマンドの発行

pg_reorg の実行中には、VACUUMANALYZE 以外 のDDL操作は行わないでください。 多くの場合、pg_reorg は失敗しロールバックされます。 しかし、以下の操作ではデータが破損するため、非常に危険です。

TRUNCATE
TRUNCATEにより削除した行が、pg_reorg 実行後には復元しています。操作結果が消失します。
CREATE INDEX
CREATE INDEXは、スワップされない索引が残る可能性があります。データの不整合が生じます。
ADD COLUMN
ADD COLUMNは、追加された値が全てNULLに置換されてしまう可能性があります。データが消失します。
ALTER COLUMN TYPE
ALTER COLUMN TYPEは、実行するとスキーマで定義された型と実際の格納状態に齟齬をきたします。データの不整合が生じます。
ALTER TABLE SET TABLESPACE
ALTER TABLE SET TABLE SPACEは、pg_reorg 実行後にrelfilenodeとの不整合が起こるため、対象のテーブルに対する参照/更新操作時にエラーが発生します。

インストール方法

pg_reorg のインストールは、標準のcontribモジュールと同様です。

ビルド

pg_reorg のフォルダを$PGHOME/contrib/に配置し、make, make installを行ってください。

データベースへの登録

PostgreSQLを起動し、対象のデータベースに対して $PGHOME/share/contrib にある pg_reorg.sql を実行し、インストールを行ってください。

動作環境

PostgreSQLバージョン
PostgreSQL 8.3
OS
RHEL 5.2, Windows XP SP3
ディスク容量
処理対象のテーブル、インデックスサイズの2倍以上のディスク空き容量

関連項目

clusterdb, vacuumdb

Copyright (c) 2008, NIPPON TELEGRAPH AND TELEPHONE CORPORATION