DB2のデータを取り扱う場合、"backup"だと別のインスタンスに復元できないので、export/import or export/load することになるわけですが、これが結構面倒。さらに、exportしたファイルのサイズが2GBを超える場合、AIXのgzip 1.2.4では正常に圧縮できないため分割する必要が生じたりする。

 こうした作業負荷を多少軽減するスクリプトを書いてみた。シェルスクリプト引数やファイルの存在可否で、export/loadしたいテーブルの取捨選択ができるのがちょっとだけ便利な気がする。

*** export helper for AIX [#uc505b77]
&ref(export_tables.ksh);
 #!/bin/ksh
 #
 # DBのデータを、テーブル毎に、exportしてgzip圧縮するスクリプト。
 # 引数にテーブル名(スペース区切り)を指定した場合は、それのみを対象とする。
 # 引数なし実行の場合は、全てのテーブルが対象。
 #
 # ※ DB2操作可能ユーザ(db2inst1等)が実行すること。
 #
 # 2GB以上のファイルはgzip圧縮できないため、splitコマンドで1.8GB毎に分割する。
 # 分割したファイルは、UNIXのcatコマンドや、Windowsのcopyコマンドで復元できる。
 #
 # @author K.Jomura
 # @author K.Jomura ( kazuhiko@jomura.net http://jomura.net/ )
 # @version 2011/05/20
 
 
 # 対象データベース名
 DATABASE_NAME=Sample
 
 # 対象テーブルスキーマ名(大文字)
 SCHEMA_NAME=db2inst1
 SCHEMA_NAME=DB2INST1 
 
 
 # 以下、編集の必要なし
 
 db2 connect to $DATABASE_NAME
 
 if [ $# -ne 0 ]; then
   set -A tables $*
 else
   tables=`db2 -x "select tabname from syscat.tables where tabschema = '$SCHEMA_NAME' and ownertype = 'U' and type = 'T' order by tabname"`
 fi
 
 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

*** export helper for Windows [#u2610a43]
&ref(export_tables.bat);  ※ 実行には、[[gzip.exe:http://gnuwin32.sourceforge.net/packages/gzip.htm]], [[split.exe:http://gnuwin32.sourceforge.net/packages/coreutils.htm]], [[libintl3.dll, libiconv2.dll:http://getgnuwin32.sourceforge.net/]]が必要。


*** load helper for Windows [#f7e30061]
&ref(load_tables.bat);  ※ 実行には、[[gzip.exe:http://gnuwin32.sourceforge.net/packages/gzip.htm]]が必要。
 @echo off
 ::
 :: DBのgzip圧縮されたデータファイルを、テーブル毎にloadするスクリプト。
 :: カレントフォルダにデータファイルがあるテーブルのみを対象とし、全てのデータを入れ替える。
 :: 「入れ替えたいテーブルのデータだけをカレントフォルダに配置して、本バッチを実行」すればよい。
 :: もしくは「入れ替えたいテーブル名を引数に指定(9ヶまで)して、本バッチを実行」すればよい。
 ::
 :: ※ DBコマンドウィンドウで、DB2操作可能ユーザ(db2admin等)が実行すること。
 :: ※ 実行には、gzip.exeが必要
 ::    gzip.exe : http://gnuwin32.sourceforge.net/packages/gzip.htm
 ::
 :: @author K.Jomura ( kazuhiko@jomura.net http://jomura.net/ )
 :: @version 2011/05/20
 
 
 :: 対象データベース名
 set DATABASE_NAME=Sample
 
 :: 対象テーブルスキーマ名(大文字)
 set SCHEMA_NAME=DB2ADMIN
 
 
 :: 以下、編集の必要なし
 
 setlocal enabledelayedexpansion
 
 db2 connect to %DATABASE_NAME%
 
 if not "%*" == "" (
 	set TABLES=%*
 ) else (
 	set TABLES=
 	db2 -x -z_table.list select tabname from syscat.tables where tabschema = '%SCHEMA_NAME%' and ownertype = 'U' and type = 'T' order by tabname > nul
 	for /f %%L in (_table.list) do  (
 		set TABLES=!TABLES! %%L
 	)
 	del _table.list
 )
 
 for %%i in (%TABLES%) do @call :load %%i
 
 db2 connect reset
 
 endlocal
 
 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
 	)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS