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 拡張機能は、一時テーブルを作成し、オンラインでデータを同期することで、長期間のロックを回避します。プロセスは次のとおりです。
元のテーブルと同じスキーマを持つ一時テーブルを作成します。
指定した
ALTER COLUMN TYPE操作を一時テーブルで実行します。元のテーブルから一時テーブルに既存データを効率的にインポートします。
元のテーブルのすべてのインデックスを一時テーブルに作成します。
論理デコーディングを使用して、前のステップで生成された増分データを一時テーブルに同期します。これにより、最終的なデータ整合性が保証されます。
元のテーブルの排他ロックを取得し、そのスキーマを変更します。
元のテーブルと一時テーブルの基になるファイル (インデックスを含む) を交換します。
一時テーブルを削除し、トランザクションをコミットしてオンライン DDL プロセスを完了します。
前提条件
ターゲットの RDS for PostgreSQL インスタンスは、次の要件を満たす必要があります。
メジャーエンジンバージョン: PostgreSQL 12 以降。
マイナーエンジンバージョン: 20250830 以降。
インスタンスパラメーター: wal_level パラメーターが logical に設定されていること。
テーブルスキーマ: 元のテーブルにプライマリキー (PRIMARY KEY) または一意制約 (UNIQUE constraint) があること。
注意事項
検証とバックアップ: 本番環境でこの機能を使用する前に、テスト環境で十分にテストしてください。有効なバックアップがあることを確認してください。
ストレージ領域: この操作には追加のストレージ領域が必要です。必要な領域は、元のテーブルとそのインデックスの合計サイズの約 2 倍です。インスタンスに十分な空き領域があることを確認してください。
テーブルの制限:
この機能は、外部キー制約のあるテーブルをサポートしていません。
この機能は、パーティションテーブルではなく、通常のテーブルのみをサポートしています。
ALTER TABLEのUSING句は、論理レプリケーションの制限により完全にはサポートされていない場合があります。この句を使用する前にテストしてください。操作全体がアトミックです。操作が失敗または中断された場合、テーブルは元のスキーマにロールバックされます。このプロセスにより、データ破損が防止されます。
課金
この拡張機能は無料です。
拡張機能の作成と削除
次のコマンドを実行するには、特権アカウントを使用します。
拡張機能の作成
CREATE EXTENSION rds_online_ddl;説明インストールされている拡張機能を表示するには、
SELECT * FROM pg_extension;を実行します。拡張機能の削除
DROP EXTENSION rds_online_ddl;
使用例
この例では、test テーブルの id 列を int4 から int8 に変更する方法を示します。
次のコマンドを実行して、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;rds_online_ddl.alter_table 関数を呼び出して、オンライン DDL 操作を実行します。この関数の最初のパラメーターはターゲットテーブル名です。2 番目のパラメーターは、標準の
ALTER TABLEコマンドです。SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');(オプション) 進捗状況の確認。
大きなテーブルの場合、操作に時間がかかることがあります。タスクの進捗状況をモニターするには、次のビューをクエリします。
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: 対応する操作タイプにデコードされた増分データ変更の数。