手把手教你实现 OceanBase 数据到 Apache Doris 的便捷迁移|实用指南

作者|SelectDB 技术团队

作为广受认可的分布式数据库,OceanBase 已在众多企业关键业务系统中得到广泛应用。在 Apache Doris 社区,有众多用户选择基于 OceanBase 与 Apache Doris 以构建强大的数据处理与分析链路,本文将详细介绍如何便捷高效将数据从 OceanBase 迁移/同步至 Apache Doris 。

实用指南

00 环境准备

使用 Docker 启动 Oceanbase 服务,OceanBase Docker 环境搭建可参考 Oceanbase 文档 - 使用 Docker 部署 OceanBase 数据库

docker run -p 2881:2881 --name oceanbase -e MINI_MODE=1 -d oceanbase/oceanbase-ce:4.0.0.0

在 OceanBase 中创建表并增加数据

[root@VM-10-6-centos ~]$ mysql -h127.0.0.1 -P2881 -urootmysql> CREATE DATABASE ob;                                                                                                                                 
Query OK, 1 row affected (0.01 sec)mysql> use ob;                                                                                                                                             
Database changed  mysql> CREATE TABLE student (                                                                                                                              -> id int,                                                                                                                                     -> name varchar(256),                                                                                                                              -> age int,                                                                                                                                    -> primary key (id)                                                                                                                                  -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec)mysql> insert into student values(1, 'zhangsan01', 18),                                                                                                    ->                           (2, 'zhangsan02', 23),                                                                                                    ->                           (3, 'zhangsan03', 30),                                                                                                    ->                           (4, 'zhangsan04', 35),                                                                                                    ->                           (5, 'zhangsan05', 40);                                                                                                    
Query OK, 5 rows affected (0.01 sec)                                                                                                                       
Records: 5  Duplicates: 0  Warnings: 0  

在 Doris 中创建表

[root@VM-10-6-centos ~]$ mysql -h127.0.0.1 -P9030 -uroot -pmysql> CREATE TABLE `student` (                                                                                                                            ->    id int,                                                                                                                                          ->   `name` varchar(256),->   `age` int                                                                                                                              -> ) ENGINE=OLAP                                                                                                                                       -> UNIQUE KEY(`id`)                                                                                                                                    -> COMMENT 'OLAP'                                                                                                                                      -> DISTRIBUTED BY HASH(`id`) BUCKETS 1                                                                                                                 -> PROPERTIES (                                                                                                                                        -> "replication_allocation" = "tag.location.default: 1"                                                                                                -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec) 

01 使用 DataX 同步

DataX 是阿里云 DataWorks 数据集成的开源版本,它提供了 OceanBaseReader 和 DorisWriter 两个组件,可以便捷的将 OceanBase 中数据迁移到 Doris 中来。具体使用步骤为:

1. 下载 DataX

2. 编写 DataX 配置文件

{                                                                                                                                                          "job": {                                                                                                                                               "setting": {                                                                                                                                       "speed": {                                                                                                                                     "channel": 1                                                                                                                               }                                                                                                                                              },                                                                                                                                                 "content": [                                                                                                                                       {                                                                                                                                              "reader": {                                                                                                                                "name": "oceanbasev10reader",                                                                                                          "parameter": {                                                                                                                         "username": "root",                                                                                                                "password": "123456",                                                                                                              "column": ["*"],                                                                                                                   "connection": [                                                                                                                    {                                                                                                                              "table": ["student"],                                                                                                   "jdbcUrl": ["jdbc:oceanbase://127.0.0.1:2881/ob"]                                                                       }                                                                                                                              ]                                                                                                                                  }                                                                                                                                      },                                                                                                                                         "writer": {                                                                                                                                "name": "doriswriter",                                                                                                                 "parameter": {                                                                                                                         "loadUrl": ["127.0.0.1:28737"],                                                                                                   "loadProps": {                                                                                                                     },                                                                                                                                 "column": ["*"],                                                                                                                   "username": "root",                                                                                                                "password": "",                                                                                                                    "postSql": [],                                                                                                                     "preSql": [],                                                                                                                      "flushInterval":10000,                                                                                                             "connection": [                                                                                                                    {                                                                                                                                "jdbcUrl": "jdbc:mysql://127.0.0.1:29737/test",                                                                               "selectedDatabase": "test",                                                                                                    "table": ["student"]                                                                                                     }                                                                                                                                ],                                                                                                                                 "loadProps": {                                                                                                                     "format": "json",                                                                                                              "strip_outer_array": true                                                                                                      }                                                                                                                                  }                                                                                                                                      }                                                                                                                                          }                                                                                                                                              ]                                                                                                                                                  }                                                                                                                                                      
}        

更多配置可参考 Oceanbasev10reader 和 DorisWriter。

3. 执行 DataX 脚本

