MariaDB数据源

MariaDB数据源为您提供读取和写入MariaDB的双向通道,本文为您介绍DataWorks的MariaDB数据同步能力支持情况。

支持的MariaDB版本

离线读写

支持MariaDB 5.5.x、MariaDB 10.0.x、MariaDB 10.1.x、MariaDB 10.2.x、MariaDB 10.3.x版本,且离线同步支持读取视图表。

支持的字段类型

各版本MariaDB的全量字段类型请参见MariaDB官方文档。以下以MariaDB 10.3.x为例,为您罗列当前主要字段的支持情况。

字段类型

离线读(MariaDB Reader)

离线写(MariaDB Writer)

TINYINT

支持

支持

SMALLINT

支持

支持

INTEGER

支持

支持

BIGINT

支持

支持

FLOAT

支持

支持

DOUBLE

支持

支持

DECIMAL/NUMBERIC

支持

支持

REAL

不支持

不支持

VARCHAR

支持

支持

JSON

支持

支持

TEXT

支持

支持

MEDIUMTEXT

支持

支持

LONGTEXT

支持

支持

VARBINARY

支持

支持

BINARY

支持

支持

TINYBLOB

支持

支持

MEDIUMBLOB

支持

支持

LONGBLOB

支持

支持

ENUM

支持

支持

SET

支持

支持

BOOLEAN

支持

支持

BIT

支持

支持

DATE

支持

支持

DATETIME

支持

支持

TIMESTAMP

支持

支持

TIME

支持

支持

YEAR

支持

支持

LINESTRING

不支持

不支持

POLYGON

不支持

不支持

MULTIPOINT

不支持

不支持

MULTILINESTRING

不支持

不支持

MULTIPOLYGON

不支持

不支持

GEOMETRYCOLLECTION

不支持

不支持

数据同步前准备:MariaDB环境准备

在DataWorks上进行数据同步前,您需要参考本文提前在MariaDB侧进行数据同步环境准备,以便在DataWorks上进行MariaDB数据同步任务配置与执行时服务正常。以下为您介绍MariaDB同步前的相关环境准备。

准备工作1:确认MariaDB版本

数据集成对MariaDB版本有要求,您可参考上文支持的MariaDB版本章节,查看当前待同步的MariaDB是否符合版本要求。您可以在MariaDB数据库通过如下语句查看当前MariaDB数据库版本。

准备工作2:配置账号权限

建议您提前规划并创建一个专用于DataWorks访问数据源的MariaDB账号,操作如下。

  1. 可选:创建账号。

    操作详情请参见创建MariaDB账号

  2. 配置权限。

    • 在离线读MariaDB数据时,此账号需拥有同步表的读(SELECT)权限。

    • 在离线写MariaDB数据时,此账号需拥有同步表的写(INSERTDELETEUPDATE)权限。

  3. 您可以参考以下命令为账号添加权限,或直接给账号赋予SUPER权限。如下执行语句在实际使用时,请替换'同步账号'上述创建的账号。

    -- CREATE USER '同步账号'@'%' IDENTIFIED BY '密码'; //创建同步账号并设置密码,使其可以通过任意主机登录数据库。%表示任意主机。
    GRANT SELECT, INSERT, DELETE,UPDATE CLIENT ON *.* TO '同步账号'@'%'; //授权同步账号数据库的 SELECT, INSERT, DELETE,UPDATE 权限。

创建数据源

在进行数据同步任务开发时,您需要在DataWorks上创建一个对应的数据源,操作流程请参见创建并管理数据源详细的配置参数解释可在配置界面查看对应参数的文案提示

数据同步任务开发

数据同步任务的配置入口和通用配置流程可参见下文的配置指导。

单表离线同步任务配置指导

附录:MariaDB脚本Demo与参数说明

离线任务脚本配置方式

如果您配置离线任务时使用脚本模式的方式进行配置,您需要按照统一的脚本格式要求,在任务脚本中编写相应的参数,详情请参见通过脚本模式配置离线同步任务,以下为您介绍脚本模式下数据源的参数配置详情。

Reader脚本Demo

