Info2softは、ウェブサイトでより快適で適切な閲覧体験を提供するためにCookieを使用しています。 プライバシーポリシー
Loading...
PostgreSQLデータベースのコピーまたは複製は、PostgreSQLを扱うデータベース管理者、開発者、DevOpsエンジニアにとって日常的に実施する重要な作業です。
PostgreSQLデータベースのコピー・複製はDBA、開発者、DevOpsチームのコア業務です。テスト/ステージング環境の作成、重要なPostgreSQLデータのバックアップ、新サーバーへの移行、安全な開発作業のための本番データベースのクローン作成などに不可欠です。
本ガイドでは、同一サーバー上での複製と異なるサーバー間でのコピーを含むPostgreSQLデータベースコピーの主要なワークフローを解説します。また、データベース全体の複製とPostgreSQLのテーブルレベルのCOPY コマンドの混同されやすい点を明確にします。
PostgreSQLにおけるデータベースコピーとデータベース複製は同じ目的を指します:元データベース(スキーマ、テーブル、データ、オブジェクト)の完全なレプリカを新しいコピー先に作成することです。PostgreSQLにはこの作業のためのネイティブツールが用意されており、同一サーバーではCREATE DATABASE WITH TEMPLATE文、サーバー間コピーではpg_dump/psqlコマンドラインツールを使用します。
同一サーバー上でPostgreSQLデータベースを複製する方法は、PostgreSQLネイティブのテンプレート付きCREATE DATABASE文を使用する最速かつ最も簡単な複製手法です。この手法は基本的なSQLコマンドを数行実行するだけで完了します。
前提条件:
CREATE DATABASE文のWITH TEMPLATE句を使用し、元データベースの完全なレプリカを作成します。このコマンドは元のスキーマ、テーブル、データ、関連するすべてのデータベースオブジェクトを一括でクローンします。
基本構文:
CREATE DATABASE targetdb
WITH TEMPLATE sourcedb;
実行例:
サンプルのdvdrentalデータベースをテスト用レプリカdvdrental_testへコピーする場合:
CREATE DATABASE dvdrental_test
WITH TEMPLATE dvdrental;
コピーにかかる時間は元データベースのサイズに依存します。小規模データベースは瞬時に完了し、大規模なものは数分を要します。
psqlの簡単なコマンドを2つ実行しレプリカが正常に作成されたことを確認します(PostgreSQLクライアント上で実行):
1. コピー先データベースへ接続:
\c targetdb;
2. テーブル一覧を表示し、スキーマが元と一致することを確認:
\dt;
サンプルテーブルに対し簡単なSELECTクエリを実行し、データが正しくコピーされているか確認することもできます。これでコピー先データベースは元データベースの完全に動作可能なレプリカとなります。
異なるサーバー間でPostgreSQLデータベースを複製する作業は、移行、クラウドデプロイ、オンプレミス環境とリモート環境のデータ同期において重要です。この作業には、元データベースをエクスポートするpg_dump、コピー先でリストアを実行するpsqlというPostgreSQLネイティブの信頼できるツールを使用します。
ここでは大規模データベース/低速ネットワーク向けの手法と、小規模データベース/高速接続向けの手法の2種類を解説します。
前提条件:
この手法は最初にローカルにSQLダンプファイルを作成し、その後ファイルを転送してリストアを実行します。大容量データセットにおけるタイムアウトを回避できます。
構文:
pg_dump -U postgres -d sourcedb -f sourcedb.sql
実行例(dvdrentalデータベースのダンプ):
pg_dump -U postgres -d dvdrental -f dvdrental.sql
Linux/macOSではSCP(Secure Copy)を使用(プレースホルダーを自身のサーバー情報に置き換え):
scp sourcedb.sql postgres@target_server_ip:/home/postgres/
コピー先サーバーのPostgreSQLインスタンスに接続し以下を実行:
CREATE DATABASE targetdb;
実行例:
CREATE DATABASE dvdrental_remote;
コピー先サーバー上で実行:
psql -U postgres -d targetdb -f sourcedb.sql
実行例:
psql -U postgres -d dvdrental_remote -f dvdrental.sql
この1行コマンドはローカルのダンプファイルを作成せず、ダンプ出力を直接コピー先サーバーへパイプで送信します。ネットワークが安定している小規模データベースでは高速です。
基本構文:
pg_dump -C -h source_server_ip -U postgres sourcedb | psql -h target_server_ip -U postgres targetdb
実行例(ローカルホストからリモートサーバーへdvdrentalをコピー):
pg_dump -C -h 192.168.1.100 -U postgres dvdrental | psql -h 192.168.1.200 -U postgres dvdrental_remote
コピー先サーバー上でレプリカが正常完了したことを確認します:
1. コピー先データベースへ接続: \c targetdb;
\c targetdb;
2. テーブル一覧を表示しスキーマが元と一致するか確認:
\dt;
3. サンプルクエリでデータの完全性を検証:
SELECT COUNT(*) FROM customer;
実行結果を元データベースと比較し、完全に一致することを確認してください。
PostgreSQL初心者がよく犯すミスは、組み込みのCOPYコマンドとデータベース全体の複製を混同することです。これらは全く異なる用途のツールであり、この違いを理解することは時間の浪費やコピー失敗を防ぐ鍵となります。
PostgreSQL COPYコマンドの実際の機能:
PostgreSQL標準のCOPYコマンドは単一のテーブルとファイル(または標準入出力)の間でデータを移動するだけです。データベース全体のスキーマ、リレーション、インデックス、ストアドプロシージャはコピーせず、1つのテーブルの行データのみを扱います。
COPYコマンドの基本例
単一テーブルのデータをファイルへエクスポート:
— customerテーブルのデータをCSVファイルへコピー
COPY customer TO '/tmp/customer_data.csv' (FORMAT csv, HEADER);
ファイルからテーブルへデータをインポート:
— CSVデータをcustomerテーブルへインポート
COPY customer FROM '/tmp/customer_data.csv' (FORMAT csv, HEADER);
COPYの利用シーン:レポート用に単一テーブルをエクスポート、1つのテーブルへ大量データをインポート、テーブル単位のデータ移行などであり、データベース全体の複製には使用しません。
データベース全体コピー:
対して本ガイドのテーマであるデータベース全体コピーは、全テーブル、スキーマ、インデックス、オブジェクトを含むPostgreSQLデータベース全体をレプリケートします。使用するツールは以下です:
これらのツールは個別のテーブルデータだけでなく、データベース構造全体を処理します。
CLIによる手動のPostgreSQLコピー・移行は単純な作業には対応できますが、本番データベースでは処理が遅く、人為的エラーが発生しやすくリスクを伴います。i2StreamはPostgreSQLデータベース移行およびデータベースコピーのワークフローを効率化するプロフェッショナルなレプリケーション・移行ツールです。
同一サーバー、サーバー間両方のPostgreSQLデータベースコピーシナリオに対応し、エンタープライズグレードの安定性とほぼゼロダウンタイムを実現します。
PostgreSQLユーザー向け主なメリット:
i2Streamは複雑な手動によるデータベースコピーをシンプルで信頼性の高いワークフローに変えます。大規模にPostgreSQLデータベースの複製作業を扱うDBA、DevOps、開発チームに最適なソリューションです。
下記のボタンをクリックして無料トライアルを取得できます。
正しいコマンドを使用してもPostgreSQLデータベースコピー時にエラーが発生する場合があります。代表的な問題と簡単な解決策を以下に記載します。
同一サーバーでCREATE DATABASE WITH TEMPLATEを使用する際に最も多く発生するエラーです。
アクティブな接続を確認し、終了させることで解決します。
手順1:元データベースへのアクティブな接続を一覧表示
構文:
SELECT pid, usename, client_addr
FROM pg_stat_activity
WHERE datname = 'sourcedb';
手順2:アクティブな接続を終了
構文:
SELECT pg_terminate_backend (pid)
FROM pg_stat_activity
WHERE datname = 'sourcedb';
元のCREATE DATABASE WITH TEMPLATEコマンドを再実行すると、正常に実行されます。
pg_dump、psql実行時、またはデータベース作成時にこのエラーが表示されることがあります。
原因:実行ユーザーにスーパーユーザー権限またはデータベース所有者権限がない。
解決策:スーパーユーザー(例:postgres)でコマンドを実行するか、適切な権限を付与してください。
原因:コピー先データベースが存在しない、または既にデータが格納されている。
解決策:
原因:不安定なネットワーク、またはデータベースサイズが大きい。
解決策:
原因:不完全なダンプ、転送の中断、またはコピー実行中の書き込み処理。
解決策:
ベストプラクティスに従うことで、PostgreSQLデータベースコピーおよび複製作業を高速、安全、エラーなく実行できます。
1. コピー実行前に必ずバックアップを取得
元データベースのバックアップを取得せずにコピー作業を実行しないでください。コピー処理が失敗した場合のデータ損失を防ぐため、PostgreSQLバックアップを作成してください。
2. 元データベースの負荷を最小限に抑える
3. 権限を適切に処理する
pg_dumpに-Oフラグを使用し所有者情報を省略します(コピー先での権限エラーを防止)。
pg_dump -U postgres -O -d sourcedb -f sourcedb.sql
コピー作業を実行するユーザーには必要最小限の権限のみ付与し、スーパーユーザー権限を過剰に使用しないでください。
4. 大規模データベース向けの最適化
ダンプファイルを圧縮しストレージを節約し転送を高速化:
pg_dump -U postgres -d sourcedb | gzip > sourcedb.sql.gz
大規模データベースにはi2Streamを使用してください。高速同期によりタイムアウトを回避し、ダウンタイムを削減します。
5. コピー完了後速やかにデータベースを検証
コピー完了後は必ずレプリカを検証します:
1. テーブルのレコード件数を確認(元とコピー先で一致させる)。
2. サンプルのSELECTクエリを実行しデータの完全性を確認。
3. インデックス、制約、ストアドプロシージャが期待通り動作することを確認。
6. 繰り返し作業の自動化
同一サーバーまたはサーバー間で頻繁にPostgreSQLデータベースコピーを実行する場合:
7. 一時ファイルのクリーンアップ
サーバー間コピー完了後、バックアップ用途で保持する場合を除き、元とコピー先サーバー両方からダンプファイルを削除しストレージを解放してください。
これらのプラクティスはエラーを削減しデータを保護し、大規模環境においてPostgreSQLデータベース複製のワークフローを信頼できるものにします。
PostgreSQLデータベースのコピーまたは複製は複雑である必要はありません。同一サーバーへのコピーでもサーバー間移行でも、単純な作業であればPostgreSQLネイティブツールであるCREATE DATABASE WITH TEMPLATE、pg_dump、psqlで対応可能です。
本番環境、大規模データベース、頻繁な複製作業では、手動CLIによる手法では限界があります。i2Streamはプロセス全体を自動化し、ほぼゼロダウンタイム、高速同期、組み込みの検証機能を提供します。
Q1:使用中のPostgreSQLデータベースをコピーできますか?
推奨されません。コピー実行中に元データベースへアクティブな書き込みが行われると、データ破損またはデータ欠損を引き起こす可能性があります。同一サーバーコピーの場合は事前にアクティブな接続を終了してください(6.1項参照)。本番データベースの場合はi2Streamのほぼゼロダウンタイム移行を使用して、業務への影響を回避してください。
Q2:すべてのユーザーと権限を含めてPostgreSQLデータベースをコピーするにはどうすればよいですか?
pg_dumpの代わりにpg_dumpallを使用してください。このツールは全データベース、ロール、権限をエクスポートします。単一データベースのユーザーについてはpg_dumpに-xフラグを追加し権限を含めるか、i2Streamですべてのユーザー権限を自動的にレプリケートできます。
Q3:PostgreSQL COPYコマンドはデータベース全体のコピーに使用できますか?
いいえ。COPYコマンドは単一テーブルのデータのみを扱い(テーブルとファイル間のエクスポート/インポート)、スキーマ、インデックス、データベース全体はコピーできません。PostgreSQLのデータベース全体コピー作業にはCREATE DATABASE WITH TEMPLATEまたはpg_dump/psqlを使用してください。
Q4:サーバー間移行においてi2Streamは手動のpg_dump/psqlより優れていますか?
大半のエンタープライズの利用ケースでははい。i2Streamはプロセス全体を自動化(手動コマンド不要)し、増分同期に対応(大規模データベースで高速)、ほぼゼロダウンタイムを確保し、組み込みのデータ検証機能を備えています。これらは手動手法にはない特徴です。小規模で単純な移行であれば手動コマンドで対応可能です。
Q5:Windows上でPostgreSQLデータベースをコピーするにはどうすればよいですか?
Linux/macOSと同じCLIコマンドを使用します。PowerShellまたはコマンドプロンプトを開き、PostgreSQLのbinディレクトリ(例:C:\Program Files\PostgreSQL\15\bin)に移動した上でpg_dumpおよびpsqlコマンドを実行してください。
Q6:コピーしたデータベースでテーブルまたはデータが欠損するのはなぜですか?
一般的な原因は、ダンプ/転送の中断、コピー実行中の書き込み処理、不完全なダンプコマンドです。解決策:ダンプファイルを再作成し、転送が完了したことを確認し、コピー実行中は元データベースへの書き込みを避け、コピー完了後速やかに検証を実施してください。