DB2/backup and restore tool のバックアップ(No.3) |
|
DB2のデータを取り扱う場合、"backup"だと別のインスタンスに復元できないので、export/import or export/load することになるわけですが、これが結構面倒。さらに、exportしたファイルのサイズが2GBを超える場合、AIXのgzip 1.2.4では正常に圧縮できないため分割する必要が生じたりする。
こうした作業負荷を多少軽減するスクリプトを書いてみた。シェルスクリプト引数やファイルの存在可否で、export/loadしたいテーブルの取捨選択ができるのがちょっとだけ便利な気がする。
#!/bin/ksh # # DBのデータを、テーブル毎に、exportしてgzip圧縮するスクリプト。 # 引数にテーブル名(スペース区切り)を指定した場合は、それのみを対象とする。 # 引数なし実行の場合は、全てのテーブルが対象。 # # ※ DB2操作可能ユーザ(db2inst1等)が実行すること。 # # 2GB以上のファイルはgzip圧縮できないため、splitコマンドで1.8GB毎に分割する。 # 分割したファイルは、UNIXのcatコマンドや、Windowsのcopyコマンドで復元できる。 # # @author K.Jomura # @version 2011/05/02 # 対象となる可能性があるテーブルを全て列挙 set -A tables TABLE_A TABLE_B TABLE_C # 対象データベース名 DATABASE_NAME=Sample # 対象テーブルスキーマ名 SCHEMA_NAME=db2inst1 # 以下、編集の必要なし if [ $# -ne 0 ]; then set -A tables $* fi # 対象データベース名 db2 connect to $DATABASE_NAME for tname in ${tables[*]} do [ -f $tname.del ] && rm -f $tname.del [ -f $tname.del.gz ] && rm -f $tname.del.gz echo "Exporting $tname ..." db2 EXPORT TO $tname.del OF DEL MODIFIED BY codepage=1208 "SELECT * FROM $SCHEMA_NAME.$tname" > /dev/null [ -f $tname.del ] || exit 1 fsize=`ls -l $tname.del | tr -s ' ' | cut -d ' ' -f5 -` echo "Compressing $tname.del($fsize Byte)..." if [ $fsize -gt 2097152000 ] then echo " File size 2000 MB over. Splitting..." rm -f $tname.del.split.* split -b 1800m $tname.del $tname.del.split. rm -f $tname.del gzip $tname.del.split.* else gzip $tname.del fi done db2 connect reset
※ 実行には、gzip.exeが必要。
@echo off :: :: DBのgzip圧縮されたデータファイルを、テーブル毎にloadするスクリプト。 :: カレントフォルダにデータファイルがあるテーブルのみを対象とし、全てのデータを入れ替える。 :: 「入れ替えたいテーブルのデータだけをカレントフォルダに配置して、本バッチを実行」すればよい。 :: :: ※ DBコマンドウィンドウで、DB2操作可能ユーザ(db2admin等)が実行すること。 :: :: @author K.Jomura :: @version 2011/05/19 :: 対象となる可能性があるテーブルを全て列挙 set TABLES=TABLE_A TABLE_B TABLE_C :: 対象データベース名 set DATABASE_NAME=Sample :: 以下、編集の必要なし if not "%*" == "" set TABLES=%* db2 connect to %DATABASE_NAME% for %%i in (%TABLES%) do @call :load %%i db2 connect reset exit /b :load if exist %1.del.gz ( echo Uncompressing %1.del... gzip -dk %1.del.gz echo Loading %1 ... db2 load from %1.del of DEL REPLACE INTO %1 NONRECOVERABLE > nul del %1.del exit /b ) if exist %1.del.split.aa.gz ( echo Uncompressing %1.del.split.*... gzip -dk %1.del.split.*.gz ren %1.del.split.*.gz %1.del.splited.*.gz copy /b %1.del.split.* %1.del del %1.del.split.* echo Loading %1 ... db2 load from %1.del of DEL REPLACE INTO %1 NONRECOVERABLE > nul del %1.del ren %1.del.splited.*.gz %1.del.split.*.gz exit /b )