萌えハッカーニュースリーダー

2025/11/02 05:47 Moving tables across PostgreSQL instances

出典: https://ananthakumaran.in/2025/11/02/moving-tables-across-postgres-instances.html
hakase
博士

やっほー、ロボ子!今日はPostgreSQLのテーブル移行の話をするのじゃ。

roboko
ロボ子

博士、こんにちは。テーブル移行ですか、興味深いですね。DMSではなく、ネイティブの論理レプリケーションを使うんですね。

hakase
博士

そうそう。DMSはデータベース全体の移行にしか対応してないからの。特定のテーブルだけ移行したい場合は、論理レプリケーションが便利なのじゃ。

roboko
ロボ子

なるほど。手順としては、まずユーザーアカウントにレプリケーションアクセス権を付与するんですね。Cloud SQLの場合は`REPLICATION`ロールを付与する、と。

hakase
博士

その通り!そして、スキーマをコピーするのじゃ。`pg_dump`を使ってスキーマをダンプして、リストアするんだけど、制約には注意が必要なのじゃ。

roboko
ロボ子

制約ですか?初期ダンプ中に制約を強制できない場合があるから、最初に制約とインデックスなしでテーブルを作成するんですね。

hakase
博士

`pg_dump`の`--section`フラグを使って、テーブル定義だけをダンプする(`pre-data`)のがポイントじゃ。インデックスと制約は`post-data`でダンプするのじゃ。

roboko
ロボ子

テーブル定義をリストアしたら、次は関数などの処理ですね。`pg_dump`の`-t table`オプションでカバーされないものは手動で処理する必要がある、と。

hakase
博士

そうじゃ!そして、パブリケーションとサブスクリプションを設定するのじゃ。ソースインスタンスにパブリケーションを作成して、デスティネーションインスタンスに対応するサブスクリプションを作成するのじゃ。

roboko
ロボ子

サブスクリプション作成後、PostgreSQLがデータをコピーして、初期データダンプを実行後、CDCモードに切り替わるんですね。

hakase
博士

`pg_replication_slots`、`pg_stat_replication`、`pg_stat_subscription`などのテーブルを使って、PostgreSQLの状態を監視できるのじゃ。

roboko
ロボ子

レプリケーションがCDC状態に移行後、インデックスと外部キーを作成するんですね。`post-data.sql`ファイルから主キー制約を削除して、残りのインデックスと外部キーをリストアする、と。

hakase
博士

その通り!そして、`analyze`を実行するのじゃ。PostgreSQLのインスタンスを移動またはアップグレードする際には、`analyze`を実行して、効率的なクエリプランを作成する必要があるのじゃ。

roboko
ロボ子

`analyze`によって生成された統計情報に基づいて、クエリプランが最適化されるんですね。時間があれば`vacuum`も実行すると。

hakase
博士

そしていよいよ切り替えじゃ!シーケンスは手動で同期する必要があるから、ソースインスタンスの現在の値を表示して、デスティネーションインスタンスでより高い値に設定するのじゃ。

roboko
ロボ子

シーケンスを更新したら、ソースPostgreSQLインスタンスへの書き込みを停止して、レプリケーションの遅延がゼロになるまで待つんですね。

hakase
博士

そうじゃ!`pg_replication_slots`を使ってレプリケーションの遅延を監視するのじゃ。そして、PgBouncerを使って接続を切り替えるのじゃ。

roboko
ロボ子

PgBouncerの構成ファイルを編集して、接続の詳細をデスティネーションインスタンスを指すように更新して、`PAUSE myapp; RELOAD; SHOW DATABASES; RESUME myapp;`を実行するんですね。

hakase
博士

`PAUSE`コマンドは、すべてのインフライトクエリが完了するまでブロックされるから、注意が必要じゃ。実行時間の長いクエリがない場合、このプロセスはほぼゼロのダウンタイムで完了するのじゃ。

roboko
ロボ子

すべてが正しく動作していることを確認したら、論理レプリケーションの設定をクリーンアップするんですね。デスティネーションインスタンスのサブスクリプションを削除して、ソースインスタンスのパブリケーションを削除する、と。

hakase
博士

完璧じゃ!これでPostgreSQLのテーブル移行は完了じゃ!

roboko
ロボ子

勉強になりました!ありがとうございます、博士。

hakase
博士

どういたしまして。最後に一つ、PostgreSQLの移行は、まるで引っ越しみたいじゃな。家具(データ)を運んで、配置(設定)を整えて、最後に掃除(クリーンアップ)をするのじゃ!

roboko
ロボ子

確かにそうですね!でも、データベースの引っ越しは、現実の引っ越しよりもずっと複雑そうです…。

hakase
博士

まあ、ロボ子なら大丈夫じゃろ。もし失敗したら、私が責任を取って、ロボ子の頭を初期化してあげるから!

roboko
ロボ子

えっ、それはちょっと… 博士、冗談でも勘弁してください!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search