DBCAT 是一款轻量级的命令行工具,可用于提供源数据库到 OceanBase 数据库的 DDL 转换和 Schema
比对等功能。工具文件名为 dbcat-[版本号]-SNAPSHOT.tar.gz
,下载后解压缩即可使用,可执行文件名为 dbcat
。OceanBase 社区版只兼容 MySQL,所以这里只演示 MySQL 表结构转换。
注意
DBCAT 是 OMS 的一个组件,OceanBase 社区版目前没有独立的包。
环境准备
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 文件与报告文件,运行时生成。 |
在线转换
在线转换是指 DBCAT 能直连源端数据库,将数据库中的对象导出。当对象非常多时(如超过 1 万),导出过程可能会有点慢。
您可运行命令 bin/dbcat help convert
查看转换命令帮助。
bin/dbcat convert -H -P
-u -p
-D --from --to --all
bin/dbcat convert -H 127.1 -P 3306 -ur*** -p123456 -D tpccdb --from mysql56 --to obmysql2230 --all
特别说明:
- 目前源端 MySQL 版本只支持 MySQL 5.5/5.6/5.7。
--from
只支持mysql56
和mysql57
。 - 目标端 OceanBase 版本的参数
--to
只支持obmysql2230
和obmysql2250
。即使是 OceanBase 2.2.7 和 OceanBase 3.1 版本,也可以写成obmysql2250
。因为在 MySQL 兼容性方面,这些版本的 MySQL 语法是一样的。
运行后的输出文件在用户 home
目录的 output
下。
$tree ~/output/dbcat-2021-09-19-164533/
/home/qing.meiq/output/dbcat-2021-09-19-164533/
├── tpccdb
│ └── TABLE-schema.sql
└── tpccdb-conversion.html
1 directory, 2 files
示例:查看一个表结构在原生 MySQL 里的书写方式 和 OceanBase 数据库里的书写方式。
MariaDB [tpccdb]> 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)
vim ~/output/dbcat-2021-09-19-164533/tpccdb/TABLE-schema.sql
create table if not exists tpccdb.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),
c_credit char(2),
c_last varchar(16),
c_first varchar(16),
c_credit_lim decimal(12,2),
c_balance decimal(12,2),
c_ytd_payment decimal(12,2),
c_payment_cnt bigint(20),
c_delivery_cnt bigint(20),
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2),
c_zip char(9),
c_phone char(16),
c_since timestamp not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
c_middle char(2),
c_data varchar(500),
primary key (c_w_id, c_d_id, c_id)
)
default
default collate=utf8mb4_unicode_ci;