Loading...

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

PostgreSQLデータベースのコピーまたは複製は、PostgreSQLを扱うデータベース管理者、開発者、DevOpsエンジニアにとって日常的に実施する重要な作業です。

PostgreSQLデータベースのコピー・複製はDBA、開発者、DevOpsチームのコア業務です。テスト/ステージング環境の作成、重要なPostgreSQLデータのバックアップ、新サーバーへの移行、安全な開発作業のための本番データベースのクローン作成などに不可欠です。

本ガイドでは、同一サーバー上での複製と異なるサーバー間でのコピーを含むPostgreSQLデータベースコピーの主要なワークフローを解説します。また、データベース全体の複製とPostgreSQLのテーブルレベルのCOPY コマンドの混同されやすい点を明確にします。

PostgreSQLにおけるデータベースコピーとデータベース複製は同じ目的を指します:元データベース(スキーマ、テーブル、データ、オブジェクト)の完全なレプリカを新しいコピー先に作成することです。PostgreSQLにはこの作業のためのネイティブツールが用意されており、同一サーバーではCREATE DATABASE WITH TEMPLATE文、サーバー間コピーではpg_dump/psqlコマンドラインツールを使用します。

Copy PostgreSQL database

同一サーバー上でPostgreSQLデータベースをコピーする方法

同一サーバー上でPostgreSQLデータベースを複製する方法は、PostgreSQLネイティブのテンプレート付きCREATE DATABASE文を使用する最速かつ最も簡単な複製手法です。この手法は基本的なSQLコマンドを数行実行するだけで完了します。

前提条件

  • 元のPostgreSQLデータベースに対するスーパーユーザーまたは所有者権限
  • 元データベースへのアクティブな接続が存在しないこと(後述で解決する一般的な課題)
  • PostgreSQLクライアント(psql)またはデータベース管理ツール(pgAdmin)の利用環境

同一サーバーでの基本的な複製コマンド

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データベースをコピーする方法

異なるサーバー間でPostgreSQLデータベースを複製する作業は、移行、クラウドデプロイ、オンプレミス環境とリモート環境のデータ同期において重要です。この作業には、元データベースをエクスポートするpg_dump、コピー先でリストアを実行するpsqlというPostgreSQLネイティブの信頼できるツールを使用します。

ここでは大規模データベース/低速ネットワーク向けの手法と、小規模データベース/高速接続向けの手法の2種類を解説します。

前提条件

  • 元サーバーにpg_dumppsqlがインストールされていること(標準のPostgreSQLセットアップに同梱)
  • サーバー間のネットワーク接続(PostgreSQLのデフォルトポート5432が開放されていること)
  • 元とコピー先両方のPostgreSQLインスタンスに対するスーパーユーザー権限
  • コピー先サーバーにコピー後のデータベースを格納する十分なストレージ容量

手法1:ダンプファイルを転送してデータベースをコピー(大規模データベース/低速接続に最適)

この手法は最初にローカルにSQLダンプファイルを作成し、その後ファイルを転送してリストアを実行します。大容量データセットにおけるタイムアウトを回避できます。

手順1:元データベースのダンプファイルを作成

構文

pg_dump -U postgres -d sourcedb -f sourcedb.sql 

実行例(dvdrentalデータベースのダンプ)

pg_dump -U postgres -d dvdrental -f dvdrental.sql 
  • -U postgres:postgresスーパーユーザーを使用(自身の管理者ユーザーに置き換え)
  • -d sourcedb:元データベース名
  • -f sourcedb.sql:ダンプをSQLファイルとして保存

手順2:ダンプファイルをコピー先サーバーへ転送

Linux/macOSではSCP(Secure Copy)を使用(プレースホルダーを自身のサーバー情報に置き換え):

scp sourcedb.sql postgres@target_server_ip:/home/postgres/ 

手順3:空のコピー先データベースを作成

コピー先サーバーのPostgreSQLインスタンスに接続し以下を実行:

CREATE DATABASE targetdb; 

実行例:

CREATE DATABASE dvdrental_remote; 

手順4:ダンプファイルをコピー先データベースへリストア

コピー先サーバー上で実行:

psql -U postgres -d targetdb -f sourcedb.sql 

実行例:

psql -U postgres -d dvdrental_remote -f dvdrental.sql 
Tippg_dump-Oオプションを追加(例:pg_dump -U postgres -O -d dvdrental -f dvdrental.sql)すると所有者情報をスキップでき、コピー先での権限エラーを回避できます。

手法2:パイプによる直接コピー(小規模データベース/高速接続に最適)

この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 
  • -C:コピー先データベースを自動作成(手動のCREATE DATABASEは不要)
  • -h:元/コピー先サーバーのIPアドレスを指定
  • パイプ(|):ダンプ出力を直接コピー先のpsqlコマンドへ渡す

4. サーバー間コピー後のデータベース検証

コピー先サーバー上でレプリカが正常完了したことを確認します:

1. コピー先データベースへ接続: \c targetdb;

\c targetdb; 

2. テーブル一覧を表示しスキーマが元と一致するか確認:

\dt;

3. サンプルクエリでデータの完全性を検証:

SELECT COUNT(*) FROM customer;

実行結果を元データベースと比較し、完全に一致することを確認してください。

PostgreSQL COPYコマンドとデータベース全体コピーの違い

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データベース全体をレプリケートします。使用するツールは以下です:

  • CREATE DATABASE WITH TEMPLATE:同一サーバーでの複製用
  • pg_dump/psql:サーバー間複製用

