[pgsql-jp: 34711] Re: バックアップについて

Takao Kato sirius @ jp.fujitsu.com
2005年 1月 25日 (火) 10:53:27 JST


加藤です。

メールそのもの書いてあったのに完全に出し忘れてった... ^^;

At Mon, 24 Jan 2005 20:38:34 +0900,
HIRANO Yoshitaka wrote:

..snip..
> 
> <結果>
> ERROR: You must have Postgres superuser privilege to do a COPY directly to
> or from a file. Anyone can COPY to stdout or from stdin. Psql's \copy
> command also works for anyone

このエラーメッセージに答えが隠されていると思います。

[意訳]
COPYコマンドを使って直接ファイルにorファイルから書き出すにはPostgresスー
パーユーザ権限が必要です。標準入出力へのCOPYは誰でも実行可能です。
psqlの\copyコマンドも同様です。


つまり「標準入出力」なら入力も出力もできることになりますね。スクリプト
側で標準出力への書き出しをファイルにしてしまえばCOPYのかわりにはできま
すよね。

例えば、シェルスクリプトにすると

-- 8< -- 8< -- 8< --
#! /bin/csh -f

mv backup.db backup.db.0

echo "COPY table (col1,col2,...) FROM STDIN USING DELIMITER '	';" > backup.db
psql -t -A -F "	" -c 'COPY table (col1,col2,..) TO STDOUT;' 対象DB >> backup.db
echo "\\." >> backup.db

-- >8 -- >8 -- >8 --

ですかね。データだけ抽出する時に時々やってます。デリミタを[TAB]にして
いますが、CSV形式っぽくするなら , とかに変更してやれば良いでしょう。
面倒なのが[RET]が入っている場合なのです。事前に[RET]を別の文字(例えば
HTMLの改行タグの<br />とか)に置き換えるか、スクリプトをゴリゴリ書いて
カラム数不一致行は連結するとか細工してください。

なお、出力した backup.db は psal の \i コマンドで入力 or 1行1行INSERT
文に変換して投げ込むかしてやれば良いでしょう。
# その前に DELETE FROM table; しないとダブつく/制約NG になります。
# serial(sequence)の初期化(最大値設定)もお忘れなく

それでは
-------------------------------------------------------------
加藤@川崎在勤のネットワーク屋



pgsql-jp メーリングリストの案内