PostgreSQL / データの挿入と変更
PostgreSQLでのデータのインポートとエクスポート
概要
このガイドでは、PostgreSQLデータベースからデータをエクスポートする方法と、データをインポートする方法について説明します。このトピックについては、公式のPostgreSQLドキュメントで詳しく学ぶことができます。
pg_dump
によるデータエクスポート
pg_dump
は、PostgreSQLデータベースからデータをエクスポートするために使用できるネイティブのPostgreSQLユーティリティです。このコマンドのすべてのオプションを表示するには、以下を実行します。
pg_dump --help
このダンプ方法の背後にある考え方は、SQLコマンドを含むファイルを生成し、それをサーバーにフィードバックすることで、ダンプ時と同じ状態のデータベースを再作成するというものです。PostgreSQLはこの目的のためにユーティリティプログラム
pg_dump
を提供しています。pg_dump
は通常のPostgreSQLクライアントアプリケーションです(ただし、非常に賢いものです)。これは、データベースにアクセスできる任意のリモートホストからこのバックアップ手順を実行できることを意味します。ただし、pg_dump
は特別な権限で動作しないことに注意してください。特に、バックアップしたいすべてのテーブルへの読み取りアクセス権が必要であるため、データベース全体をバックアップするためには、ほとんどの場合データベーススーパーユーザーとして実行する必要があります。
コマンドの基本的な構文は次のようになります。
pg_dump DB_NAME > OUTPUT_FILE
DB_NAME
とOUTPUT_FILE
のプレースホルダーを、それぞれの値に置き換える必要があります。
- あなたのデータベース名
- 希望する出力ファイルの名前(最高の相互運用性のために
.sql
で終わるべきです)
例えば、ローカルのPostgreSQLサーバー上のmydb
というデータベースからmydb.sql
というファイルにデータをエクスポートするには、以下のコマンドを使用できます。
pg_dump mydb > mydb.sql
データベーススキーマがオブジェクト識別子型 (OIDs) を使用している場合、pg_dump
を--oids
(短縮形: -o
)オプション付きで実行する必要があります。
pg_dump mydb --oids > mydb.sql
データベース認証情報の提供
PostgreSQLデータベースサーバーの場所を指定するために、以下の引数を追加できます。
引数 | デフォルト | 環境変数 | 説明 |
---|---|---|---|
--host (短縮形: -h ) | localhost | PGHOST | サーバーのホストマシンのアドレス |
--port (短縮形: -p ) | - | PGPORT | PostgreSQLサーバーがリッスンしているサーバーのホストマシンのポート |
PostgreSQLデータベースサーバーに対して認証を行うには、以下の引数を使用できます。
引数 | デフォルト | 環境変数 | 説明 |
---|---|---|---|
--username (短縮形: -U ) | 現在のオペレーティングシステムユーザー名 | PGUSER | データベースユーザーの名前。 |
例えば、以下の接続文字列を持つPostgreSQLデータベースからデータをエクスポートしたい場合
postgresql://opnmyfngbknppm:XXX@ec2-46-137-91-216.eu-west-1.compute.amazonaws.com:5432/d50rgmkqi2ipus
以下のpg_dump
コマンドを使用できます。
pg_dump --host ec2-46-137-91-216.eu-west-1.compute.amazonaws.com --port 5432 --user opnmyfngbknppm d50rgmkqi2ipus > backup.sql
このコマンドは、指定されたユーザーのパスワードを入力するプロンプトをトリガーすることに注意してください。
出力の制御
データベース全体をダンプしたくない場合があるかもしれません。例えば、以下のような場合です。
- 実際のデータのみをダンプし、DDL(つまり、
CREATE TABLE
などのデータベーススキーマを定義するSQLステートメント)を除外する - DDLのみをダンプし、実際のデータを除外する
- 特定のPostgreSQLスキーマを除外する
- 大きなファイルを除外する
- 特定のテーブルを除外する
これらのシナリオで使用できるコマンドラインオプションの概要をいくつか示します。
引数 | デフォルト | 説明 |
---|---|---|
--data-only (短縮形: -a ) | false | 任意のDDLステートメントを除外し、データのみをエクスポートします。 |
--schema-only (短縮形: -s ) | false | データを除外し、DDLステートメントのみをエクスポートします。 |
--blobs (短縮形: -b ) | -schema 、--table 、または--schema-only オプションが指定されていない限りtrue | バイナリラージオブジェクトを含めます。 |
--no-blobs (短縮形: -B ) | false | バイナリラージオブジェクトを除外します。 |
--table (短縮形: -t ) | デフォルトですべてのテーブルを含みます | ダンプするテーブルの名前を明示的に指定します。 |
--exclude-table (短縮形: -T ) | - | ダンプから特定のテーブルを除外します。 |
SQLファイルからのデータインポート
SQL Dumpを使用してPostgreSQLデータベースをSQLファイルとしてエクスポートした後、そのSQLファイルをpsql
にフィードすることで、データベースの状態を復元できます。
psql DB_NAME < INPUT_FILE
DB_NAME
とINPUT_FILE
のプレースホルダーを、それぞれの値に置き換える必要があります。
- あなたのデータベース名(その名前のデータベースは事前に作成されている必要があります!)
- ターゲットとなる入力ファイルの名前(おそらく
.sql
で終わります)
事前にデータベースDB_NAME
を作成するには、template0
(サイト固有の追加を含まないプレーンなユーザーデータベースを作成します)を使用できます。
CREATE DATABASE dbname TEMPLATE template0;
結論
PostgreSQLからデータをエクスポートし、それを再度取り込んでデータ構造を再作成し、データベースにデータを投入することは、データの移行、バックアップと復旧、またはレプリケーションの準備に良い方法です。pg_dump
とpsql
ツールがこのタスクを達成するためにどのように連携するかを理解することは、データベースの境界を越えてデータを転送するのに役立ちます。