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

ApsaraDB RDS:オンラインパーティショニング機能 (rds_online_migrate)

最終更新日:Dec 12, 2025

ApsaraDB RDS for PostgreSQL の拡張機能 rds_online_migrate は、オンラインパーティショニング機能を提供します。この機能を使用すると、標準テーブルをパーティションテーブルに変換できます。

背景情報

ビジネスの成長に伴い、データ量は増加します。特定のシナリオでは、標準テーブルをパーティションテーブルに変換する必要がある場合があります。しかし、ネイティブの PostgreSQL はオンラインでの変換機能を提供していません。運用保守 (O&M) を簡素化し、パーティショニングがビジネスに与える影響を軽減するために、ApsaraDB RDS for PostgreSQL はオンラインパーティショニング機能を提供します。

適用範囲

ご利用の ApsaraDB RDS for PostgreSQL インスタンスは、次の要件を満たす必要があります:

  • メジャーバージョン:13 以降。

  • マイナーエンジンバージョン:20251130 以降。

注意事項

オンラインパーティショニング操作を実行する前に、データセキュリティを確保し、操作を成功させるために、以下の情報をご確認ください。

  • 事前準備

    • バックアップとテスト:操作を実行する前に、有効な完全バックアップがあることを確認してください。また、非本番環境で十分なテストと検証を行うことを推奨します。

    • ストレージ容量の計画:オンラインパーティショニングのプロセス中に、システムはデータ移行のために新しいテーブルを作成します。そのため、少なくともソーステーブルとそのすべてのインデックスの合計サイズの 2 倍のストレージ容量を確保する必要があります。

    • データベースパラメーターの設定:この機能は論理デコーディングに依存します。wal_level パラメーターを logical に設定する必要があります。さらに、複数のパーティショニングタスクを並行して実行するには、max_worker_processes パラメーターの値を増やす必要がある場合があります。

  • テーブルスキーマと権限要件

    • プライマリキーまたは一意の ID:この機能は PostgreSQL のネイティブな論理レプリケーションを使用するため、ソーステーブルには PRIMARY KEY が設定されているか、REPLICA IDENTITY が設定されている必要があります。

    • ユーザー権限:操作を実行するユーザーアカウントには、publicationsubscription、および replication slot を作成する権限が必要です。また、アカウントにはソーステーブルと移行先テーブルに対して RENAME 操作を実行する権限も必要です。

    • 権限の一貫性:業務継続性を確保するために、移行前にビジネスアカウントがソーステーブルに対して持っているのと同じ権限を、移行先のパーティションテーブルにも付与してください。

  • 例外処理とリスク

    • 非アトミック操作:この機能はスクリプト化されたプロセスであり、原子性はありません。プロセスが例外によって中断された場合、内部オブジェクトが残存する可能性があります。

    • 手動クリーンアップ:例外が発生した場合、残存する rds_online_migrate.internal_map テーブルのレコード、publicationsubscription、および replication slot オブジェクトを手動でクリーンアップする必要がある場合があります。エラーログを参照し、以下のコマンドを使用してクリーンアップを実行してください:

      -- メタデータレコードのクリーンアップ
      DELETE FROM rds_online_migrate.internal_map WHERE src_relname = 'source_table' AND dst_relname = 'destination_table';
      
      -- 残存する publication の削除
      DROP PUBLICATION publication_name;
      
      -- 残存する subscription の削除
      DROP SUBSCRIPTION subscription_name;
      
      -- 残存するレプリケーションスロットの削除
      SELECT pg_drop_replication_slot('slot_name');
  • RENAME 操作の潜在的な影響

    • 関連オブジェクトの再構築RENAME 操作が完了した後、元のテーブルに依存するビュー、トリガー、および外部キー制約を手動で再構築する必要があります。

    • 論理レプリケーションへの影響:ソーステーブルが別の論理レプリケーションタスクの一部である場合、RENAME 操作によってそのレプリケーションタスクが中断される可能性があります。操作が完了した後、新しいテーブル (元の移行先テーブル) を対応する publication に再度追加してください。

  • 拡張シナリオ

    • この機能は、既存のパーティションテーブルのオンラインでの再パーティショニングもサポートしています。

使用例

以下の例では、public.test という名前の標準テーブルをオンラインでパーティションテーブルに変換する方法を示します。

