DBCATは、軽量なコマンドラインツールであり、データベース間のDDL変換やSchema比較などの機能を提供します。ここでは、DBCATを使用したテーブル構造の移行を例として説明します。
DBCATのインストールパッケージファイル名はdbcat-[バージョン番号]-SNAPSHOT.tar.gzで、ダウンロード後に解凍すれば使用可能です。実行可能ファイル名はdbcatです。
注意
DBCATはOMSのコンポーネントであり、Community Edition環境では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にはオンライン変換機能があり、これはDCATがソース側のデータベースに直接接続し、データベース内のオブジェクトをエクスポートできることを指します。オブジェクトが非常に多い場合(例えば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 V11.5.xのtestデータベースからすべてのオブジェクトの構造をエクスポートし、それをOceanBaseデータベースのMySQL互換モードテナントV4.0.0に移行する例を示します。
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 PostgreSQL OBMYSQL SYBASE OBORACLE MySQL OBMYSQL Oracle OBORACLE Oracle OBMYSQL DB2 for i OBORACLE DB2 LUW OBORACLE DB2 LUW OBMYSQL OBMYSQL MySQL OBORACLE Oracle DRDS OBMYSQL POLARDB-X OBMYSQL Alibaba Cloud ApsaraDB for InnoDB OBKV HBase OBKV POLARDB for Oracle OBORACLE そのうちOBMYSQLはOceanBaseデータベースのMySQL互換モードテナント、OBORACLEはOceanBaseデータベースのOracle互換モードテナントを指します。
以下の表は、現在サポートされているソース側とターゲット側のデータベースの詳細なバージョンを紹介しています。
データベースタイプ データベースバージョン TiDB tidb4
tidb5PostgreSQL pgsql8
pgsql82
pgsql9
pgsql91
pgsql10
pgsql11
pgsql12
pgsql13
pgsql14
pgsql15SYBASE sybase15 DB2 IBM i db2ibmi71 DB2 LUW db2luw970
db2luw1010
db2luw1050
db2luw111
db2luw115MySQL mysql56
mysql57
mysql80Oracle oracle9i
oracle10g
oracle11g
oracle12c
oracle11gr1
oracle11gr2
oracle12cr1
oracle12cr2
oracle18c
oracle19c
oracle21cOBMySQL obmysql14x
obmysql21x
obmysql22x
obmysql200
obmysql211
obmysql2210
obmysql2230
obmysql2250
obmysql2271 ~ obmysql2277
obmysql30x
obmysql31x
obmysql32x
obmysql322
obmysql324
obmysql40
obmysql410
obmysql4102
obmysql420
obmysql421
obmysql424
obmysql425
obmysql4251
obmysql430
obmysql431
obmysql432
obmysql433
obmysql434
obmysql435
obmysql4351
obmysql4352OBOracle oboracle2220
oboracle2230
oboracle2250
oboracle2270 ~ oboracle2277
oboracle21x
oboracle22x
oboracle30x
oboracle31x
oboracle32x
oboracle322
oboracle40
oboracle410
oboracle420
oboracle422
oboracle430
oboracle431
oboracle432POLARDB-X polarx10
polarx20POLARDB-ORACLE 注意
dbcatを実行する際、POLARDB-ORACLEはデータベースバージョン番号以外の必要なパラメータ設定がpgsqlと一致します。
polardb_o8
polardb_o82
polardb_o9
polardb_o91
polardb_o10
polardb_o11
polardb_o12
polardb_o13
polardb_o14
polardb_o15HBase hbase094
hbase1x
hbase2xAlibaba Cloud ApsaraDB for HBase alihbase1x
alihbase2x
実行後の出力ファイルは、ユーザーの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テナントへのデータ移行プロジェクトの作成のデータ型マッピングを参照してください。