これらのツールは個別のテーブルデータだけでなく、データベース構造全体を処理します。

i2StreamによるPostgreSQLデータベース移行の自動化

CLIによる手動のPostgreSQLコピー・移行は単純な作業には対応できますが、本番データベースでは処理が遅く、人為的エラーが発生しやすくリスクを伴います。i2StreamはPostgreSQLデータベース移行およびデータベースコピーのワークフローを効率化するプロフェッショナルなレプリケーション・移行ツールです。

同一サーバー、サーバー間両方のPostgreSQLデータベースコピーシナリオに対応し、エンタープライズグレードの安定性とほぼゼロダウンタイムを実現します。

PostgreSQLユーザー向け主なメリット

  • ワンクリックでデータベース複製:pg_dumpやpsqlコマンドの手動実行が不要
  • 稼働中の本番データベースに対するほぼゼロダウンタイム移行
  • スキーマ、データ、インデックス、制約、ストアドプロシージャを完全にレプリケート
  • 大規模PostgreSQLデータベース向けの高速同期
  • エージェントレス、元データベースへのパフォーマンス影響なし
  • 100%のデータ整合性を確保する組み込みのデータ検証機能
  • 完全同期と増分データ同期の両方に対応

i2Streamは複雑な手動によるデータベースコピーをシンプルで信頼性の高いワークフローに変えます。大規模にPostgreSQLデータベースの複製作業を扱うDBA、DevOps、開発チームに最適なソリューションです。

下記のボタンをクリックして無料トライアルを取得できます。

60日間無料トライアル
安全なダウンロード

PostgreSQLデータベースコピーの一般的なエラーのトラブルシューティング

正しいコマンドを使用してもPostgreSQLデータベースコピー時にエラーが発生する場合があります。代表的な問題と簡単な解決策を以下に記載します。

1. エラー:source database is being accessed by other users

source database is being accessed by other users

同一サーバーで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コマンドを再実行すると、正常に実行されます。

2. エラー:Permission denied

pg_dumppsql実行時、またはデータベース作成時にこのエラーが表示されることがあります。

原因:実行ユーザーにスーパーユーザー権限またはデータベース所有者権限がない。

解決策:スーパーユーザー(例:postgres)でコマンドを実行するか、適切な権限を付与してください。

3. エラー:コピー先データベースでのリストア失敗

原因:コピー先データベースが存在しない、または既にデータが格納されている。

解決策

  • 事前に空のデータベースを作成する。
  • 既にテーブルやスキーマが存在するデータベースに対してリストアを実行しない。

4. エラー:サーバー間コピー時のネットワークタイムアウト

Network timeout during cross-server copy

原因:不安定なネットワーク、またはデータベースサイズが大きい。

解決策

  • 直接パイプによる手法は使用しない。
  • pg_dumpで最初にローカルファイルを作成し、その後転送・リストアを実行する。

5. エラー:コピー後にデータまたはテーブルが欠損する

原因:不完全なダンプ、転送の中断、またはコピー実行中の書き込み処理。

解決策

  • ダンプファイルを再作成する。
  • ファイル転送が完全に完了したことを確認する。
  • コピー処理中は元データベースへの書き込みを行わない。

    PostgreSQLデータベース複製のベストプラクティス

    ベストプラクティスに従うことで、PostgreSQLデータベースコピーおよび複製作業を高速、安全、エラーなく実行できます。

    1. コピー実行前に必ずバックアップを取得

    元データベースのバックアップを取得せずにコピー作業を実行しないでください。コピー処理が失敗した場合のデータ損失を防ぐため、PostgreSQLバックアップを作成してください。

    2. 元データベースの負荷を最小限に抑える

    • 同一サーバーコピー:負荷のピーク時間帯を避けて実行(パフォーマンスへの影響を低減)。
    • サーバー間コピー:大規模データベースでは完全ダンプの代わりに(i2Streamによる)増分同期を使用。
    • コピー実行中に元データベースで重いクエリを実行しない。両方の処理が遅延します。

    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データベースコピーを実行する場合:

    • シェルスクリプトを使用しpg_dump/psqlのワークフローを自動化。
    • i2Streamのスケジューリング機能を使用し、負荷の低い時間帯にコピーを実行(手動操作不要)。

    7. 一時ファイルのクリーンアップ

    サーバー間コピー完了後、バックアップ用途で保持する場合を除き、元とコピー先サーバー両方からダンプファイルを削除しストレージを解放してください。

    これらのプラクティスはエラーを削減しデータを保護し、大規模環境においてPostgreSQLデータベース複製のワークフローを信頼できるものにします。

    まとめ

    PostgreSQLデータベースのコピーまたは複製は複雑である必要はありません。同一サーバーへのコピーでもサーバー間移行でも、単純な作業であればPostgreSQLネイティブツールであるCREATE DATABASE WITH TEMPLATE、pg_dump、psqlで対応可能です。

    本番環境、大規模データベース、頻繁な複製作業では、手動CLIによる手法では限界があります。i2Streamはプロセス全体を自動化し、ほぼゼロダウンタイム、高速同期、組み込みの検証機能を提供します。

    よくある質問(FAQ)

    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:コピーしたデータベースでテーブルまたはデータが欠損するのはなぜですか?

    一般的な原因は、ダンプ/転送の中断、コピー実行中の書き込み処理、不完全なダンプコマンドです。解決策:ダンプファイルを再作成し、転送が完了したことを確認し、コピー実行中は元データベースへの書き込みを避け、コピー完了後速やかに検証を実施してください。

     

    概要は準備中です

    関連記事

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