以下のように、昔のハードディスクの.var/lib/pgsqlをコピーしてpostgresを起動させると
1. initdb
2. copy
3. /etc/initd.d/postgres restart
古いバージョンのデータベースフォーマットがみつかりましたと言う。
なるほど、昔から、pg_dumpをとるようにお客さんのマシーンは設定してきたが、弊社は能天気なものであった。
それと、UTF8が最近ではデフォルトになっているので、
initdb -D /var/lib/pgsql/data/ --encoding=UTF8 --no-locale
のようにして初期化をすることが大事である。
そして、
createdb -E EUC-JP -T template0 あるデータベース
のようにDBを作成する。-Tを指定しないと、以下のようなエラーが発生する。
createdb: データベースの生成に失敗しました: ERROR: new encoding (EUC_JP) is incompatible with the encoding of the template database (UTF8)
HINT: Use the same encoding as in the template database, or use template0 as template.
こうすると、いろいろなエンコードの昔のDBをもってくることができる。
以下がバックアップの例(O君の例)
echo "DB backup start at `date`"
dbname=なんとかdb
fdir=${HOME}/db_backup"
days=30
# バックアップディレクトリがなければ作る
if [ ! -e $fdir ]
then
echo "$fdir ディレクトリを作成しました。"
mkdir $fdir
fi
#日付をもとにバックアップファイルの名前を決める
fname="$fdir/$dbname.`date '+%y%m%d%H%M%S'`.dump"
echo "$dbname DB のバキュームをしています。 "
# deleteされた穴を消す
vacuumdb $dbname
echo "$dbname Dbを$fnameにバックアップしています。"
# これが本当にバックアップを作る肝心なコマンド
pg_dump -Ft -o $dbname > $fname
# 圧縮する
gzip $fname
echo "$days 日以上経過したバックアップファイルは消す "
find $fdir -mtime +$days -name "${dbname}*.gz" -print -exec rm -f {} \;
echo "DB バックアップは `date`に終了"
リストアは以下のように(あらかじめ圧縮を解いておく)。
echo "ファイル " $1 " からリストアします。よろしいですか?(y/n) "
read sw
if [ $sw = 'y' ]
then
echo "DB リストアを開始しました: `date`"
dbname=あるデータベース
# 以下はデータを全部消去するもの
psql -e -f /home/ユーザ/db_backup/deleteAllRecords.sql -U ユーザ $dbname
# ここが肝心の部分
pg_restore -Ft -d $dbname < $1
echo "DB リストアを終了します: `date`"
fi
ちなみにmysqlの場合には、(全部と個別)
mysqldump --all-databases > mysql_all_databases.sql
mysqldump database >mysql_aDataBase.sql
リストアは(全部と個別)、
mysql < mysql_all_databases.sql
mysql database < mysql_aDataBase.sql
psqlだと、EUC_JPのファイルをUTF-8の端末で見ると「…続く…]の部分は読めるが、漢字の部分は読めないので急遽、端末のエンコードをEUC_JPにすると、漢字のところが見える。
こういう混在環境で活躍するのが、Squirrel SQL Clientである。File->Global->FontでOthersのところのファントを豆腐のような白い箱が4つとか6つとかのフォントを選べば、以下のように表示される(これは先日の郵便番号DB)
