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ファイルとレポートファイルは、実行時に生成されます。 |
Oracleデータベースのテーブル構造をエクスポートする
DBCATにはオンライン変換機能があり、これはDCATがソース側のデータベースに直接接続し、データベース内のオブジェクトをエクスポートできることを指します。オブジェクトが非常に多い場合(例えば1万を超える場合)、エクスポートプロセスは少し遅くなる可能性があります。
dbcatのエクスポートコマンドは以下のとおりです:
bin/dbcat convert -H<host> -P<port> -u<user> -p<******> -D<database> --service-name<service-name> --service-id <service-id> --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 | Y | エクスポートする関数 |
| --procedure | Y | エクスポートするストアドプロシージャ |
| --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型を除外することを意味する |
ここでは、Oracleデータベース12cバージョンのtestデータベース内のすべてのオブジェクトの構造をエクスポートし、それをOceanBaseデータベースのOracle互換モードテナントV4.0.0に移行する例を示します。
bin/dbcat convert -H 100.88.xxx.xxx -P 1521 -uxxx -pxxxxxx -D test --service-name xxx --service-id xxx --from oracle12c --to oboracle40 --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 MySQL 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ファイルが現在のディレクトリにない場合は、絶対パスを使用する必要があります。
微分結果の検証
例:OracleデータベースとOceanBaseデータベースにおけるテーブル構造を比較します。
ソースデータベースであるOracleのテーブルbmsql_customerの構造を確認します:
SQL> desc bmsql_customer;
Name Null? Type
----------------------------------------- -------- ----------------------------
C_W_ID NOT NULL NUMBER(38)
C_D_ID NOT NULL NUMBER(38)
C_ID NOT NULL NUMBER(38)
C_DISCOUNT NUMBER(4,4)
C_CREDIT CHAR(2)
C_LAST VARCHAR2(16)
C_FIRST VARCHAR2(16)
C_CREDIT_LIM NUMBER(12,2)
C_BALANCE NUMBER(12,2)
C_YTD_PAYMENT NUMBER(12,2)
C_PAYMENT_CNT NUMBER(38)
C_DELIVERY_CNT NUMBER(38)
C_STREET_1 VARCHAR2(20)
C_STREET_2 VARCHAR2(20)
C_CITY VARCHAR2(20)
C_STATE CHAR(2)
C_ZIP CHAR(9)
C_PHONE CHAR(16)
C_SINCE TIMESTAMP(6)
C_MIDDLE CHAR(2)
C_DATA VARCHAR2(500)
ターゲットデータベースであるOceanBaseのテーブルbmsql_customerの構造を確認します:
obclient [SYS]> desc bmsql_customer;
+----------------+---------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+----------------+---------------+------+-----+---------+-------+
| C_W_ID | NUMBER(38) | NO | PRI | NULL | NULL |
| C_D_ID | NUMBER(38) | NO | PRI | NULL | NULL |
| C_ID | NUMBER(38) | NO | PRI | NULL | NULL |
| C_DISCOUNT | NUMBER(4,4) | YES | NULL | NULL | NULL |
| C_CREDIT | CHAR(2) | YES | NULL | NULL | NULL |
| C_LAST | VARCHAR2(16) | YES | NULL | NULL | NULL |
| C_FIRST | VARCHAR2(16) | YES | NULL | NULL | NULL |
| C_CREDIT_LIM | NUMBER(12,2) | YES | NULL | NULL | NULL |
| C_BALANCE | NUMBER(12,2) | YES | NULL | NULL | NULL |
| C_YTD_PAYMENT | NUMBER(12,2) | YES | NULL | NULL | NULL |
| C_PAYMENT_CNT | NUMBER(38) | YES | NULL | NULL | NULL |
| C_DELIVERY_CNT | NUMBER(38) | YES | NULL | NULL | NULL |
| C_STREET_1 | VARCHAR2(20) | YES | NULL | NULL | NULL |
| C_STREET_2 | VARCHAR2(20) | YES | NULL | NULL | NULL |
| C_CITY | VARCHAR2(20) | YES | NULL | NULL | NULL |
| C_STATE | CHAR(2) | YES | NULL | NULL | NULL |
| C_ZIP | CHAR(9) | YES | NULL | NULL | NULL |
| C_PHONE | CHAR(16) | YES | NULL | NULL | NULL |
| C_SINCE | TIMESTAMP(6) | YES | NULL | sysdate | NULL |
| C_MIDDLE | CHAR(2) | YES | NULL | NULL | NULL |
| C_DATA | VARCHAR2(500) | YES | NULL | NULL | NULL |
+----------------+---------------+------+-----+---------+-------+
21 rows in set (0.002 sec)
比較した結果、両者は一致しています。