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;
以上