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ファイルとレポートファイルは、実行時に生成されます。 |
OceanBaseデータベースのOracleテナントからのテーブル構造のエクスポート
DBCATにはオンライン変換機能があり、これはDCATがソース側のデータベースに直接接続し、データベース内のオブジェクトをエクスポートできることを指します。オブジェクトが非常に多い場合(例えば1万を超える場合)、エクスポートプロセスは少し遅くなる可能性があります。
dbcatのエクスポートコマンドは以下のとおりです:
bin/dbcat convert -H<host> -P<port> -u<user> -p<******> -D <database> --from <from> --to <to> --table '*'
コマンド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タイプを除外することを意味します |
ここでは、OceanBaseデータベースのOracle互換モードテナントV4.0.0のtestのすべてのテーブル構造をエクスポートし、それをOracleデータベース12cバージョンに移行する例を示します。
bin/dbcat convert -H 172.30.xxx.xxx -P 2883 -uroot -pxxxxx -D test --from oboracle40 --to oracle12c --table '*'
特記事項:
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 InfluxDB 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
Oracleデータベースのインポート
DBCATでエクスポートされたファイルはSQLファイル形式であり、Oracleデータベースにインポートする場合は、データベースにアクセスした後に@ファイル名コマンドを使用してSQLファイルをインポートできます。例:
SQL> @TABLE-schema.sql
Query OK, 0 rows affected (0.044 sec)
注意
SQLファイルが現在のディレクトリにない場合は、絶対パスを使用する必要があります。
微分結果の検証
例:OceanBaseデータベースとORACLEデータベースにおけるテーブル構造を確認する。
ソースデータベース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)
ターゲットデータベース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)
比較した結果、一致しています。