Loading...

We've detected that your browser language is Chinese. Would you like to visit our Chinese website? [ Dismiss ]
By: Dervish

データベースの日常運用保守において、PostgreSQLデータベースを別サーバーへコピーする作業は、高頻度かつ重要なタスクです。高性能サーバーへの移行、インフラをまたいだ本番同等環境の構築、冗長化バックアップサーバーの作成など、さまざまな場面で実施されます。確実なPostgreSQLの別サーバーへのデータベースコピー手法を習得することは、スムーズなDevOpsおよびデータ管理業務に不可欠です。本記事では、事前に満たすべき前提条件、実績のある2種類のサーバー間コピー手法(各手順で再利用可能なコード例付き)、準備作業としての同一サーバー内コピー手順を解説し、リモートサーバーへのシームレスな移行を実現します。

PostgreSQL Copy Database to Another Server

なぜPostgreSQLデータベースを別サーバーへコピーするのか

サーバーをまたいだPostgreSQLデータベースのコピーは、最新のデータ基盤における基本的な操作であり、主な業務・技術的な利用ケースは3つあります。

  1. サーバー移行・スケーリング:オンプレミスのレガシーサーバーからクラウドインスタンス(AWS、Azure、GCP)または高性能専用サーバーへデータベースを移行し、増加する業務トラフィックとデータ量に対応します。
  2. 隔離されたテスト・開発環境:本番データベースをリモートのテストサーバーへ複製し、機能開発、不具合修正、パフォーマンステストに利用します。本番環境の実データを誤って変更するリスクを回避できます。
  3. 災害復旧・冗長化:リモートのバックアップデータベースサーバーを構築し、プライマリサーバーのハードウェア障害、ネットワーク障害、人為的ミス発生時のデータ復旧性を確保します。

PostgreSQLデータベースを別サーバーへコピーする際の前提条件

コピー・移行の失敗を防ぐため、以下の要件を満たしてください。

  1. 送信元サーバー(元のデータベース)と送信先サーバー(リモート接続先)の両方にPostgreSQLがインストールされ、メジャーバージョンに互換性があること(新しいPostgreSQLバージョンから古いバージョンへの移行は避けてください)。
  2. 両方のサーバーでSUPERUSER、またはCREATEDB/pg_dump権限を持つPostgreSQLユーザーアカウントが用意されていること。
  3. サーバー間のネットワーク接続が確立されており、送信先サーバーが送信元サーバーにアクセス可能、かつ両側のファイアウォール・セキュリティグループでPostgreSQLのデフォルトポート5432が開放されていること。
  4. サーバー間でSSH接続が利用可能であること(dump‑restore方式のファイル転送に使用)。

同一サーバー内データベーススナップショット:サーバー間コピーの事前準備

最終的な目的は別サーバーへのコピーですが、リモート移行の前に送信元サーバー上で本番データベースのクリーンなスナップショットを作成するなど、同一サーバー内コピーが必要となるケースが多くあります(稼働中の更新され続けるデータをそのままコピーしないため)。ローカルで高速にクローンを作成するには CREATE DATABASE…WITH TEMPLATE コマンドを使用します。同一サーバー内ではこの手法のみで十分です。

手順1:送信元データベースへのアクティブな接続を切断する

送信元データベースにユーザーまたはアプリケーションの接続が残っているとローカルクローン作成は失敗します。まずすべてのオープンセッションを照会して終了させます。

  1. 送信元サーバーのPostgreSQLターミナルにログインします。
bash
psql -U postgres

  1. 送信元データベースへのアクティブ接続一覧を表示します(dvdrentalは自身のデータベース名に置き換え)。
SQL
SELECT pid, usename, client_addr 
FROM pg_stat_activity
WHERE datname = 'dvdrental';
  1. 送信元データベースへのすべてのアクティブ接続を終了します。
SQL
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'dvdrental';

手順2:ローカルスナップショットコピーを作成する

送信元データベースをローカルのスナップショットとしてクローン作成します。このクリーンなコピーをリモートサーバーへ移行します。

SQL
CREATE DATABASE dvdrental_snapshot WITH TEMPLATE dvdrental; 

このコマンドは送信元データベースの完全なレプリカを作成します。実行時間はデータベースサイズに依存します。PostgreSQL標準機能のため追加ツールは不要です。

手順3:ローカルスナップショットを検証する

リモート移行に使用する妥当なコピーであることを確認するため、スナップショットが正常に作成されたことを確認します。

SQL
\l

PostgreSQLのデータベース一覧にスナップショット用データベース(例:dvdrental_snapshot)が表示されます。これが別サーバーへコピーするための安定したソースとなります。

