概要
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つを選択できます。
- オンライン CLUSTER (cluster index順に行を並び替える)
- ユーザの指定した順に行を並び替える
- オンライン VACUUM FULL (行の詰め合わせを行う)
このユーティリティを使用するためには、以下のことに注意をしてください。
- このユーティリティは、スーパーユーザのみが実行することができます。
- 対象のテーブルはPRIMARY KEYを持っている必要があります。
- pg_reorg 実行後のデータの状態は、統計情報に反映されていません。統計情報を最新化するため、pg_reorg 実行後にANALYZEを実行してください。
例
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 の実行中には、VACUUM と ANALYZE 以外 のDDL操作は行わないでください。
多くの場合、pg_reorg は失敗しロールバックされます。
しかし、以下の操作ではデータが破損するため、非常に危険です。
- TRUNCATE
- 削除した行が pg_reorg 実行後には復元しています。操作結果が消失します。
- CREATE INDEX
- スワップされない索引が残る可能性があります。データの不整合が生じます。
- ALTER TABLE ... ADD COLUMN
- 追加された値が全てNULLに置換されてしまう可能性があります。データが消失します。
- ALTER TABLE ... ALTER COLUMN TYPE
- 実行するとスキーマで定義された型と実際の格納状態に齟齬をきたします。データの不整合が生じます。
- ALTER TABLE ... SET TABLESPACE
- 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倍以上のディスク空き容量
Copyright (c) 2008-2009, NIPPON TELEGRAPH AND TELEPHONE CORPORATION