暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

第一次迁移实践之Oracle迁移到OB for mysql

4161

背景

老新系统是运行在oracle数据库中,新系统建设数据库是oceanbase数据库mysql租户。

从老系统到新系统需要业务数据的迁移,原迁移流程如下:

  1. 使用kettle工具从oracle中抽数到oceanbase中old_xindai库。
  2. 在oceanbase中通过sql语句把old_xindai中的数据转换并插入到new_xindai库中。

此过程在步骤1非常耗时,是因为kettle无法读取oceanbase的分片信息,所以在执行数据抽取落库的过程非常慢。

方案选型

基于此背景,考虑重新选型etl工具,根据ob的帮助文档中选择了两个方案

方案一:

  1. 安装oracle客户端。
  2. 从oracle中卸载文本文件。
  3. 使用obloader把文本文件加载到ob中的old_xindai
  4. 执行sql语句,把数据插入到new_xindai

方案二:

  1. 从oracle中卸载文本文件
  2. 把文本文件加载到mysql临时数据库中(oms社区版不支持oracle到ob for mysql)
  3. 使用oms把mysql中的数据加载到old_xindai
  4. 执行sql语句,把数据插入到new_xindai

方案测试

方案一测试过程中的主要步骤:

  1. 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

  1. 下载社区版obloader-obdumper。
  2. 需要有proxyro用户或者sys租户的root用户。
  3. 执行文本文件导入,按照表导入,字段以|分割,命令如下

./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

方案二测试过程中的主要步骤

  1. 同上
  2. 使用load data把数据加载到mysql
  3. 下载安装docker
  4. 下载安装社区版oms,建议下载最新版本3.3.0, 3.2.2版本需要安装ocp。
  5. 编辑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}

  1. 启动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}

  1. OMS迁移表必须有主键或者唯一索引,mysql源库中用户的权限,OB中迁移用户的权限都要设置正确。

测试结果:

方案一:一个1000多万的表,900M,使用sqluldr2导出的时间是2分钟,使用obloader导入用时47秒

方案二:同样1000多万的表,900M,使用sqluldr2导出的时间是2分钟,使用load data加载到mysql需要4分钟左右。使用oms全量迁移8分钟

结论:

根据以上测试结果和步骤复杂度考虑,而且老系统很多表没有主键和唯一索引,选择主键和唯一索引工作量也比较大,建议选择方案一。

写在最后:

整个过程中安装过oms3.2.2;安装OCP,期间也遇到了不少问题,官网的文档还是非常详细,更重要的是中文!!!,最后也感谢一下 蚂蚁集团的和顺老师,帮忙解决过程中出现的问题。

最后修改时间:2022-06-09 21:19:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论