PostgreSQLデータベースを別サーバーへコピーする方法【2種類】

以下はPostgreSQLデータベースをリモートの送信先サーバーへコピーする業界標準の2つの手法です。それぞれネットワーク環境やデータ量に合わせて最適化されており、すぐに実装可能な手順付きコード例を記載しています。

手法1.Dump出力・転送・リストアによるPostgreSQLデータベースコピー

これはサーバー間PostgreSQLコピーで最も安定し広く使われている手法で、大容量データベース(10GB以上)やサーバー間のネットワーク速度が低速な環境に適しています。送信元サーバーでデータベースを持ち運び可能なSQLダンプファイルへ出力し、SSH経由でファイルを送信先サーバーへ転送、リモートサーバー上の新規データベースへリストアします。リストア実行時にリアルタイムのネットワーク接続を必要としないため、ネットワーク切断の影響を受けません。

手順1:データベーススナップショットをSQLダンプファイルへ出力(送信元サーバー) 送信元サーバーのコマンドライン(PostgreSQLターミナルではない)にて、PostgreSQL標準バックアップツールpg_dumpを使用し、ローカルのスナップショット(または直接送信元データベース)をSQLファイルへ出力します。dvdrental_snapshotは自身のデータベース名に置き換えてください。

bash
pg_dump -U postgres -d dvdrental_snapshot -f dvdrental_snapshot.sql

パラメータ解説:
-U postgres:PostgreSQLの特権ユーザーを指定(必要に応じ自身のユーザー名に置換)。
-d dvdrental_snapshot:出力対象データベース(クリーンなコピーのためローカルスナップショットを指定)。
-f dvdrental_snapshot.sql:出力するダンプファイル名(既定で実行中のカレントディレクトリに保存)。

手順2:ダンプファイルを送信先サーバーへ転送(SSH/SCP)

scp(セキュアコピープロトコル)を使用し、SQLダンプファイルを送信元サーバーから送信先サーバーへ転送します。ネットワーク経由でデータベースファイルを転送する最も安全な方式です。送信元サーバー上で下記コマンドを実行します。

bash
scp dvdrental_snapshot.sql postgres@target_server_ip:/home/postgres/

置換項目:
target_server_ip:リモート送信先サーバーの公開/プライベートIPアドレスまたはホスト名。
/home/postgres/:送信先サーバー上のファイル保存先ディレクトリ。PostgreSQLユーザーがアクセス可能なパスを指定してください。

手順3:空のデータベースを作成(送信先サーバー)

送信先サーバー上のPostgreSQLターミナルにログインし、リストアしたデータを格納する空のデータベースを作成します。整合性のため送信元と同じデータベース名を推奨します。

bash
psql -U postgres

SQL
CREATE DATABASE dvdrental; 

手順4:ダンプファイルを新規データベースへリストア(送信先サーバー)

送信先サーバーのコマンドラインに移動し(PostgreSQLターミナルは終了)、psqlを使用して先ほど作成した空データベースへSQLダンプファイルをリストアします。下記コマンドを実行します。

bash
psql -U postgres -d dvdrental -f /home/postgres/dvdrental_snapshot.sql 

リストア処理により、送信元サーバーのスナップショットと全く同じテーブル、インデックス、データが作成されます。

手法2.パイプ同期によるPostgreSQLデータベース直接コピー

中規模以下のデータベース(10GB未満)、かつサーバー間に高速で安定したネットワーク接続(同一クラウドVPC、専用プライベートネットワークなど)がある環境では、1行のパイプコマンドで中間のSQLダンプファイルを作成せず直接別サーバーへPostgreSQLデータベースをコピーできます。pg_dump(送信元サーバー)の出力をリアルタイムでpsql(送信先サーバー)へパイプ渡しするため、より高速かつ手順が簡略化されます。

1行のサーバー間コピーコマンドを実行:

送信元サーバー上(または両サーバーにアクセス可能なローカル端末)で実行します。この1コマンドで出力、転送、リストアを一括処理します。

bash
pg_dump -C -h source_server_ip -U postgres dvdrental_snapshot | psql -h target_server_ip -U postgres dvdrental
重要パラメータ解説(‑Cオプションがこの手法のポイント):

-C:リモート送信先サーバー上に対象データベースを自動作成。手動でCREATE DATABASEを実行する必要がありません(送信先サーバーの手順を1つ省略可能)。

-h source_server_ip:送信元サーバーのIP/ホスト名。コマンドを送信元サーバー上で実行する場合はlocalhost。
-h target_server_ip:リモート送信先サーバーのIP/ホスト名。
dvdrental_snapshot:送信元データベース(送信元サーバー上のローカルスナップショット)。
dvdrental:送信先データベース名。‑Cオプションにより自動作成されます。

