pg_reorg 1.1.13
名前
pg_reorg -- PostgreSQLデータベース内のテーブルに対して、参照/更新処理をブロックせずに再編成を行います。
概要
pg_reorg [OPTIONS]
オプション OPTIONS には以下を指定できます。
詳細はオプションを参照してください。
- 固有オプション
- -a, --all : 全てのデータベースに対して実行します
- -o [--order-by] columns [,...]
- -n [--no-order]
- -t [--table] table
- -T [--wait-timeout] seconds
- -Z [--no-analyze]
- 接続オプション
- -d, --dbname=DBNAME : 接続するデータベース
- -h, --host=HOSTNAME : データベースサーバホスト、またはソケットディレクトリ
- -p, --port=PORT : データベースサーバのポート
- -U, --username=USERNAME : このユーザとして接続します
- -w, --no-password : パスワードの入力を促しません
- -W, --password : パスワード入力を強制します
- 一般オプション
- -e, --echo : サーバに送信するSQLを表示します
- -E, --elevel=LEVEL : ログ出力レベルを設定します
- --help : ヘルプを表示し、終了します
- --version : バージョン情報を出力し、終了します
説明
pg_reorg は、PostgreSQLデータベース内のテーブルを再編成(行の並び替え)するユーティリティです。
clusterdb と異なり、参照/更新処理をブロックしません。
再編成の方式として、以下のいずれか1つを選択できます。
- オンライン CLUSTER (cluster index順に行を並び替える)
- ユーザの指定した順に行を並び替える
- オンライン VACUUM FULL (行の詰め合わせを行う)
このユーティリティを使用するためには、以下のことに注意をしてください。
- このユーティリティは、スーパーユーザのみが実行することができます。
- 対象のテーブルはPRIMARY KEYを持っている必要があります。
例
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)
更新履歴
- 1.1.13 (2015-04-17)
- pg_statsinfo 3.0.2を動作させているPostgreSQL 9.4環境において、pg_reorg 1.1.11以降を実施するとPostgreSQLプロセスがクラッシュする不具合がありました。
- 1.1.12 (2015-03-16)
- PostgreSQL 8.2, 8.3, 8.4のサポートを打ち切りました。
- --allオプションを指定した際に、pg_reorgがインストールされていないデータベースをスキップする機能が動作しない不具合がありました。
- PostgreSQL 9.4におけるTOASTされたテーブルのインデックスの扱いが安全ではありませんでした。これにより指定したインデックスを用いた再編成が実現できない可能性がありました。
- 1.1.11 (2015-01-07)
- PostgreSQL 9.4のサポート
- 再編成完了直前に対象テーブルの存在するデータベース以外におけるトランザクション終了を待たないようにしました。
- DESC, NULLS FIRST/LAST, COLLATEを用いたインデックスを再編成に使用できるようにしました。(pg_repack issue#3)
- 1.1.10 (2014-05-09)
- バグ修正:オンラインリクエストが高負荷な状態でpg_reorgを実行した際に、再編中に実施されたオンラインからの更新レコードの一部が再編成後のテーブルに反映されないことが非常にまれに起きる可能性がありました。
- 実行時の出力メッセージを見直し、対象テーブルや実行している処理についてINFOで出力するようにしました。
- 1.1.9 (2013-11-21)
- 1.1.8 (2012-12-07)
- PostgreSQL 9.2のサポート
- CREATE EXTENSIONでのインストールをサポート
- 1.1.7 (2011-08-07)
- バグ修正: DROPされた列を持つテーブルを再編成した場合に、そのテーブルを使用するビューや関数が破損する可能性がありました。
- PostgreSQL 9.1, 9.2dev のサポート (EXTENSION はまだ)
関連項目
clusterdb,
vacuumdb