python2 bin/datax.py oceanbase2doris.json

执行 DataX 脚本.png

4. 完成数据同步,Doris 中数据为:

mysql> select * from student;                                                                                                                              
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.02 sec) 

02 使用 Catalog 同步

使用 Apache Doris 所支持的 Catalog 功能,可将 Oceanbase 中的数据表映射到 Doris,并通过 Insert 的方式将数据同步到 Doris 中。

下载 OceanBase 驱动包到 FE 和 BE 的 jdbc_drivers 目录下,并依次执行下方代码中操作:

-- 创建catalog
CREATE CATALOG jdbc_oceanbase PROPERTIES ("type"="jdbc","user"="root","password"="123456","jdbc_url" = "jdbc:oceanbase://127.0.0.1:2881/ob","driver_url" = "oceanbase-client-2.4.2.jar","driver_class" = "com.oceanbase.jdbc.Driver"
)-- 在doris中查询oceanbase的表
mysql> select * from jdbc_oceanbase.ob.student;                                                                                                            
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.02 sec)mysql> CREATE TABLE internal.test.student                                                                                                                  -> PROPERTIES("replication_num" = "1")                                                                                                                 -> AS SELECT * FROM jdbc_oceanbase.ob.student;                                                                                                         
Query OK, 5 rows affected (0.07 sec)                                                                                                                       
{'label':'label_139f7d7f13ba491b_85038d67c9e3ae32', 'status':'VISIBLE', 'txnId':'12014'}mysql> select * from internal.test.student;                                                                                                                
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.03 sec) 

03 使用 Flink CDC 同步

Flink CDC 提供了 OceanBase CDC 连接器,允许从 OceanBase 中读取快照数据和增量数据。具体操作步骤如下:

1. 准备环境

启动 OceanBase 和 OBLogProxy

docker pull oceanbase/oceanbase-ce:4.0.0.0
docker run --name oceanbase --network=host -e MINI_MODE=1 -d oceanbase/oceanbase-ce:4.0.0.0docker pull whhe/oblogproxy:1.1.0_4x
docker run --network=host --name oceanbase_proxy -e OB_SYS_USERNAME=root -e OB_SYS_PASSWORD=123456 -d whhe/oblogproxy:1.1.0_4x

2. 设置密码

在 OceanBase 中,默认情况下 Root 用户是没有密码的。而 OBLogProxy 要求配置非空密码的系统租户用户,因此需要先为 root@sys 用户设置一个密码。

-- 登陆root用户的sys租户,
mysql -h127.0.0.1 -P2881 -uroot@sys -- 设置密码为上面的OB_SYS_PASSWORD
MySQL [(none)]> ALTER USER root IDENTIFIED BY '123456';                                                                                                    
Query OK, 0 rows affected (0.02 sec)    -- 进入root用户的test租户,单独设置密码test
mysql -h127.0.0.1 -P2881 -uroot@test 
MySQL [(none)]> ALTER USER root IDENTIFIED BY 'test';
Query OK, 0 rows affected (0.02 sec)-- 创建数据库表和数据
mysql> CREATE DATABASE ob;
mysql> USE ob;
mysql> CREATE TABLE student (                                                                                                                              -> id int,                                                                                                                                     -> name varchar(256),                                                                                                                              -> age int,                                                                                                                                    -> primary key (id)                                                                                                                                  -> );                                                                                                                                                  
Query OK, 0 rows affected (0.06 sec)mysql> insert into student values(1, 'zhangsan01', 18),                                                                                                    ->                           (2, 'zhangsan02', 23),                                                                                                    ->                           (3, 'zhangsan03', 30),                                                                                                    ->                           (4, 'zhangsan04', 35),                                                                                                    ->                           (5, 'zhangsan05', 40);                                                                                                    
Query OK, 5 rows affected (0.01 sec)                                                                                                                       
Records: 5  Duplicates: 0  Warnings: 0  

3. Flink 环境配置

将 OceanBase CDC 的 jar 包和 Doris Connector 放在 FLINK_HOME/lib 目录下,并重启 Flink 集群。

4. 执行 Flink SQL 任务

SET 'execution.checkpointing.interval' = '3s';CREATE TABLE student (id INT,name STRING,age INT,PRIMARY KEY (id) NOT ENFORCED) WITH ('connector' = 'oceanbase-cdc','scan.startup.mode' = 'initial','username' = 'root@test','password' = 'test','tenant-name' = 'test','database-name' = 'ob','table-name' = 'student','hostname' = 'localhost','port' = '2881','rootserver-list' = '127.0.0.1:2882:2881','logproxy.host' = 'localhost','logproxy.port' = '2983','working-mode' = 'memory');CREATE TABLE doris_sink (id INT,name STRING,age INT
)
WITH (
'connector' = 'doris',
'fenodes' = '10.16.10.6:28737',
'table.identifier' = 'test.student',
'username' = 'root',
'password' = ''
);INSERT into doris_sink select * from student;