{
    "type":"job",
    "version":"2.0",//版本号。
    "steps":[
        {
            "stepType":"mariadb",//插件名。
            "parameter":{
                "column":[//列名。
                    "id"
                ],
                "connection":[
                    {   "querySql":["select a,b from join1 c join join2 d on c.id = d.id;"], //使用字符串的形式,将querySql写在connection中。
                        "datasource":"",//数据源。
                        "table":[//表名,即使只有一张表,也必须以[]的数组形式书写。
                            "xxx"
                        ]
                    }
                ],
                "where":"",//过滤条件。
                "splitPk":"",//切分键。
                "encoding":"UTF-8"//编码格式。
            },
            "name":"Reader",
            "category":"reader"
        },
        {
            "stepType":"stream",
            "parameter":{},
            "name":"Writer",
            "category":"writer"
        }
    ],
    "setting":{
        "errorLimit":{
            "record":"0"//错误记录数。
        },
        "speed":{
            "throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
            "concurrent":1,//作业并发数。
            "mbps":"12"//限流,此处1mbps = 1MB/s。
        }
    },
    "order":{
        "hops":[
            {
                "from":"Reader",
                "to":"Writer"
            }
        ]
    }
}

Reader脚本参数

脚本参数名

描述

是否必选

默认值

datasource

数据源名称,脚本模式支持添加数据源,此配置项填写的内容必须与添加的数据源名称保持一致。

table

选取的需要同步的表名称,一个数据集成任务只能同步数据到一张目标表。

table用于配置范围的高级用法示例如下:

  • 您可以通过配置区间读取分库分表,例如'table_[0-99]'表示读取'table_0''table_1''table_2'直到'table_99'

  • 如果您的表数字后缀的长度一致,例如'table_000''table_001''table_002'直到'table_999',您可以配置为'"table": ["table_00[0-9]", "table_0[10-99]", "table_[100-999]"]'

说明

任务会读取匹配到的所有表,具体读取这些表中column配置项指定的列。如果表不存在,或者读取的列不存在,会导致任务失败。

column

所配置的表中需要同步的列名集合,使用JSON的数组描述字段信息 。默认使用所有列配置,例如[ * ]。

  • 支持列裁剪:列可以挑选部分列进行导出。

  • 支持列换序:列可以不按照表schema信息顺序进行导出。

  • 支持常量配置:您需要按照MariaDB SQL语法格式,例如["id","table","1","'mingya.wmy'","'null'","to_char(a+1)","2.3","true"]

    • id为普通列名。

    • table为包含保留字的列名。

    • 1为整型数字常量。

    • 'mingya.wmy'为字符串常量(注意需要加上一对单引号)。

    • 关于null

  • " "表示空。

  • null表示null。

  • 'null'表示null这个字符串。

    • to_char(a+1)为计算字符串长度函数。

    • 2.3为浮点数。

    • true为布尔值。

  • column必须显示指定同步的列集合,不允许为空。

splitPk

MariaDB Reader进行数据抽取时,如果指定splitPk,表示您希望使用splitPk代表的字段进行数据分片,数据同步因此会启动并发任务进行数据同步,提高数据同步的效能。

  • 推荐splitPk用户使用表主键,因为表主键通常情况下比较均匀,因此切分出来的分片也不容易出现数据热点。

  • 目前splitPk仅支持整型数据切分,不支持字符串、浮点和日期等其他类型 。如果您指定其他非支持类型,忽略splitPk功能,使用单通道进行同步。

  • 如果不填写splitPk,包括不提供splitPk或者splitPk值为空,数据同步视作使用单通道同步该表数据 。

where

筛选条件,在实际业务场景中,往往会选择当天的数据进行同步,将where条件指定为gmt_create>$bizdate

  • where条件可以有效地进行业务增量同步。如果不填写where语句,包括不提供wherekeyvalue,数据同步均视作同步全量数据。

  • 不可以将where条件指定为limit 10,这不符合MariaDB SQL where子句约束。

querySql(高级模式,向导模式不支持此参数的配置)