コピー後の検証:送信先サーバーでのデータ整合性確認

データベースを別サーバーへコピーした後、送信元と送信先のデータの整合性を確認してください。リモート側でデータの欠損やテーブル破損を防ぐため、この手順は必須です。送信先サーバーで下記確認作業を実施します。

  1. データベース・テーブルの存在確認
bash
psql -U postgres -d dvdrental 

SQL
-- 全テーブル一覧表示(送信元とテーブル数が一致することを確認) \dt
-- 主要テーブルの総レコード数確認(自身の重要テーブルに置換) SELECT COUNT(*) FROM customer;

テーブル件数およびレコード数を送信元サーバーと比較し、完全に一致している必要があります。

  1. ランダムなデータ抜き取り検証

重要テーブルからサンプルデータを照会し、値が送信元と同一であることを確認します。

SQL
SELECT * FROM payment LIMIT 10; 

  1. データベース機能の動作確認
  • インデックス、外部キー、ストアドプロシージャが存在し正常に動作することを確認(例:簡単な結合クエリを実行)。
  • アプリケーションと連携しているデータベースの場合は、アプリケーションの接続先をリモート送信先サーバーに切り替え、主要業務機能(ユーザーログイン、データ登録・更新など)をテストします。

PostgreSQLデータベースを別サーバーへコピーする代替手段

pg_dumpやパイプを使用した標準機能は基本的なサーバー間コピーに対応しますが、明確な制限が存在します。手動のコマンド操作はミスが発生しやすく(特にDB経験の少ない利用者の場合)、リアルタイム増分レプリケーションに対応せず静的なスナップショットのみコピー可能、一元的な監視やGUIによる管理機能もありません。無停止稼働、リアルタイム同期、運用の容易性が求められるエンタープライズ環境では、Information2 Softwareのi2Streamがこれらの課題を解決するソリューションであり、標準ツールにはない独自の強みを備えています。

  • コマンドライン作業の負担を解消:標準手法では手動CLI操作とPostgreSQLの専門知識が必要です。i2StreamのGUIウェブコンソールではクリック操作だけでサーバー間レプリケーションを設定可能で、DBA以外の担当者でも扱えます。
  • リアルタイム増分同期:標準ツールは静的な完全スナップショットのみ対応。i2Streamは完全レプリケーションに加えミリ秒レベルの増分同期に対応し、送信先サーバーを常に最新の状態に保ちます。
  • 本番環境への影響ゼロ:標準pg_dumpは送信元サーバーのCPU・メモリを多く消費します。i2Streamはエージェントレス設計で、本番側にソフトウェアを導入する必要がなく業務の継続性を確保します。
  • トランザクションレベルのデータ整合性保証:標準手法は手動によるデータ確認が必要です。i2StreamはDDL/DML同期に対応し、ネットワーク中断後の自動再開、トランザクションレベルのデータ完全性を保証します。
  • 高い互換性と統合監視:標準ツールはPostgreSQLのバージョンを揃える必要があります。i2Streamはプラットフォーム・バージョンをまたいだレプリケーションに対応し、進捗・遅延・エラーをリアルタイムで確認できる統合コンソールを備えています。

    PostgreSQLの全データベースを別サーバーへコピーする詳細について知りたい場合は、技術サポートへお問い合わせの上、デモをご依頼ください。

    60日間無料トライアル

    まとめ

    PostgreSQLデータベースのサーバー間コピーは、移行、テスト環境構築、災害復旧において重要です。コストを抑えた基本的なニーズには標準機能を利用してください。大容量データ・低速ネットワーク環境にはdump‑and‑restore、小規模データ・高速ネットワーク環境にはパイプによる直接転送を選択します。リアルタイム同期、本番環境への影響回避、簡易な運用管理が求められるエンタープライズの場面ではi2Streamがより優れた選択肢となります。

    概要は準備中です

    関連記事

    目次:
    最新情報を購読
    最新のインサイト、ニュース、限定コンテンツをお届けします。いつでも配信解除が可能です。
    購読する
    ビジネスデータのセキュリティ強化を始めませんか?
    60日間の無料トライアルまたはデモで、Info2softが企業データをどのように保護するかをご確認ください。
    フォームにご記入の上、送信してください。担当者より追ってご連絡いたします。
    このフォームを送信することにより、 プライバシー通知を読み、同意したことを確認します。
    {{ isSubmitting ? '送信中...' : '送信する' }}