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

ApsaraDB RDS:オンライン DDL (rds_online_ddl)

最終更新日:Nov 09, 2025

RDS for PostgreSQL では、一部のデータ定義言語 (DDL) 操作はバイナリ互換ではありません。たとえば、列の型を INT から BIGINT に変更する場合などです。ネイティブの ALTER COLUMN TYPE 操作はテーブル全体を再書き込みします。このプロセスは、テーブルを長時間ロックし、読み取りおよび書き込み操作を中断します。この問題を解決するために、RDS for PostgreSQL は rds_online_ddl 拡張機能を提供します。この拡張機能はオンラインでの列の型変更をサポートしており、業務継続性に影響を与えることなくテーブルスキーマを変更できます。

機能概要

PostgreSQL の多くの DDL 操作 (たとえば CREATE INDEX CONCURRENTLY) は、同時実行をサポートしています。しかし、バイナリ互換でない列の型を変更するには、依然としてロックを伴うテーブルの再書き込みが必要です。これは、データベースの運用およびメンテナンス (O&M) において一般的で影響の大きいシナリオです。

rds_online_ddl 拡張機能は、一時テーブルを作成し、オンラインでデータを同期することで、長期間のロックを回避します。プロセスは次のとおりです。

  1. 元のテーブルと同じスキーマを持つ一時テーブルを作成します。

  2. 指定した ALTER COLUMN TYPE 操作を一時テーブルで実行します。

  3. 元のテーブルから一時テーブルに既存データを効率的にインポートします。

  4. 元のテーブルのすべてのインデックスを一時テーブルに作成します。

  5. 論理デコーディングを使用して、前のステップで生成された増分データを一時テーブルに同期します。これにより、最終的なデータ整合性が保証されます。

  6. 元のテーブルの排他ロックを取得し、そのスキーマを変更します。

  7. 元のテーブルと一時テーブルの基になるファイル (インデックスを含む) を交換します。

  8. 一時テーブルを削除し、トランザクションをコミットしてオンライン DDL プロセスを完了します。

前提条件

ターゲットの RDS for PostgreSQL インスタンスは、次の要件を満たす必要があります。

注意事項

  • 検証とバックアップ: 本番環境でこの機能を使用する前に、テスト環境で十分にテストしてください。有効なバックアップがあることを確認してください。

  • ストレージ領域: この操作には追加のストレージ領域が必要です。必要な領域は、元のテーブルとそのインデックスの合計サイズの約 2 倍です。インスタンスに十分な空き領域があることを確認してください。

  • テーブルの制限:

    • この機能は、外部キー制約のあるテーブルをサポートしていません。

    • この機能は、パーティションテーブルではなく、通常のテーブルのみをサポートしています。

  • ALTER TABLEUSING 句は、論理レプリケーションの制限により完全にはサポートされていない場合があります。この句を使用する前にテストしてください。

  • 操作全体がアトミックです。操作が失敗または中断された場合、テーブルは元のスキーマにロールバックされます。このプロセスにより、データ破損が防止されます。

課金

この拡張機能は無料です。

拡張機能の作成と削除

重要

次のコマンドを実行するには、特権アカウントを使用します。

  • 拡張機能の作成

    CREATE EXTENSION rds_online_ddl;
    説明

    インストールされている拡張機能を表示するには、SELECT * FROM pg_extension; を実行します。

  • 拡張機能の削除

    DROP EXTENSION rds_online_ddl;

使用例

この例では、test テーブルの id 列を int4 から int8 に変更する方法を示します。

  1. 次のコマンドを実行して、test という名前のテストテーブルを作成し、テストデータを挿入します。

    CREATE TABLE test(id int4 PRIMARY KEY, info TEXT);
    
    INSERT INTO test SELECT x, repeat(x::text, 2) FROM generate_series(1, 1000000) AS x;
  2. rds_online_ddl.alter_table 関数を呼び出して、オンライン DDL 操作を実行します。この関数の最初のパラメーターはターゲットテーブル名です。2 番目のパラメーターは、標準の ALTER TABLE コマンドです。

    SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');
  3. (オプション) 進捗状況の確認。

    大きなテーブルの場合、操作に時間がかかることがあります。タスクの進捗状況をモニターするには、次のビューをクエリします。

    SELECT * FROM rds_online_ddl.pg_stat_progress_online_ddl;

    ビューの主要なフィールドは次のとおりです。

    • insert_initial: インポートされた既存データ行の数。

    • nindexes_built: ビルドされたインデックスの数。

    • nindexes_total: インデックスの総数。

    • insert_applied/update_applied/delete_applied: 対応する操作タイプに適用された増分データ変更の数。

    • insert_decoded/update_decoded/delete_decoded: 対応する操作タイプにデコードされた増分データ変更の数。