一般的に、DBのデータを他のマシンにコピーしたい場合は、dataディレクトリをまるごと持っていくか、pg_dumpを使うと思われる。しかし、DBのデータを他のマシンにコピーするときに、ついでにテーブルの拡張をしたいときは、どうすればいいだろう・・・。データの件数が少なければ、手作業で書き換えてもいいけれど、数千件もあるものを手作業で書き換えるのはちょっと考え物。
そんな作業をしなくてはいけなくなったので、ちょっと調べてみた。
やりたいこと
既存のDBにあるテーブルのいくつかに、カラムを追加する。
追加したカラムには、他のテーブルの値をセットする。
具体的には、tblAに新たにclmDを追加して、そのカラムの値には、tblBのclmCを入れたい。その際に、tblAのclmAと、tblBのclmBが同じものに限る。といった感じ。(なんか解り辛いかも・・・)
ただ単にカラムを追加するだけなら、エディタのマクロとかでも何とかなるけれど、他のテーブルからデータを引っ張ってくるなら、それは無理。そこで、こんな方法をとってみた。
既存DBからデータを取ってくるシェル
psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT grp.uid, grp.uname, grp.upass, usr.grpid FROM grp, usr WHERE grp.uid = usr.uid" > grp.db.out
psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT usr.uname, usr.uid, usr.grpid, usr.add, usr.tel FROM usr, grp" > usr.db.out
:
:
新規DBに書き込むシェル
psql -U postgres NEW_DB -c "copy grp from '/var/lib/pgsql/grp.db.out' using delimiters ',' with null as ''"
psql -U postgres NEW_DB -c "copy usr from '/var/lib/pgsql/usr.db.out' using delimiters ',' with null as ''"
:
:
さて、新しいアプリからDBにアクセスしてみると・・・ちゃんとカラムが追加されていて、データもちゃんと入っているみたい。あっさり終了しました。
このやり方で間違っていないよなぁ・・・データがちゃんと入ってるから、大丈夫なんだよなぁ・・・(←あっさり出来てしまって、かなり不安(笑))
コメント