すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:pg_repack拡張を使用してテーブルスペースをクリアする

最終更新日:Jan 11, 2024

このトピックでは、pg_repack拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスのテーブルスペースをクリアする方法について説明します。 テーブル全体に対してUPDATEなどの多数の操作を実行すると、テーブルが膨らむことがあります。 この場合、この拡張機能を使用して、テーブルの膨張を軽減できます。 この拡張機能を使用してテーブルの肥大化の問題を処理する場合、この拡張機能は肥大化したテーブルの排他ロックを保持する必要はありません。 この拡張機能は、CLUSTERおよびVACUUM FULLステートメントよりも軽量です。

前提条件

  • RDSインスタンスのメジャーエンジンバージョンは、拡張機能でサポートされています。 詳細については、「ApsaraDB RDS For PostgreSQLでサポートされている拡張機能」をご参照ください。

  • RDSインスタンスのメジャーエンジンバージョンが要件を満たしているが、拡張機能がまだサポートされていない場合、RDSインスタンスのマイナーエンジンバージョンが更新されます。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。

注意事項

  • 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拡張機能は、フルテーブルのリパックとインデックスのリパックをサポートします。

  • 次の手順は、エクステンションがテーブル全体をリパックする方法を示しています。

    1. ログテーブルを作成します。 ログテーブルは、リパックプロセス中に元のテーブルに加えられた変更を記録するために使用されます。

    2. 元のテーブルにトリガーを作成します。 トリガーは、元のテーブルで実行されるINSERT、UPDATE、およびDELETEステートメントを記録し、リパックプロセス中にレコードをログテーブルに挿入するために使用されます。

    3. テーブルを作成します。 新しいテーブルには、元のテーブルと同じ行と列があります。

    4. 新しいテーブルにインデックスを作成します。

    5. ログテーブルのデータ変更を新しいテーブルに適用します。

    6. システムカタログの元のテーブルと新しいテーブルを切り替えます。

    7. 元のテーブルを削除します。

    説明

    pg_repack拡張は、ACCESS EXCLUSIVEロックを保持して、ステップa、b、f、およびgの元のテーブルに対する操作を禁止します。 他のステップでは、拡張はACCESS SHAREロックを保持します。 このロックは、元のテーブルに対するINSERT、UPDATE、およびDELETEステートメントの実行を禁止しません。

  • 次の手順は、拡張機能がテーブルのインデックスを再パックする方法を示しています。

    1. 同時にインデックスを作成します。

    2. システムカタログの元のインデックスと新しいインデックスを切り替えます。

    3. 元のインデックスを削除します。

pg_repack拡張機能の有効化または無効化

説明

このセクションのステートメントを実行するには、特権アカウントを使用する必要があります。

  • pg_repack拡張を有効にします。

    拡張の作成pg_repack;
  • pg_repack拡張機能を無効にします。

    ドロップ延長pg_repack;

pg_repack拡張機能のクライアントユーティリティをインストールする

pg_repack拡張機能のクライアントユーティリティをインストールする必要があります。 Elastic Compute Service (ECS) インスタンスがAlibaba Cloud Linux 3.2104以降を実行している場合は、次の手順を実行してクライアントユーティリティをインストールします。

  1. 環境依存関係をインストールします。

    sudo yum install postgresql * redhat-rpm-config libpq * openssl-devel readline-devel -y
  2. 環境変数を追加します。

    export PATH=$PATH:/usr/lib64/pgsql/postgresql-12/bin
  3. クライアントユーティリティをダウンロードし、クライアントユーティリティをコンパイルしてから、クライアントユーティリティをインストールします。

    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 

-- チェックしますが、リパック操作を実行しないでください: -- dry-run
pg_repack -- dry-run -- no-superuser-check -- echo -- no-order -hエンドポイント-p Port -d database1 -U user -- テーブルschema1.table1

repack操作を確認して実行します。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データベースのテーブルを再編成」をご参照ください。