1. データベースパラメーターの設定

rds_online_migrate 機能は論理デコーディングに依存します。ApsaraDB RDS コンソールで、wal_level パラメーターを logical に設定します。

2. ソーステーブルとデータの準備

変換のソーステーブルとして、public.test という名前の標準テーブルを作成します。次に、実際のビジネスシナリオをシミュレートするために、100 万行のテストデータを挿入します。

-- ソーステーブルの作成
CREATE TABLE public.test(id int4 PRIMARY KEY, info text);

-- テストデータの挿入
INSERT INTO public.test SELECT x, repeat(x::text, 2) FROM generate_series(1, 1000000) AS x;

3. 拡張機能のインストール

操作を実行するデータベースに rds_online_migrate 拡張機能を作成します。

CREATE EXTENSION rds_online_migrate;

4. 移行先のパーティションテーブルの作成

ソーステーブルと同じ構造を持つ public.test_p という名前の移行先のパーティションテーブルを作成します。この移行先テーブルは、ソーステーブルと同じスキーマ (名前空間) にある必要があります。この例では、ID をハッシュ化してパーティション分割し、4 つのサブパーティションを持つテーブルを作成します。

CREATE TABLE public.test_p (LIKE test INCLUDING ALL) PARTITION BY HASH(id);
CREATE TABLE public.test_p_0 PARTITION OF public.test_p FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE public.test_p_1 PARTITION OF public.test_p FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE public.test_p_2 PARTITION OF public.test_p FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE public.test_p_3 PARTITION OF public.test_p FOR VALUES WITH (MODULUS 4, REMAINDER 3);

5. オンライン変換の実行

rds_online_migrate.rewrite_table 関数を呼び出して、オンラインパーティショニングプロセスを開始します。関数の最初のパラメーターはソーステーブル名、2 番目は移行先のパーティションテーブル名です。関数は、実行が成功したことを示す t を返します。

SELECT rds_online_migrate.rewrite_table('public.test', 'public.test_p');
-- 期待される出力:
 rewrite_table
---------------
 t
(1 row)

6. 変換結果の検証

操作が成功すると、関数は自動的にテーブル名を切り替え、ビジネスのシームレスな移行を保証します:

  • 元のテーブル public.testpublic.test_rds_bkp に名前が変更されます。このテーブルは、後の検証のためのデータバックアップとして機能し、任意で削除できます。

  • 移行先のパーティションテーブル public.test_ppublic.test に名前が変更され、新しいテーブルとして使用されます。

次に、以下の手順で結果を検証します:

  • テーブルスキーマの確認 \d コマンドを使用してリレーションのリストを表示できます。テーブル名が期待どおりに切り替えられ、新しい test テーブルが partitioned table であることを確認します。

    testdb=> \d
    -- 期待される出力:
                       リレーションのリスト
     Schema |     Name     |       Type        |   Owner
    --------+--------------+-------------------+-----------
     public | test         | partitioned table | rds_super
     public | test_p_0     | table             | rds_super
     public | test_p_1     | table             | rds_super
     public | test_p_2     | table             | rds_super
     public | test_p_3     | table             | rds_super
     public | test_rds_bkp | table             | rds_super
    (6 rows)
  • データ整合性の検証 新しいテーブル、バックアップテーブル、および各パーティションの行数をクエリして、データ移行が完了し、データが正しく分散されていることを確認できます。

    1. バックアップテーブルの総行数をクエリします。カウントは移行前のカウントと同じである必要があります。

      SELECT count(*) FROM public.test_rds_bkp;
      -- 期待される出力:1000000
    2. 新しいパーティションテーブルの総行数をクエリします。カウントはバックアップテーブルのカウントと一致する必要があります。

      SELECT count(*) FROM public.test;
      -- 期待される出力:1000000
    3. 各パーティションの行数をクエリして、データがハッシュルールに従って子テーブルに分散されていることを確認します。

      SELECT count(*) FROM public.test_p_0;
      -- 期待される出力:249589
      SELECT count(*) FROM public.test_p_1;
      -- 期待される出力:250376
      SELECT count(*) FROM public.test_p_2;
      -- 期待される出力:249786
      SELECT count(*) FROM public.test_p_3;
      -- 期待される出力:250249