提交任务后,可以在 Doris 中查询到已同步的全量数据

mysql> select * from  student;                                                                                                                             
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
+------+------------+------+                                                                                                                               
5 rows in set (0.01 sec)  

接着,在 OceanBase 中模拟新增数据

MySQL [ob]> insert into student values(6, 'zhangsan06', 48)                                                                                                -> ;                                                                                                                                                   
Query OK, 1 row affected (0.13 sec)  

提交任务后,可在 Doris 中查询已同步的新增数据

mysql> select * from  student;                                                                                                                             
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    6 | zhangsan06 |   48 |                                                                                                                               
+------+------------+------+                                                                                                                               
6 rows in set (0.02 sec) 

注:支持 OceanBase3.x 和 4.x 的版本,需要注意 OBLogProxy 与 OceanBase 的版本匹配关系,具体可参考 GitHub Release

04 使用 Outfile 导出

还可以使用 Oceanbase 的 Outfile 功能,将数据导出到本地或 OSS,并基于 Doris 的Stream Load/S3 Load 能力将数据导入到 Doris 中。这里以本地文件为例:

MySQL [ob]> select * from student;                                                                                                                         
+----+------------+------+                                                                                                                                 
| id | name       | age  |                                                                                                                                 
+----+------------+------+                                                                                                                                 
|  1 | zhangsan01 |   18 |                                                                                                                                 
|  2 | zhangsan02 |   23 |                                                                                                                                 
|  3 | zhangsan03 |   30 |                                                                                                                                 
|  4 | zhangsan04 |   35 |                                                                                                                                 
|  5 | zhangsan05 |   40 |                                                                                                                                 
|  6 | zhangsan06 |   48 |                                                                                                                                 
+----+------------+------+                                                                                                                                 
6 rows in set (0.00 sec)   MySQL [ob]> SELECT id,name,age INTO OUTFILE '/home/student.csv' FIELDS TERMINATED BY ','LINES TERMINATED BY '\n' FROM student;
Query OK, 3 rows affected (0.01 sec)#cat student.csv
1,zhangsan01,18
2,zhangsan02,23
3,zhangsan03,30
4,zhangsan04,35
5,zhangsan05,40
6,zhangsan06,48

在 Doris 中执行 Stream Load,将本地文件导入到 Doris 中

curl  --location-trusted -u root:  -H "column_separator:," -T student.csv http://127.0.0.1:28737/api/test/student/_stream_load

导入完成后,可在 Doris 中查询到已导入的数据

mysql> select * from student;                                                                                                                              
+------+------------+------+                                                                                                                               
| id   | name       | age  |                                                                                                                               
+------+------------+------+                                                                                                                               
|    1 | zhangsan01 |   18 |                                                                                                                               
|    2 | zhangsan02 |   23 |                                                                                                                               
|    3 | zhangsan03 |   30 |                                                                                                                               
|    4 | zhangsan04 |   35 |                                                                                                                               
|    5 | zhangsan05 |   40 |                                                                                                                               
|    6 | zhangsan06 |   48 |                                                                                                                               
+------+------------+------+                                                                                                                               
6 rows in set (0.05 sec)    

数据类型映射

OceanBase 数据库能够在同一系统中支持 MySQL 和 Oracle 两种模式,因此 Apache Doris 类型映射也与 MySQL 和 Oracle 相同。这意味着 OceanBase 在与 Apache Doris 建立映射关系时,可以对照下方表格来定义表和列进行创建,以顺利执行数据迁移/同步操作。

01 MySQL 模式类型映射

MySQL 模式类型映射.png

详细可参考:JDBC Catalog - MySQL 文档

02 Oracle 模式类型映射

Oracle 模式类型映射.png

详细可参考:JDBC Catalog - Oracle 文档

总结语

本文介绍了多种 OceanBase 数据同步 Doris 的方式,可满足不同场景的同步需求。如需进行离线数据的同步,可以选择 DataX/Catalog/Outfile 方式;如需进行实时数据的同步,可直接选择 Flink CDC 方式。此外,无论是全量数据还是增量数据同步,均可通过 Flink CDC 这一方式完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java反序列化-CC3链

前言 前面的CC1与CC6链都是通过 Runtime.exec() 进行命令执行的。当服务器的代码将 Runtime放入黑名单的时候就不能使用了。 CC3链的好处是通过动态加载类的机制实现恶意类代码执行。 版本限制 jdk8u65Commons-Collections 3.2.1 动态类加载 loadClass -> 负责加载load…

38. UE5 RPG 修改火球术的攻击方向以及按住Shift攻击