在部分业务场景中,where配置项不足以描述所筛选的条件,您可以通过该配置型来自定义筛选SQL。配置该项后,数据同步系统会忽略tablescolumnssplitPk配置项,直接使用该项配置的内容对数据进行筛选。

例如,需要进行多表join后同步数据,使用select a,b from table_a join table_b on table_a.id = table_b.id。当您配置querySql时,MariaDB Reader直接忽略table、column、wheresplitPk条件的配置,querySql优先级大于tablecolumnwheresplitPk选项。datasource通过它解析出用户名和密码等信息。

说明

querySql需要区分大小写,例如,写为querysql会不生效。

Writer脚本Demo

{
    "type":"job",
    "version":"2.0",//版本号。
    "steps":[ 
        {
            "stepType":"stream",
            "parameter":{},
            "name":"Reader",
            "category":"reader"
        },
        {
            "stepType":"mariadb",//插件名。
            "parameter":{
                "postSql":[],//导入后的准备语句。
                "datasource":"",//数据源。
                "column":[//列名。
                    "id",
                    "value"
                ],
                "writeMode":"insert",//写入模式,您可以设置为insert、replace或update。
                "batchSize":1024,//一次性批量提交的记录数大小。
                "table":"",//表名。
                "preSql":[ 
                     "delete from XXX;" //导入前的准备语句。
                   ]
            },
            "name":"Writer",
            "category":"writer"
        }
    ],
    "setting":{
        "errorLimit":{//错误记录数。
            "record":"0"
        },
        "speed":{
            "throttle":true,//当throttle值为false时,mbps参数不生效,表示不限流;当throttle值为true时,表示限流。
            "concurrent":1, //作业并发数。
            "mbps":"12"//限流,控制同步的最高速率,防止对上游/下游数据库读取/写入压力过大,此处1mbps = 1MB/s。
        }
    },
    "order":{
        "hops":[
            {
                "from":"Reader",
                "to":"Writer"
            }
        ]
    }
}

Writer脚本参数

脚本参数名

描述

是否必选

默认值

datasource

数据源名称,脚本模式支持添加数据源,此配置项填写的内容必须与添加的数据源名称保持一致。

table

选取的需要同步的表名称。

writeMode

选择导入模式,支持insert into、on duplicate key update和replace into三种方式:

  • insert into:当主键/唯一性索引冲突时会写不进去冲突的行,以脏数据的形式体现。如果您通过脚本模式配置任务,请设置writeMode为insert。

  • on duplicate key update:没有遇到主键/唯一性索引冲突时,与insert into行为一致。冲突时会用新行替换已经指定的字段的语句,写入数据至MariaDB。如果您通过脚本模式配置任务,请设置writeMode为update。

  • replace into:没有遇到主键/唯一性索引冲突时,与insert into行为一致。冲突时会先删除原有行,再插入新行。即新行会替换原有行的所有字段。如果您通过脚本模式配置任务,请设置writeModereplace

insert into

column

目标表需要写入数据的字段,字段之间用英文所逗号分隔,例如"column": ["id", "name", "age"]。如果要依次写入全部列,使用星号(*)表示, 例如"column": ["*"]

preSql

执行数据同步任务之前率先执行的SQL语句。目前向导模式仅允许执行一条SQL语句,脚本模式可以支持多条SQL语句。例如,执行前清空表中的旧数据(truncate table tablename)。

说明

当有多条SQL语句时,不支持事务。

postSql

执行数据同步任务之后执行的SQL语句,目前向导模式仅允许执行一条SQL语句,脚本模式可以支持多条SQL语句。例如,加上某一个时间戳alter table tablename add colname timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

说明

当有多条SQL语句时,不支持事务。

batchSize

一次性批量提交的记录数大小,该值可以极大减少数据同步系统与MariaDB的网络交互次数,并提升整体吞吐量。如果该值设置过大,会导致数据同步运行进程OOM异常。

256

updateColumn

writeMode配置成update时,发生遇到主键/唯一性索引冲突时所更新的字段。字段之间用英文逗号所分隔,例如 "updateColumn":["name", "age"]