DBCATは軽量なコマンドラインツールで、データベース間のDDL変換やSchema比較などの機能を提供します。ここでは、DBCATを使用したテーブル構造の移行を例に説明します。
DBCATのインストールパッケージファイル名はdbcat-[バージョン番号]-SNAPSHOT.tar.gzで、ダウンロード後に解凍すれば使用できます。実行可能ファイル名はdbcatです。
注意
DBCATはOMSのコンポーネントです。コミュニティエディション環境では、OMSを使用したエクスポートを推奨します。
環境の準備
DBCATはCentOS、macOS、Windows上で動作します。JDK 1.8以降(含む)をインストールする必要があります。OpenJDKを使用することもできます。インストール後は環境変数JAVA_HOMEを設定してください。
CentOSにOpenJDKをインストールする例:
$sudo yum -y install java-1.8.0-openjdk.x86_64
$which java
/usr/local/java/jdk1.8.0_261/bin/java
echo 'export JAVA_HOME=/usr/local/java/jdk1.8.0_261/' >> ~/.bash_profile
. ~/.bash_profile
インストールファイルを解凍します:
tar zxvf dbcat-1.8.0-SNAPSHOT.tar.gz
cd dbcat-1.8.0-SNAPSHOT/
chmod +x bin/dbcat
$tree -L 3 --filelimit 30
.
├── bin
│ ├── dbcat
│ ├── dbcat.bat
│ └── dbcat-debug
├── conf
│ ├── dbcat.properties
│ └── logback.xml
├── docs
│ ├── README.docx
│ ├── README.md
│ └── README.txt
├── LEGAL.md
├── lib [45 entries exceeds filelimit, not opening dir]
├── LICENSE
├── meta
│ └── README
└── NOTICE
5 directories, 12 files
インストールファイルには以下のディレクトリが含まれており、それぞれについて理解しておく必要があります:
ディレクトリ名 |
説明 |
|---|---|
| bin | 実行ファイルディレクトリ。 |
| conf | ログファイル設定ディレクトリ。 |
| lib | 実行時依存パッケージ。 |
| meta | オフライン変換シナリオで、データディクショナリテーブルをエクスポートします。 |
| ~/output | SQLファイルとレポートファイルは、実行時に生成されます。 |
DB2 LUWデータベースのテーブル構造をエクスポートする
DBCATにはオンライン変換機能があり、これはDBCATがソースデータベースに直接接続してデータベース内のオブジェクトをエクスポートできることを指します。オブジェクトが非常に多い場合(例えば1万個を超える場合)、エクスポートプロセスが遅くなる可能性があります。
dbcatのエクスポートコマンドは以下のとおりです:
bin/dbcat convert -H<host> -P<port> -u<user> -p<******> -D<database> --schema <schema> --from <from> --to <to> --all
コマンドbin/dbcat help convertを実行すると、より詳細なパラメータ情報を確認できます。
必須パラメータ:
オプション |
パラメータの有無 |
日本語説明 |
|---|---|---|
| -H/--host | Y | データベースサーバーのIPアドレス |
| -P/--port | Y | データベースサーバーのポート |
| -u/--user | Y | データベースへのログインユーザー名 |
| -t/--tenant | Y | OceanBaseクラスタへの接続にはテナント名が必要 |
| -c/--cluster | Y | OceanBaseクラスタへの接続にはクラスタ名が必要 |
| -p/--password | Y | データベースへのログインパスワード |
| -D/--database | Y | データベース名(ソースデータベース)、DB2ではデータベース名とスキーマ名を区別する |
| --service-id | Y | Oracleデータベースへの接続にはサービスIDが必要 |
| --service-name | Y | Oracleデータベースへの接続にはサービス名が必要 |
| --as-sysdba | N | Oracleデータベースのsysdbaロールで接続 |
| --sys-user | Y | OceanBaseクラスタのシステムテナントへの接続ユーザー名 |
| --sys-password | Y | OceanBaseクラスタのシステムテナントへの接続パスワード |
| --schema | Y | スキーマ名(ソースデータベース)、DB2以外ではスキーマ名とデータ名は同じ |
| --from | Y | ソースデータベースのタイプ |
| --to | Y | ターゲットデータベースのタイプ |
| --all | N | すべてのデータベースオブジェクト |
オプションパラメータ:
オプション |
パラメータの有無 |
日本語説明 |
|---|---|---|
| -f/--file | Y | SQLファイルの出力パス |
| --offline | N | オフラインモードを使用します |
| --target-schema | Y | モード名(ターゲットデータベース) |
| --table | Y | エクスポートするテーブル |
| --view | Y | エクスポートするビュー |
| --trigger | Y | エクスポートするトリガー |
| --synonym | Y | エクスポートするシノニム |
| --sequence | Y | エクスポートするシーケンス |
| --function | N | エクスポートする関数 |
| --procedure | N | エクスポートするストアドプロシージャ |
| --dblink | Y | すべてのDBLinkをエクスポートします |
| --type | Y | エクスポートするtype |
| --type-body | Y | エクスポートするtype body |
| --package | Y | エクスポートするpackage |
| --package-body | Y | エクスポートするpackage body |
| --no-quote | N | 生成されるDDLにはクォートが付きません |
| --no-schema | N | 生成されるDDLにはモード名が含まれません |
| --target-schema | Y | 生成されるDDLには指定されたモード名が使用されます |
| --exclude-type | Y | --allと組み合わせて使用します。例:--all --exclude-type 'TABLE' はTABLEタイプを除外することを意味します |
ここでは、DB2 LUW 11.5.xバージョンのデータベースtestのすべてのオブジェクト構造をエクスポートし、それを4.0.0バージョンのOceanBaseクラスタ内のMySQLテナントに移行する例を示します。
bin/dbcat convert -H xxx.xxx.xxx.xxx -P 50001 -udb2inst2 -p****** --schema TESTDB -DTESTDB --table bmsql_customer --from db2luw115 --to obmysql32x --all
特記事項:
dbcatはデータベースホストに直接インストールする必要はありません。データベースホストに直接接続できるホストにインストールすればよいです。
パラメータの--fromと--toはソース側とターゲット側のデータベースタイプであり、バージョン番号まで詳細に指定する必要があります。現在dbcatがサポートするソース側とターゲット側のデータベースの詳細は以下のとおりです:
ソースデータベースタイプターゲットデータベースタイプTiDB OBMYSQL PG OBMYSQL SYBASE OBORACLE MYSQL OBMYSQL ORACLE OBORACLE ORACLE OBMYSQL DB2 IBM i OBORACLE DB2 LUW OBORACLE DB2 LUW OBMYSQL OBMYSQL MYSQL OBORACLE ORACLE ここで、OBMYSQLはOceanBaseデータベースのMySQLテナント、OBORACLEはOceanBaseデータベースのOracleテナントを指します。
現在サポートされているソース側とターゲット側のデータベースの詳細なバージョンは以下のとおりです。
データベースタイプデータベースバージョンTiDB tidb4
tidb5PG pgsql10 SYBASE sybase15 DB2 IBM i db2ibmi71 DB2 LUW db2luw970
db2luw1010
db2luw1050
db2luw111
db2luw115MYSQL mysql56
mysql57
mysql</80>ORACLE oracle9i
oracle10g
oracle11g
oracle12c
oracle18c
oracle19cOBMYSQL obmysql14x
obmysql21x
obmysql22x
obmysql200
obmysql211
obmysql2210
obmysql2230
obmysql2250
obmysql2271 ~ obmysql2277
obmysql30x
obmysql31x
obmysql32x
obmysql322
obmysql40OBORACLE oboracle2220
oboracle2230
oboracle2250
oboracle2270 ~ oboracle2277
oboracle21x
oboracle22x
oboracle30x
oboracle31x
oboracle32x
oboracle322
oboracle40
実行後の出力ファイルは、ユーザーのhomeディレクトリ内のoutput配下にあります。
$tree ~/output/dbcat-20xx-xx-xx-164533/
/home/qing.meiq/output/dbcat-20xx-xx-xx-164533/
├── tpccdb
│ └── TABLE-schema.sql
└── tpccdb-conversion.html
1 directory, 2 files
OceanBaseデータベースにインポートする
DBCATでエクスポートされたファイル形式はSQLファイルです。ここでは、ODCのインポート機能を使用してテーブル構造をOceanBaseデータベースに一括インポートできます。詳細については、一括エクスポートとインポートを参照してください。
また、sourceコマンドを使用してSQLファイルのデータをOceanBaseデータベースにインポートすることもできます。例:
obclient [test]> source TABLE-schema.sql
Query OK, 0 rows affected (0.044 sec)
注意
SQLファイルが現在のディレクトリにない場合は、絶対パスを使用する必要があります。
結果の検証
例:テーブル構造がDB2 LUWとOceanBaseデータベースでどのように記述されるかを確認します。
ソースデータベースDB2 LUWのテーブルbmsql_customerの作成SQLを確認します:
db2 => describe table bmsql_customer
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
C_W_ID SYSIBM BIGINT 8 0 No
C_D_ID SYSIBM BIGINT 8 0 No
C_ID SYSIBM BIGINT 8 0 No
C_DISCOUNT SYSIBM DECIMAL 4 4 Yes
C_CREDIT SYSIBM CHARACTER 2 0 Yes
C_LAST SYSIBM VARCHAR 16 0 Yes
C_FIRST SYSIBM VARCHAR 16 0 Yes
C_CREDIT_LIM SYSIBM DECIMAL 12 2 Yes
C_BALANCE SYSIBM DECIMAL 12 2 Yes
C_YTD_PAYMENT SYSIBM DECIMAL 12 2 Yes
C_PAYMENT_CNT SYSIBM INTEGER 4 0 Yes
C_DELIVERY_CNT SYSIBM INTEGER 4 0 Yes
C_STREET_1 SYSIBM VARCHAR 20 0 Yes
C_STREET_2 SYSIBM VARCHAR 20 0 Yes
C_CITY SYSIBM VARCHAR 20 0 Yes
C_STATE SYSIBM CHARACTER 2 0 Yes
C_ZIP SYSIBM CHARACTER 9 0 Yes
C_PHONE SYSIBM CHARACTER 16 0 Yes
C_SINCE SYSIBM TIMESTAMP 10 6 Yes
C_MIDDLE SYSIBM CHARACTER 2 0 Yes
C_DATA SYSIBM VARCHAR 500 0 Yes
21 record(s) selected.
ターゲットデータベースOceanBaseのテーブルbmsql_customerの構造を確認します:
obclient [test]> desc bmsql_customer;
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| c_w_id | bigint(20) | NO | PRI | NULL | |
| c_d_id | bigint(20) | NO | PRI | NULL | |
| c_id | bigint(20) | NO | PRI | NULL | |
| c_discount | decimal(4,4) | YES | | NULL | |
| c_credit | char(2) | YES | | NULL | |
| c_last | varchar(16) | YES | | NULL | |
| c_first | varchar(16) | YES | | NULL | |
| c_credit_lim | decimal(12,2) | YES | | NULL | |
| c_balance | decimal(12,2) | YES | | NULL | |
| c_ytd_payment | decimal(12,2) | YES | | NULL | |
| c_payment_cnt | int(11) | YES | | NULL | |
| c_delivery_cnt | int(11) | YES | | NULL | |
| c_street_1 | varchar(20) | YES | | NULL | |
| c_street_2 | varchar(20) | YES | | NULL | |
| c_city | varchar(20) | YES | | NULL | |
| c_state | char(2) | YES | | NULL | |
| c_zip | char(9) | YES | | NULL | |
| c_phone | char(16) | YES | | NULL | |
| c_since | timestamp | YES | | NULL | |
| c_middle | char(2) | YES | | NULL | |
| c_data | varchar(500) | YES | | NULL | |
+----------------+---------------+------+-----+---------+-------+
21 rows in set (0.007 sec)
比較した結果、テーブルフィールドの文字型および長さには一定の変更が見られます。テーブルフィールド変換の詳細については、DB2 LUWからOceanBaseデータベースのOracleテナントへのデータ移行プロジェクト のデータ型マッピングを参照してください。