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