Info2softは、ウェブサイトでより快適で適切な閲覧体験を提供するためにCookieを使用しています。 プライバシーポリシー
Loading...
データベースの日常運用保守において、PostgreSQLデータベースを別サーバーへコピーする作業は、高頻度かつ重要なタスクです。高性能サーバーへの移行、インフラをまたいだ本番同等環境の構築、冗長化バックアップサーバーの作成など、さまざまな場面で実施されます。確実なPostgreSQLの別サーバーへのデータベースコピー手法を習得することは、スムーズなDevOpsおよびデータ管理業務に不可欠です。本記事では、事前に満たすべき前提条件、実績のある2種類のサーバー間コピー手法(各手順で再利用可能なコード例付き)、準備作業としての同一サーバー内コピー手順を解説し、リモートサーバーへのシームレスな移行を実現します。
サーバーをまたいだPostgreSQLデータベースのコピーは、最新のデータ基盤における基本的な操作であり、主な業務・技術的な利用ケースは3つあります。
コピー・移行の失敗を防ぐため、以下の要件を満たしてください。
最終的な目的は別サーバーへのコピーですが、リモート移行の前に送信元サーバー上で本番データベースのクリーンなスナップショットを作成するなど、同一サーバー内コピーが必要となるケースが多くあります(稼働中の更新され続けるデータをそのままコピーしないため)。ローカルで高速にクローンを作成するには CREATE DATABASE…WITH TEMPLATE コマンドを使用します。同一サーバー内ではこの手法のみで十分です。
手順1:送信元データベースへのアクティブな接続を切断する
送信元データベースにユーザーまたはアプリケーションの接続が残っているとローカルクローン作成は失敗します。まずすべてのオープンセッションを照会して終了させます。
psql -U postgres
SELECT pid, usename, client_addr
FROM pg_stat_activity
WHERE datname = 'dvdrental';
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'dvdrental';
手順2:ローカルスナップショットコピーを作成する
送信元データベースをローカルのスナップショットとしてクローン作成します。このクリーンなコピーをリモートサーバーへ移行します。
CREATE DATABASE dvdrental_snapshot WITH TEMPLATE dvdrental;
このコマンドは送信元データベースの完全なレプリカを作成します。実行時間はデータベースサイズに依存します。PostgreSQL標準機能のため追加ツールは不要です。
手順3:ローカルスナップショットを検証する
リモート移行に使用する妥当なコピーであることを確認するため、スナップショットが正常に作成されたことを確認します。
\l
PostgreSQLのデータベース一覧にスナップショット用データベース(例:dvdrental_snapshot)が表示されます。これが別サーバーへコピーするための安定したソースとなります。
以下はPostgreSQLデータベースをリモートの送信先サーバーへコピーする業界標準の2つの手法です。それぞれネットワーク環境やデータ量に合わせて最適化されており、すぐに実装可能な手順付きコード例を記載しています。
これはサーバー間PostgreSQLコピーで最も安定し広く使われている手法で、大容量データベース(10GB以上)やサーバー間のネットワーク速度が低速な環境に適しています。送信元サーバーでデータベースを持ち運び可能なSQLダンプファイルへ出力し、SSH経由でファイルを送信先サーバーへ転送、リモートサーバー上の新規データベースへリストアします。リストア実行時にリアルタイムのネットワーク接続を必要としないため、ネットワーク切断の影響を受けません。
手順1:データベーススナップショットをSQLダンプファイルへ出力(送信元サーバー) 送信元サーバーのコマンドライン(PostgreSQLターミナルではない)にて、PostgreSQL標準バックアップツールpg_dumpを使用し、ローカルのスナップショット(または直接送信元データベース)をSQLファイルへ出力します。dvdrental_snapshotは自身のデータベース名に置き換えてください。
pg_dump -U postgres -d dvdrental_snapshot -f dvdrental_snapshot.sql
手順2:ダンプファイルを送信先サーバーへ転送(SSH/SCP)
scp(セキュアコピープロトコル)を使用し、SQLダンプファイルを送信元サーバーから送信先サーバーへ転送します。ネットワーク経由でデータベースファイルを転送する最も安全な方式です。送信元サーバー上で下記コマンドを実行します。
scp dvdrental_snapshot.sql postgres@target_server_ip:/home/postgres/
手順3:空のデータベースを作成(送信先サーバー)
送信先サーバー上のPostgreSQLターミナルにログインし、リストアしたデータを格納する空のデータベースを作成します。整合性のため送信元と同じデータベース名を推奨します。
psql -U postgres
CREATE DATABASE dvdrental;
手順4:ダンプファイルを新規データベースへリストア(送信先サーバー)
送信先サーバーのコマンドラインに移動し(PostgreSQLターミナルは終了)、psqlを使用して先ほど作成した空データベースへSQLダンプファイルをリストアします。下記コマンドを実行します。
psql -U postgres -d dvdrental -f /home/postgres/dvdrental_snapshot.sql
リストア処理により、送信元サーバーのスナップショットと全く同じテーブル、インデックス、データが作成されます。
中規模以下のデータベース(10GB未満)、かつサーバー間に高速で安定したネットワーク接続(同一クラウドVPC、専用プライベートネットワークなど)がある環境では、1行のパイプコマンドで中間のSQLダンプファイルを作成せず直接別サーバーへPostgreSQLデータベースをコピーできます。pg_dump(送信元サーバー)の出力をリアルタイムでpsql(送信先サーバー)へパイプ渡しするため、より高速かつ手順が簡略化されます。
1行のサーバー間コピーコマンドを実行:
送信元サーバー上(または両サーバーにアクセス可能なローカル端末)で実行します。この1コマンドで出力、転送、リストアを一括処理します。
pg_dump -C -h source_server_ip -U postgres dvdrental_snapshot | psql -h target_server_ip -U postgres dvdrental
-C:リモート送信先サーバー上に対象データベースを自動作成。手動でCREATE DATABASEを実行する必要がありません(送信先サーバーの手順を1つ省略可能)。
コピー後の検証:送信先サーバーでのデータ整合性確認
データベースを別サーバーへコピーした後、送信元と送信先のデータの整合性を確認してください。リモート側でデータの欠損やテーブル破損を防ぐため、この手順は必須です。送信先サーバーで下記確認作業を実施します。
psql -U postgres -d dvdrental
-- 全テーブル一覧表示(送信元とテーブル数が一致することを確認) \dt
-- 主要テーブルの総レコード数確認(自身の重要テーブルに置換) SELECT COUNT(*) FROM customer;
テーブル件数およびレコード数を送信元サーバーと比較し、完全に一致している必要があります。
重要テーブルからサンプルデータを照会し、値が送信元と同一であることを確認します。
SELECT * FROM payment LIMIT 10;
pg_dumpやパイプを使用した標準機能は基本的なサーバー間コピーに対応しますが、明確な制限が存在します。手動のコマンド操作はミスが発生しやすく(特にDB経験の少ない利用者の場合)、リアルタイム増分レプリケーションに対応せず静的なスナップショットのみコピー可能、一元的な監視やGUIによる管理機能もありません。無停止稼働、リアルタイム同期、運用の容易性が求められるエンタープライズ環境では、Information2 Softwareのi2Streamがこれらの課題を解決するソリューションであり、標準ツールにはない独自の強みを備えています。
PostgreSQLの全データベースを別サーバーへコピーする詳細について知りたい場合は、技術サポートへお問い合わせの上、デモをご依頼ください。
PostgreSQLデータベースのサーバー間コピーは、移行、テスト環境構築、災害復旧において重要です。コストを抑えた基本的なニーズには標準機能を利用してください。大容量データ・低速ネットワーク環境にはdump‑and‑restore、小規模データ・高速ネットワーク環境にはパイプによる直接転送を選択します。リアルタイム同期、本番環境への影響回避、簡易な運用管理が求められるエンタープライズの場面ではi2Streamがより優れた選択肢となります。