pg_reorg 1.1.13


  1. 名前
  2. 概要
  3. 説明
  4. 使用例
  5. オプション
  6. 環境変数
  7. 使用上の注意と制約
  8. 詳細
  9. インストール方法
  10. 動作環境
  11. 更新履歴
  12. 関連項目

名前

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

概要

pg_reorg [OPTIONS]

オプション OPTIONS には以下を指定できます。 詳細はオプションを参照してください。

説明

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 では、下記のコマンドライン引数を指定できます。

固有オプション

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

-n
--no-order
オンライン VACUUM FULL の処理を行います。
-o columns [,...]
--order-by columns [,...]
指定したカラムをキーにオンライン CLUSTER を行います。
-t table
--table=table
オンライン CLUSTER 、または、オンライン VACUUM FULL を行うテーブルを指定します。 このオプションが指定されていない場合は、対象となったデータベースに存在する全ての対象テーブルに対して処理を行います。
-T seconds
--wait-timeout=seconds
再編成完了直前に一瞬だけ排他ロックを取得しますが、この排他ロックが取得できるまで待機する秒数を指定します。 この秒数が経過してもロックが取得できない場合には、対象のテーブルにアクセスしている他の全てのクエリを取り消します。 また、サーバのバージョンが 8.4 またはそれ以降の場合には、指定した秒数の2倍経過してもロックを取得できない場合には、強制的に切断します。 デフォルトは60秒です。
-Z
--no-analyze
再編成後に ANALYZE を行いません。 このオプションが指定されていない場合は、再編成後に ANALYZE します。

接続オプション

PostgreSQLに接続するためのパラメータです。 --allと--dbnameまたは--tableを同時に指定することはできません。

-a
--all
対象となる全てのデータベースに対してオンライン CLUSTER、または、オンラインVACUUM FULLを行います。
-d DBNAME
--dbname=DBNAME
オンライン CLUSTER、または、オンライン VACUUM FULL を行うデータベース名を指定します。 データベース名が指定されておらず、-a(または--all)も指定されていない場合、 データベース名はPGDATABASE環境変数から読み取られます。 この変数も設定されていない場合は、接続時に指定したユーザ名が使用されます。
-h HOSTNAME
--host=HOSTNAME
サーバが稼働しているマシンのホスト名を指定します。ホスト名がスラッシュから始まる場合、Unixドメインソケット用のディレクトリとして使用されます。
-p PORT
--port=PORT
サーバが接続を監視するTCPポートもしくはUnixドメインソケットファイルの拡張子を指定します。
-U USERNAME
--username=USERNAME
接続するユーザ名を指定します。
-w
--no-password
パスワードの入力を促しません。 サーバがパスワード認証を必要とし、かつ、.pgpassファイルなどの他の方法が利用できない場合、接続試行は失敗します。 バッチジョブやパスワードを入力するユーザが存在しない場合にこのオプションは有用かもしれません。
-W
--password
データベースに接続する前に、強制的にパスワード入力を促します。
サーバがパスワード認証を要求する場合 自動的にパスワード入力を促しますので、これが重要になることはありません。 しかし、サーバにパスワードが必要かどうかを判断するための接続試行を無駄に行います。 こうした余計な接続試行を防ぐために -W の入力が有意となる場合もあります。

一般オプション

-e
--echo
サーバに送信するSQLを表示します。
-E
--elevel
ログ出力レベルを設定します。 DEBUG, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, PANIC から選択します。 デフォルトは INFO です。
--help
使用方法について表示します。
--version
バージョン情報を表示します。

環境変数

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

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

トラブルシューティング

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

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

PostgreSQL 9.2 以降では、エラーが発生したデータベースに接続し、DROP EXTENSION pg_reorg CASCADE を実行し、その後、CREATE EXTENSION pg_reorg を実行することでもクリーンアップが可能です。

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 は reorg スキーマに作業用テーブルを作成し、そこでデータの並び替えを行います。 最後にシステムカタログを直接書き換えることで、元のテーブルと名前を交換しています。

インストール方法

UNIX や Linux では、make を実行すると自動的に pgxs を使ってビルドできます。 前もって PostgreSQL 開発用パッケージ (postgresql-devel 等) をインストールし、pg_config にパスを通してください。

$ cd pg_reorg
$ make
$ su
$ make install

Windows では Microsoft Visual C++ 2010 でビルドできます。 msvc フォルダ内にプロジェクトファイルがあります。

その後、データベースに関数を登録します。

$ pg_ctl start
$ psql -f $PGSHARE/contrib/pg_reorg.sql -d your_database

9.2以降ではCREATE EXTENSIONによる登録も可能です。

$ psql -c "CREATE EXTENSION pg_reorg" -d your_database

リグレッションテストを行うには、PostgreSQLサーバを動作させた上で、下記コマンドを実行します。

$ make installcheck

動作環境

PostgreSQLバージョン
PostgreSQL 9.0, 9.1, 9.2, 9.3, 9.4
OS
RHEL 6/7
ディスク容量
処理対象のテーブル、インデックスサイズの2倍以上のディスク空き容量 (対象が1GBならば、さらに追加で2GB)

更新履歴

関連項目

clusterdb, vacuumdb