PostgreSQLスキルアップノート(自己啓発のための個人サイト)

pg_dump,pg_dumpall Tips


【一覧に戻る】


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ pg_dump,pg_dumpallのTips
■■■■
■■■■
■■■■ 2012/11/13
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
                                                                   (C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合により実機確認は9.1、マニュアルへのリンクは9.2としています。ご了承下さい。

【マニュアル】
・pg_dump全体→●[マニュアル]SQLによるダンプ
・pg_dumpコマンド→●[マニュアル]pg_dump
・pg_dumpallコマンド→●[マニュアル]pg_dumpall
・pg_restoreコマンド→●[マニュアル]pg_restore



■1■ pg_dumpのリストア前のcreatedbはtemplate0で・・
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


createdbは特に指定なしで実行した場合、template1のDBをコピーしているため、
template1内に独自のテーブル等が作成してあった場合、createdbした時点で新しいDBに
もそのテーブルがコピーされる。
一方で、移行元のDBに同名のテーブルが含まれていると、pg_dumpを使って移行しようと
しても、移行先にはすでにテーブルが存在しているため、移行中にテーブルの作成がエラー
となる。


pg_dumpを行う際のcreatedbは、以下の方法にする必要がある。

createdb -T template0 dbname

template1をカスタマイズしていないなら別に以下の方法でも構わない。

createdb  dbname



マニュアルpg_dump
「注釈 データベースクラスタにおいてtemplate1データベースに対し独自の変更を行ってい
る場合、pg_dumpの出力は、確実に空のデータベースにリストアするように注意してください。」



実機確認
──────────────────────────────
database02をcreatedbしてから
pg_dump -d database1|psql -d database02
のようにしてデータを移行した場合、
もし、template1上にテーブルt1を作成していると、createdb時点ですでに
database2にはt1が作成されていることになり、
さらにpg_dumpからのリストアではt1が移行対象になるものの、すでにテー
ブルが存在することからテーブル作成自体はエラーになる。
リストアでのinsert処理はテーブル構成が同じで既存データとPK制約等にか
からなければ成功してしまう。


(1)移行元database01にはテーブルt1が存在する状態

【□】 psql -d database01
【□】 select * from t1;

      c1
    ------
     aaaa

(2)template1にテーブルを作成し、databse02を作成

【□】 psql -d template1
【□】 create table t1 (c1 varchar(10));
【□】 insert into t1 values('abcdefg');

【□】 createdb database02
【□】 psql -d database02
【□】 select * from t1;

       c1 
    ---------
     abcdefg


・・・createdbした時点ですでにdatabase02にはt1テーブルが存在している。


(3)pg_dumpでdatabase1からdatabase02へ移行

【□】 pg_dump  database01|psql -d database02

    :
    ERROR:  relation "t1" already exists
    :

【□】 psql -d database02
【□】 select * from t1;

     c1
  ---------
   abcdefg
   aaaa


・・・テーブル作成はalready existsでエラーになるがデータは挿入されて
最初からあったものに加えて2行になった。

同名テーブル&異なる定義なら当然insertもエラーとなる
ERROR:  column "c1" of relation "t1" does not exist


(4)後始末template1内の掃除

【□】 psql -d template1
【□】 drop table t1;








以上 
inserted by FC2 system