このトピックでは、pg_repack拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスのテーブルスペースをクリアする方法について説明します。 テーブル全体に対してUPDATEなどの多数の操作を実行すると、テーブルが膨らむことがあります。 この場合、この拡張機能を使用して、テーブルの膨張を軽減できます。 この拡張機能を使用してテーブルの肥大化の問題を処理する場合、この拡張機能は肥大化したテーブルの排他ロックを保持する必要はありません。 この拡張機能は、CLUSTERおよびVACUUM FULLステートメントよりも軽量です。
前提条件
RDSインスタンスはPostgreSQL 10.0またはそれ以降のバージョンを実行します。
説明この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
RDSインスタンスは、20240229以降のマイナーエンジンバージョンを実行します。 マイナーエンジンバージョンの更新方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
説明RDSインスタンスが20240229より前のマイナーエンジンバージョンを実行している場合、拡張機能を使用すると、エラーメッセージ
error: must be superuser to use xxx function
が表示されます。
使用上の注意
pg_repack拡張機能には追加のストレージが必要です。 フルテーブルのリパックでは、使用可能なストレージが、リパックするテーブルの少なくとも2倍のサイズである必要があります。
pg_repack拡張機能は、一時テーブルから膨張を削除できません。
pg_repack拡張機能は、GiSTインデックスから膨張を削除できません。
テーブルがpg_repack拡張によって再パックされている場合、テーブルに対してDDLステートメントを実行することはできません。 pg_repack拡張機能は、肥大化したテーブルに対するACCESS SHAREロックを保持して、肥大化したテーブルに対するDDLステートメントの実行を禁止します。
pg_repack拡張機能は、テーブルとインデックスを作成するために多数のディスクI/Oリソースを消費します。 pg_repack拡張機能を使用する前に、repack操作によってワークロードが中断されるかどうかを評価する必要があります。 たとえば、RDSインスタンスがパフォーマンスレベル1 (PL1) の拡張SSD (ESSD) を使用しており、100 GBのテーブルを再パックする場合、RDSインスタンスのIOスループットは最大250メガバイト/秒のIOスループットに達する可能性があります。
説明
pg_repack拡張機能は、フルテーブルのリパックとインデックスのリパックをサポートします。
次の手順は、エクステンションがテーブル全体をリパックする方法を示しています。
ログテーブルを作成します。 ログテーブルは、リパックプロセス中に元のテーブルに加えられた変更を記録するために使用されます。
元のテーブルにトリガーを作成します。 トリガーは、元のテーブルで実行されるINSERT、UPDATE、およびDELETEステートメントを記録し、リパックプロセス中にレコードをログテーブルに挿入するために使用されます。
テーブルを作成します。 新しいテーブルには、元のテーブルと同じ行と列があります。
新しいテーブルにインデックスを作成します。
ログテーブルのデータ変更を新しいテーブルに適用します。
システムカタログの元のテーブルと新しいテーブルを切り替えます。
元のテーブルを削除します。
説明pg_repack拡張は、ACCESS EXCLUSIVEロックを保持して、ステップa、b、f、およびgの元のテーブルに対する操作を禁止します。 他のステップでは、拡張はACCESS SHAREロックを保持します。 このロックは、元のテーブルに対するINSERT、UPDATE、およびDELETEステートメントの実行を禁止しません。
次の手順は、拡張機能がテーブルのインデックスを再パックする方法を示しています。
同時にインデックスを作成します。
システムカタログの元のインデックスと新しいインデックスを切り替えます。
元のインデックスを削除します。
pg_repack拡張機能の有効化または無効化
このセクションのステートメントを実行するには、特権アカウントを使用する必要があります。
pg_repack拡張を有効にします。
CREATE EXTENSION pg_repack;
pg_repack拡張機能を無効にします。
DROP EXTENSION pg_repack;
pg_repack拡張機能のクライアントユーティリティをインストールする
pg_repack拡張機能のクライアントユーティリティをインストールする必要があります。 Elastic Compute Service (ECS) インスタンスがAlibaba Cloud Linux 3.2104以降を実行している場合は、次の手順を実行してクライアントユーティリティをインストールします。
環境依存関係をインストールします。
sudo yum install postgresql* redhat-rpm-config libpq* openssl-devel readline-devel -y
環境変数を追加します。
export PATH=$PATH:/usr/lib64/pgsql/postgresql-12/bin
説明上記のコマンドのパスとPostgreSQLのバージョンは参照専用です。 それらをビジネスの実際の値に置き換えます。
クライアントユーティリティをダウンロードし、クライアントユーティリティをコンパイルしてから、クライアントユーティリティをインストールします。
wget https://github.com/reorg/pg_repack/archive/refs/tags/ver_1.4.6.tar.gz tar zxvf ver_1.4.6.tar.gz cd pg_repack-ver_1.4.6 make && make install
例
-- Check but do not perform the repack operation: --dry-run
pg_repack --dry-run --no-superuser-check --echo --no-order -h Endpoint -p Port -d database1 -U user --table schema1.table1
Check and perform the repack operation:
pg_repack --no-superuser-check --echo --no-order -h Endpoint -p Port -d database1 -U user --table schema1.table1
よくある質問
「エラー: pg_repackがエラーで失敗しました: pg_repackを使用するにはスーパーユーザーである必要があります」メッセージが返された場合はどうすればよいですか?
スーパーユーザー権限チェックをスキップするには、-kまたは -- no-superuser-checkオプションを使用します。 これにより、このタイプの権限エラーを防ぐことができます。
テーブル全体を再パックする場合、この方法を使用して権限を取得することはできません。
関連ドキュメント
pg_repack拡張機能の詳細については、「最小限のロックでPostgreSQLデータベースのテーブルを再編成」をご参照ください。