csvは共通フォーマット!!IBM DB2であれば、EXPORT ユティリティで出力できるし、MySQLであれば .... INTO OUUTFILE でCSVを出力できます。CSVは共通フォーマットなので、例えば、DB2からMySQLにCSVファイルをそのまま移行できると思いきや・・・実はそんなに簡単にうまくいかないのです。
大きな部分では、改行コードがそれにあたります
DB2にしてみれば、改行コードは改行コードなのでCSVファイルも、テキストエディタで見ると改行がはいる形で見れます
かたやMySQLは、
改行コードをエスケープした形では入ります。\N とかそんなかんじですね。
なので、そのあたりを注意しつつ、DB2側のEXPORTを行うことになるのですが、数百あるテーブルをいちいち加工してEXPORTするのは面倒だ!ということで、
とにかく、DB2上に入っているテーブルすべてを、MySQL形式のCSVファイルでEXPORTしちゃうぜ!!というshellを作ってみました。
厳密にいいますと、MySQL用のCSV形式でEXPORTする、SQLを生成するshellですかねw
shell
形式
こんな漢字で呼びます。注意する点は、[CSV出力パス]はディレクトリまで指定です。ファイル名は、スキーマ名と、テーブル名で自動生成されますって感じです
./db2_to_mysql_export2.sh -d [データベース名] -s [スキーマ名] -t [テーブル名] -c [CSV出力パス]
呼び出し例
./db2_to_mysql_export2.sh -d db2database -s SCHEMA1 -t AA -c /tmp
bash ソース
コピペして使ってくださいませ
db2_to_mysql_export2.sh
# !/bin/bash
# DB2プロファイルのロード
. /home/db2inst1/sqllib/db2profile
while getopts "d:s:t:c:" opts
do
case $opts in
d) _dbname=$OPTARG ;;
s) _tabschema=$OPTARG ;;
t) _tabname=$OPTARG ;;
c) _csv_data_path=$OPTARG ;;
esac
done
if [ "$_dbname" == "" ]; then
echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
exit -1
fi
if [ "$_tabschema" == "" ]; then
echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
exit -1
fi
if [ "$_tabname" == "" ]; then
echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
exit -1
fi
if [ "$_csv_data_path" == "" ]; then
echo "usage $0 -d [_DATABASENAME] -s [_SCHEMA] -t [_TABLE] -c [_CSVPATH]"
exit -1
fi
# DB2のアカウント情報 #############
_dbuserid=db2inst1
_dbpasswd=dbpassword
# テンポラリファイル
_export_sql_create_path="/tmp"
_export_sql_path="/tmp"
cat << _EOT_ > ${_export_sql_create_path}/${_tabschema}.${_tabname}.export.sql.create.sql
CONNECT to ${_dbname} USER ${_dbuserid} USING ${_dbpasswd} ;
EXPORT TO ${_export_sql_path}/${_tabschema}.${_tabname}.export.sql OF DEL
MODIFIED BY NOCHARDEL
SELECT
ZZZ.STRSQL
FROM
(
SELECT
TEMP.*
FROM
(
VALUES
(0,'CONNECT TO ${_dbname} user ${_dbuserid} using ${_dbpasswd} ;'),
(1,'EXPORT TO ${_csv_data_path}/${_tabschema}.${_tabname}.csv OF DEL MODIFIED BY codepage=1208 SELECT ')
) AS TEMP(SEQNO,STRSQL)
UNION ALL
SELECT
Z.SEQNO,
RTRIM(Z.STRCOL) AS STRSQL
FROM
(
SELECT
X.COLNO + 100 AS SEQNO,
CASE
WHEN X.NULLS='Y' AND X.TYPENAME <> 'VARCHAR'
THEN
X.COLNAME WHEN X.NULLS='Y' AND X.TYPENAME = 'VARCHAR' THEN 'COALESCE(' || X.COLNAME || ', ''\N'')'
ELSE
X.COLNAME
END ||
CASE
WHEN Y.MAX_COLNO=X.COLNO
THEN
' FROM ${_tabschema}.${_tabname} ; '
ELSE
' ,'
END AS STRCOL
FROM
(
SELECT
TABSCHEMA,
TABNAME,
COLNO,
COLNAME,
TYPENAME,
NULLS
FROM
SYSCAT.COLUMNS
WHERE
TABSCHEMA = '${_tabschema}' AND
TABNAME = '${_tabname}'
) X ,
(
SELECT
TABSCHEMA,
TABNAME,
MAX(COLNO) AS MAX_COLNO
FROM
SYSCAT.COLUMNS
WHERE
TABSCHEMA = '${_tabschema}' AND
TABNAME = '${_tabname}'
GROUP BY
TABSCHEMA,
TABNAME
) Y
ORDER BY X.COLNO
) Z
) ZZZ
ORDER BY
ZZZ.SEQNO
;
_EOT_
db2 -tvf ${_export_sql_create_path}/${_tabschema}.${_tabname}.export.sql.create.sql
db2 -tvf ${_export_sql_path}/${_tabschema}.${_tabname}.export.sql
cat << _EOT_
CSV出力が完了しました。CSVファイルは、
${_csv_data_path}/${_tabschema}.${_tabname}.csv
に保存されております
_EOT_
exit 0
CSV出力結果
$ cat /tmp/SCHEMA1.AA.csv
893,11,"GGG"
894,11,"HHH"
888,12,"テスト"
1,1,"aaa'"
2,0,"test2"
3,1,"foo\"
4,1,"\N"
5,1,"NULL"
6,1,"\\n"
7,1,"""DBL"""
100,0,"test"
101,0,"testtest"
102,0,"日本語テスト"