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ファイルとレポートファイルは、実行時に生成されます。 |
MySQLデータベースのテーブル構造をエクスポートする
DBCATにはオンライン変換機能があり、これはDCATがソース側のデータベースに直接接続し、データベース内のオブジェクトをエクスポートできることを指します。オブジェクトが非常に多い場合(例えば1万を超える場合)、エクスポートプロセスは少し遅くなる可能性があります。
dbcatのエクスポートコマンドは以下のとおりです:
bin/dbcat convert -H<host> -P<port> -u<user> -p<password> -D <database> --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タイプを除外することを意味します |
ここでは、MySQL V5.7のtestデータベースのすべてのオブジェクトの構造をエクスポートし、それをOceanBaseデータベースのMySQL互換モードテナントV4.0.0に移行する例を示します。
bin/dbcat convert -H 11.161.xxx.xxx -P 3306 -uroot -pxxxxxx -D test --from mysql57 --to obmysql40 --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 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
OceanBaseデータベースのインポート
DBCATでエクスポートされたファイルはSQLファイル形式です。ここではODCのインポート機能を使用して、テーブル構造を一括でOceanBaseデータベースにインポートできます。詳細については、一括エクスポートとインポートを参照してください。
また、source コマンドを使用してSQLファイルのデータをOceanBaseデータベースにインポートすることもできます。例:
obclient [test]> source TABLE-schema.sql
Query OK, 0 rows affected (0.044 sec)
注意
SQLファイルが現在のディレクトリにない場合は、絶対パスを使用する必要があります。
微分結果の検証
例:MySQLとOceanBaseデータベースにおけるテーブル構造の書き方を確認します。
ソースデータベースMySQLのテーブルbmsql_customerの作成SQLを確認します:
MySQL [test]> show create table bmsql_customer \G
*************************** 1. row ***************************
Table: bmsql_customer
Create Table: CREATE TABLE `bmsql_customer` (
`c_w_id` bigint(20) NOT NULL,
`c_d_id` bigint(20) NOT NULL,
`c_id` bigint(20) NOT NULL,
`c_discount` decimal(4,4) DEFAULT NULL,
`c_credit` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_last` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_first` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_credit_lim` decimal(12,2) DEFAULT NULL,
`c_balance` decimal(12,2) DEFAULT NULL,
`c_ytd_payment` decimal(12,2) DEFAULT NULL,
`c_payment_cnt` bigint(20) DEFAULT NULL,
`c_delivery_cnt` bigint(20) DEFAULT NULL,
`c_street_1` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_street_2` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_city` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_state` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_zip` char(9) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_phone` char(16) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_since` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c_middle` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`c_data` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`c_w_id`,`c_d_id`,`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.01 sec)
ターゲットデータベース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 | bigint(20) | YES | | NULL | |
| c_delivery_cnt | bigint(20) | 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 | NO | | CURRENT_TIMESTAMP | ON UPDATE CURRENT_TIMESTAMP |
| c_middle | char(2) | YES | | NULL | |
| c_data | varchar(500) | YES | | NULL | |
+----------------+---------------+------+-----+-------------------+-----------------------------+
21 rows in set (0.004 sec)
比較した結果、両者は一致しています。