在前面,我们实现了火球术火球的制作,能够在释放火球术时,角色将播放释放技能动画,并实现了对火球的目标的服务器同步功能。 我们先回忆一下之前完成的内容。 在前面,我们先做了一个Actor,用于承载发射的火…

集成学习-Bagging与随机森林回归

reg_fRFR() reg_tDTR()#实例化决策树 cvKFold(n_splits5,shuffleTrue,random_state1412)#实例化验证方式 result_tcross_validate(reg_t#要进行交叉验证的评估器,X,y,cvcv,scoringneg_mean_squared_error#评估指标,return_train_scoreTrue#是否返回训练分数,后面这几…

Git 原理及使用 (带动图演示)

文章目录 🌈 Ⅰ Git 安装🌙 01. Linux - centos 🌈 Ⅱ Git 工作区、暂存区和版本库🌙 01. 认识工作区、暂存区和版本库🌙 02. 使用 Git 管理工作区的文件 🌈 Ⅲ Git 基本操作🌙 01. 创建本地仓库…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式:doGet和doPost doGet&doPost 返回数据就是httpResponse,返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题,就会…

SpringBoot+layuimini实现左侧菜单动态展示

layuimini左侧菜单动态显示 首先我们看一下layuimini的原有菜单显示格式 {"homeInfo": {"title": "首页","href": "page/welcome-2.html?t2"},"logoInfo": {"title": "LAYUI MINI","…

cv2技术原理-图像旋转原理及手动实现

cv2技术原理-图像旋转原理及手动实现 1、图像旋转opencv实现2、cv2.getRotationMatrix2D函数解释3、数学原理推导旋转矩阵M4、手动计算旋转矩阵M5、旋转矩阵M的使用6、使用旋转矩阵M手动实现旋转功能 1、图像旋转opencv实现 图像旋转在对数据集数据增强(主要是随机…

Java语言——封装

一.封装的定义 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问…

linux|将用户加入白名单

一 用root用户找到etc\sudoers文件 cd etc 二 修改etc\sudoers 文件的权限 默认是只读的 修改为可写的 chmod uw sudoers 三 打开 sudoers文件,在Allow root to run any commands anywhere 后面 添加一条(把上面的一条内容复制下来 修改用户名即…

什么是程控电源?以及程控电源的工作原理与应用。

一、程控电源的简介: 程控电源是一种具有编程功能的电源设备,它可以通过外部控制来设定输出电压、电流的稳压、稳流或稳压/稳流模式,因此可以进行电压、电流、相位、频率、功率等参数的试验和检定。一些具体的产品特性包括微机控制、高精度、…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数(运算数)、运算符(操作符)、和界线符(括号)三部分组成,在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式(逆波兰…

电商平台数据有哪些?如何进行电商平台数据分析?(内附模板及工具)

在电商日常的贩卖工作中会产生大量的数据,如果你还不知道如何利用这些宝贵的数据指导未来的销售策略、增长销售额的话,就和我一起看下去吧!电商数据采集API接口包含哪些数据? 电商平台数据可以大致分为以下几个组成部分&#xff…

Java中的封装

package day32; ​ public class Person {private String name;private int age; ​public String getName() {return name;} ​public void setName(String name) {this.name name;} ​public int getAge() {return age;} ​public void setAge(int age) {if (age>120 || …

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道,以收集、分析和利用客户数据,优化营销活动,并提高营销效果。 数字资产是一种新型的资产类别,它们以电子数据的形式存在,可…

笔试狂刷--Day3

大家好,我是LvZi,今天带来笔试狂刷--Day3 一.牛牛的快递 1.题目链接:牛牛的快递 2.分析: 简单的模拟 3.代码实现: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner i…

计算机经典黑皮书分享

计算机经典黑皮书是一套计算机科学丛书,其中包含了多本计算机科学领域的经典教材 提供了全面的知识体系:黑皮书涵盖了计算机科学的多个领域,如计算机组成与设计、操作系统、数据库、人工智能等。它们深入浅出地介绍了相关领域的基本概念、原…

HTTP/HTTPS详解

HTTP/HTTPS详解 1. HTTP1.1 HTTP基础知识1.2 HTTP建立和断开连接 2. HTTPS 1. HTTP 1.1 HTTP基础知识 HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用 于从WWW服务器传输超文本到本…

C++学习————第八天(C/C++内存管理)

目录 1、1.C/C内存分布 2、 C语言中动态内存管理方式:malloc/calloc/realloc/free 3、C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4.operator new与operator delete函数 5. new和delete的实现原理 5.1 内置类型 5.2 自定…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理: 当用户移动鼠标的时候 ,创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去,事件管理器 从队列中 取出事件,然后 调用其对应的事件处理函数。 多态机制: &#x…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件,可自动抓取小红书评论数据,并且含二级评论。 小红书的评论接口URL是: https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程: 进而封装成GUI界面软件,如下&…