• 如何使用 DataX 从 PostgreSQL 同步数据到 OceanBase


    在异构数据库之间做数据迁移,对于任何 DBA 来说都是很头疼的一件事。OceanBase 作为一款刚开源不到两年的国产数据库,也会遇到各种各样的问题,OB 官方其实针对企业版提供了 OMS 一站式迁移服务,该服务支持从各种数据源迁移数据到 OB 企业版,但是开源版本支持的功能较少,当前仅支持 MySQL 到 OB 的数据同步。

    本文来分享另外一种解决方案,由于都是集成三方工具,所以并不能达到整库一键复制的目标,如果大家有相应的需求,还需要自行定制。

    本文分享的内容是基于 DataX 数据同步工具做的,数据源选择了一款较为流行的开源数据库 PostgreSQL,理论上来说,采用 DataX,任何能接入的数据源均可以迁移到 OceanBase 社区版。

    前提条件

    在开始主要内容之前,大家需要了解一下前置条件:

    • 预先安装好 PostgreSQL 数据库环境;
    • 预先下载好(或自行编译好)DataX 软件;
    • 预先安装好 OceanBase 数据库环境。

    从 PostgreSQL 迁移到 OceanBase 的过程

    1. 源端构造

    首先我们在源端 PostgreSQL 数据库创建测试表,并在表中插入100条测试数据:

    --创建源端表
    create table pg_tbl_src(id int, name text);
    --插入100条数据
    insert into pg_tbl_src select generate_series(1,100),'name'||generate_series(1,100)::text ;
    --查询一下数据量
    select count(*) from pg_tbl_src;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxA7LTEJ-1661341839132)(./media/trans-to-ob/trans-to-ob-src.png)]

    PostgreSQL 的连接可以采用多种工具,我这里使用了 DBeaver,当然如果您觉得麻烦,可以在安装完 PG 后,直接用 psql 工具连接,我这里 PG 数据库的默认配置如下,后面会用到:

    • IP: 192.168.0.200
    • PORT: 5432
    • User: Chris
    • Password: changeme
    • Database: postgres
    • Schema: public
    • TableName: pg_tbl_src
    • Column: id, name

    2. 目标端准备

    根据源端建表语句,我们需要在目标端 OceanBase 也对应创建一张空表,如下:

    --创建目标端表
    create table ob_tbl_tgt(id int, name varchar(200));
    
    • 1
    • 2

    OB 这边只需要创建对应的表结构即可,我这里仍然采用 DBeaver 进行操作,您也可以采用官方推荐的 ODC。

    OB 这边数据库的默认配置如下:

    • IP: 10.211.55.73
    • PORT: 2883
    • User: root
    • Password: observer
    • Database: test
    • Tenant: sys
    • TableName: ob_tbl_tgt
    • Column: id, name

    3. DataX 同步配置

    这里最重要和麻烦的就是 DataX 配置,DataX 不提供图形化界面,所以我们只能通过编写 json 文件,使用 python 调用执行。

    DataX 提供 OceanBase 的 reader 和 writer,这也给我们做 OB 的数据同步带来了很大的便利,例证如下,可以看到对应的 OB plugin,而无需使用 MySQL 的 jar。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJmIuObR-1661341839133)(./media/trans-to-ob/trans-to-ob-datax1.png)]

    本次同步供参考的 json 文件如下:

    {
        "job": {
            "setting": {
                "speed": {
                    "channel": 4 
                },
                "errorLimit": {
                    "record": 0,
                    "percentage": 0.1
                }
            },
            "content": [
                {
                    "reader": {
                        "name": "postgresqlreader",
                        "parameter": {
                            "username": "chris",
                            "password": "changeme",
                            "column": [
                                "*"
                            ],
                            "connection": [
                                {
                                    "table": [
                                        "pg_tbl_src"
                                    ],
                                    "jdbcUrl": ["jdbc:postgresql://192.168.0.200:5432/postgres"]
                                }
                            ]
                        }
                    },
    
                    "writer": {
                        "name": "oceanbasev10writer",
                        "parameter": {
                            "obWriteMode": "insert",
                            "column": [
                                "*"
                            ],
                            "preSql": [
                                "truncate table ob_tbl_tgt"
                            ],
                            "connection": [
                                {
                                    "jdbcUrl": "jdbc:oceanbase://10.211.55.73:2883/test?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true",
                                    "table": [
                                        "ob_tbl_tgt"
                                    ]
                                }
                            ],
                            "username": "root",
                            "password":"observer",
                            "writerThreadCount":10,
                            "batchSize": 1000,
                            "memstoreThreshold": "0.9"
                        }
                    }
                }
            ]
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    执行完命令后,如果过程没有问题,通常 DataX 会返回一个成功汇总结果,并且我们能从数据库中查询到刚才同步进来的数据。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hl3qBMhV-1661341839134)(./media/trans-to-ob/datax1.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjPAiiEN-1661341839134)(./media/trans-to-ob/datax2.png)]

    总结

    最后总结一下,本文通过一个简单的示例,演示了如何从 PostgreSQL 数据库,使用 DataX 将数据同步到 OceanBase,整体上来看最重要的就是 DataX 配置文件这一步

    采用这种方案的好处是: 可以从各种数据源同步数据到 OB,并且性能也很可观,我还么有做同步性能测试演示,其实 DataX 在数据同步中的效率还是蛮高的。

    坏处也很显然: 全程黑屏界面不友好,另外需要一个个的表进行定义,比较麻烦。当然如果您有开发经验,完全可以通过自行开发实现自动化操作。

    最后的最后,希望我分享的文章对您有用处,欢迎多多关注并讨论。

  • 相关阅读:
    首发:鸿蒙面试真题分享【独此一份】
    计算机网络协议------从入门到深化
    ATF(TF-A)之UBSAN动态代码分析
    【docker错误解决系列】 ‘buildx‘ is not a docker command.
    【组成原理 七 I/O系统】
    计算机毕业设计 SSM消防物资存储系统 物资存储系统 应急物资库智慧存储系统Java Vue MySQL数据库 远程调试 代码讲解
    以mpVue、Taro为代表的小程序开发效率提升工具
    【Java 语言】Java 和基于 Java 的编程基础 d.运算符
    Vue3 企业级优雅实战 - 组件库框架 - 2 初始化 workspace-root
    Linux 调试之strace
  • 原文地址:https://blog.csdn.net/chrisy521/article/details/126511621