背景
老新系统是运行在oracle数据库中,新系统建设数据库是oceanbase数据库mysql租户。
从老系统到新系统需要业务数据的迁移,原迁移流程如下:
- 使用kettle工具从oracle中抽数到oceanbase中old_xindai库。
- 在oceanbase中通过sql语句把old_xindai中的数据转换并插入到new_xindai库中。
此过程在步骤1非常耗时,是因为kettle无法读取oceanbase的分片信息,所以在执行数据抽取落库的过程非常慢。
方案选型
基于此背景,考虑重新选型etl工具,根据ob的帮助文档中选择了两个方案
方案一:
- 安装oracle客户端。
- 从oracle中卸载文本文件。
- 使用obloader把文本文件加载到ob中的old_xindai
- 执行sql语句,把数据插入到new_xindai
方案二:
- 从oracle中卸载文本文件
- 把文本文件加载到mysql临时数据库中(oms社区版不支持oracle到ob for mysql)
- 使用oms把mysql中的数据加载到old_xindai
- 执行sql语句,把数据插入到new_xindai
方案测试
方案一测试过程中的主要步骤:
- oracle使用sqluldr2导出数据需要注意字符集、null值、回车换行,源库是zhs16gbk,ob中字符集是utf8mb4,命令如下
sqluldr2.bin user="credit/password@credit" query=" select /* parallel*/ reportno,rowno,replace(replace(rowname,chr(13),''),chr(10),''),rowsubject,displayorder,rowdimtype,rowattribute,col1value,col2value,col3value,col4value,standardvalue from report_data ' " field="|" file=report_data.txt null="\\n" charset=utf8 safe=yes |
- 下载社区版obloader-obdumper。
- 需要有proxyro用户或者sys租户的root用户。
- 执行文本文件导入,按照表导入,字段以|分割,命令如下
./obloader -h xxx.xxx.xxx.xxx -p 2881 -u xdnew2_user -p oceanbase2021db --sys-user root --sys-password oceanbase2021db -t xdnew2 -d old_xindai --cut --table bill_info --column-splitter '|' -f /soft/bill_info.txt --external-data --truncate-table --log-path /root/ob-loader-dumper/bin/log |
方案二测试过程中的主要步骤
- 同上
- 使用load data把数据加载到mysql
- 下载安装docker
- 下载安装社区版oms,建议下载最新版本3.3.0, 3.2.2版本需要安装ocp。
- 编辑confile.yaml
# oms 社区版部署必填配置 # 您需要提前准备一个 oceanbase 数据库,用于存放 oms 社区版的元信息 oms_meta_host: xxx.xxx.xxx.xxx oms_meta_port: 2881 oms_meta_user: root@oms_ten oms_meta_password: root # 用户可以自定义以下三个数据库的名称,oms 社区版部署时会在元信息库中创建出这三个数据库 drc_rm_db: drc_rm_db drc_cm_db: drc_cm_db drc_cm_heartbeat_db: drc_cm_heartbeat_db # 用于消费 oceanbase 增量的用户 # 当需要从 oceanbase 社区版消费增量日志时,请在 sys 租户下创建用户 # drc user 需要在待迁移的 oceanbase 集群 sys 租户下创建,然后在 oms 社区版 yaml 文件中指定 需要赋予grant select on *.* to oms_drc drc_user: oms_drc drc_password: oms_drc # oms 社区版集群配置 cm_url: http://xxx.xxx.xxx.xxx:8088 cm_location: 22 cm_region: cn-haerbin cm_region_cn: 哈尔滨 cm_is_default: true # cm_nodes 为列表形式,-前需要有两个空格 cm_nodes: - xxx.xxx.xxx.xxx # 时序数据库配置 # 默认值为 false。如果您需要开启指标汇报功能,请设置为 true # tsdb_enabled: false # 当 tsdb_enabled 为 true 时,请取消下述参数的注释并根据实际情况填写 # tsdb_service: 'influxdb' # tsdb_url: '${tsdb_url}' # tsdb_username: ${tsdb_user} # tsdb_password: ${tsdb_password} |
- 启动docker容器
oms_host_ip=xxx.xxx.xxx.xxx container_name=oms_demo image_tag=feature_3.3.0-ce docker run -dit --net host \ -v /root/config.yaml:/home/admin/conf/config.yaml \ -v /data/oms/oms_logs:/home/admin/logs \ -v /data/oms/oms_store:/home/ds/store \ -v /data/oms/oms_run:/home/ds/run \ -e oms_host_ip=${oms_host_ip} \ --privileged=true \ --pids-limit -1 \ --ulimit nproc=65535:65535 \ --name ${container_name} \ reg.docker.alibaba-inc.com/oceanbase/oms:${image_tag} |
- oms迁移表必须有主键或者唯一索引,mysql源库中用户的权限,ob中迁移用户的权限都要设置正确。
测试结果:
方案一:一个1000多万的表,900m,使用sqluldr2导出的时间是2分钟,使用obloader导入用时47秒
方案二:同样1000多万的表,900m,使用sqluldr2导出的时间是2分钟,使用load data加载到mysql需要4分钟左右。使用oms全量迁移8分钟
结论:
根据以上测试结果和步骤复杂度考虑,而且老系统很多表没有主键和唯一索引,选择主键和唯一索引工作量也比较大,建议选择方案一。
写在最后:
整个过程中安装过oms3.2.2;安装ocp,期间也遇到了不少问题,m6米乐安卓版下载官网的文档还是非常详细,更重要的是中文!!!,最后也感谢一下 蚂蚁集团的和顺老师,帮忙解决过程中出现的问题。