Last-modified: 2011-05-20 (金) 13:57:34 (4107d)

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

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

export helper for AIX

fileexport_tables.ksh

#!/bin/ksh
#
# DBのデータを、テーブル毎に、exportしてgzip圧縮するスクリプト。
# 引数にテーブル名(スペース区切り)を指定した場合は、それのみを対象とする。
# 引数なし実行の場合は、全てのテーブルが対象。
#
# ※ DB2操作可能ユーザ(db2inst1等)が実行すること。
#
# 2GB以上のファイルはgzip圧縮できないため、splitコマンドで1.8GB毎に分割する。
# 分割したファイルは、UNIXのcatコマンドや、Windowsのcopyコマンドで復元できる。
#
# @author K.Jomura ( kazuhiko@jomura.net http://jomura.net/ )
# @version 2011/05/20


# 対象データベース名
DATABASE_NAME=Sample

# 対象テーブルスキーマ名(大文字)
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

fileexport_tables.bat  ※ 実行には、gzip.exe, split.exe, libintl3.dll, libiconv2.dllが必要。

load helper for Windows

fileload_tables.bat  ※ 実行には、gzip.exeが必要。

@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
	)

添付ファイル: fileexport_tables.ksh 3130件 [詳細] fileload_tables.bat 2961件 [詳細] fileexport_tables.bat 2979件 [詳細]

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