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'