kosappi の日記

愛知県豊橋市に住んでます

2つの PostgreSQL 間でデータをコピーする

pg_dump ではデータベース丸ごと、テーブルごと、が指定できる。

でも、データがめちゃくちゃ大きい場合は SELECT * FROM users WHERE sex=0 みたいな SQL の結果をダンプしたくなる。 pg_dump のオプションでは、これを実現できない。

PostgreSQL ではクライアント(psql)の \copy コマンドが使える。 \copy

フロントエンド(クライアント)コピーを行います。 これはCOPY SQLコマンドを実行する操作ですが、サーバで指定ファイルに対する読み込みまたは書き込みを行うのではなく、psqlがファイルの読み書きや、サーバとローカルファイルシステム間のデータ送信を行います。 この場合、ファイルへのアクセス権限はサーバではなくローカルユーザのものを使用するので、SQLのスーパーユーザ権限は必要ありません。

PostgreSQL が持っている COPY とは厳密には違うので注意されたい。

シェルスクリプトを工夫すれば COPY でも同じことができると思うが、今回は psql でログインしてササッとやる感じ。

ダンプ

-- クライアントをデータベース1(コピー元)につなぐ
\copy (SELECT * FROM users WHERE sex=0) TO './users_sex_0.dump'

リストア

-- クライアントをデータベース2(コピー先)につなぐ
\copy users FROM './users_sex_0.dump'