乐趣区

关于数据库:一文详解TDSQL-PG版Oracle兼容性实践

TDSQL PG 版分布式关系型数据库,是一款同时面向在线事务交易和 MPP 实时数据分析的高性能 HTAP 数据库系统。面对利用业务产生的不定性数据爆炸需要,不论是高并发交易还是海量实时数据分析,TDSQL PG 版都可能轻松解决。目前 TDSQL PG 版曾经在金融、保险、通信、税务、政务等多个行业的外围交易系统上线运行。

TDSQL PG 版介绍

1. TDSQL PG 版介绍

自 2008 年诞生,TDSQL PG 版已有 13 年的倒退历史,产品全面兼容 PostgreSQL,高度兼容 Oracle 语法,采纳无共享架构,在提供大型数据仓库解决能力的同时还能残缺反对分布式事务。此外,TDSQL PG 版的三权(平安、审计、治理)分立平安体系也充沛满足企业对数据安全的需要。

TDSQL PG 版具备六个方面的产品个性:

1. 拜访接口丰盛。反对 C /C++、jdbc/odbc、python 等各种罕用语言接口。

2. 扩展性良好。反对用户自定义存储过程、函数操作符。

3.MLS 平安爱护能力。应用三权分立平安体系,反对数据通明脱敏加密。

4. 高效 HTAP 能力。反对千万级 TPS 事务处理,全并行散布计算框架可高效实现 OLAP 计算。

5. 弱小数据治理能力。反对高效在线扩缩容、用户无感知数据 rebalance 和冷热数据分级存储,节俭用户老本。

6. 数据库个性丰盛。反对各种窗口剖析函数,高度兼容 Oracle 罕用函数和语法。

TDSQ PG 版的利用场景满足以下业务特色,即:数据量上 OLTP 场景超过 1T 或 OLAP 场景超过 5T;并发连接数超过 2000,峰值业务 100w/s;须要在线程度扩大能力,须要兼顾 OLTP 以及 OLAP 的 HTAP 场景,还须要严格的分布式事务保障。在满足这些业务特色的状况下,TDSQL PG 版将会是适合的抉择。此外,TDSQL PG 版也实用于地理信息系统、实时高并发零碎以及数据库国产化等场景。

语法差别比照

2. 语法差别比照

2.1 数据类型

Oracle 中的许多数据类型都能够与 TDSQL PG 版互相对应。比方 Oracle 中的 number 数据类型,对应到 TDSQL PG 版里,能够用 smallint、integer、bigint、numeric(p,s)等多种数据类型进行类比替换。但受底层存储的影响,smallint、integer、bigint 的算术运算效率比 numberic 高,因而要视业务须要转换成对应的 smallint、integer、bigint,如若无奈转换时才转换成 numeric(p,s)。又例如 Oracle 中的 float 对应 TDSQL PG 版中的 double precision,Oracle 中的 binary_float 对应 TDSQL-PG 中的 real,Oracle 中的 binary_double 对应 TDSQL PG 版中的 double precision 等,这些都是两者可对应的数据类型。

此外 Oracle 中也有局部特有的数据库类型如 rowid,PostgreSQL 中并没有,但 TDSQL PG 版对此做了兼容,增加了这种数据类型。又如 urowid ID 在 Oracle 中是可变长的字符存储,TDSQL PG 版中则能够用 varchar 进行替换。

long、clob、blob 等都是 PostgreSQL 中没有的数据类型。针对这些类型,TDSQL PG 版做了大量兼容。如果用户须要在应用层用 JDBC 进行连贯,JDBC 驱动也须要同步进行兼容革新。Oracle 中的 date 类型也和 PostgreSQL 不同,Oracle 中能够准确到时分秒,而在 PostgreSQL 中只有年月日。为了兼容这一数据类型,TDSQL PG 版在 Oracle 兼容开关关上的状况下底层用户定义时写 Date 类型,但下方会转成 Timestamp(0),能够间接准确到秒级。(Oracle 兼容开关关上就是 Oracle 模式,不关上就是 PG 模式)。

2.2 存储过程语法差别

Oracle 创立存储过程的语法与 PostgreSQL 有很大差别。比方用户在 Oracle 中创立存储过程,如果不须要输出参数、输入参数,则无需括号,但在 PostgreSQL 中则必须写括号,TDSQL PG 版对此进行兼容,业务人员可依据需要抉择写或不写。在函数中,Oracle 是从 is 开始,PostgreSQL 是从 as 开始,TDSQL PG 版两者都反对。PostgreSQL 中,函数存储过程 body 应用 $$ 进行封装,Oracle 则不须要,TDSQL PG 版两者都反对。Oracle 反对“end 存储过程名称”完结,PostgreSQL 则不反对,对此 TDSQL PG 版做了兼容。存储过程中,Oracle 应用“/”来结尾,示意该函数存储过程创立实现,但在 PostgreSQL 中则采纳 language plpgsql,对此 TDSQL PG 版也做了兼容,用户能够用“/”进行结尾。

在变量申明过程中,PostgreSQL 须要指定 Declare 申明一个变量,但 Oracle 不须要,TDSQL PG 版则齐全兼容。存储过程中的输出、输入参数,Oracle 反对 IN、OUT 和 INOUT 三种类型,但 PostgreSQL 不反对 OUT,TDSQL PG 版对此做了兼容,残缺反对 IN、OUT 和 INOUT 三种类型。在调用方面,Oracle 存储过程的调用反对三种模式:call 后加存储过程名称、exec 后加存储过程名称、间接调用存储过程名称,而 PostgreSQL 中只能应用 call 进行调用,TDSQL PG 版对此进行兼容革新,反对三种模式。

2.3 其余兼容性介绍
其余兼容方面,TDSQL PG 版反对 Oracle 特有的 package 及 200 多个 Oracle 罕用的零碎函数。而 Hint、Merge into 语法、connect by 语法、pivot 行转列、unpivot 列转行、分区表 ddl 加强、dual 伪表、rowid、rownum、sysdate、systimestamp,这些在 Oracle 中罕用的语法和函数,TDSQL PG 版都能够兼容。

此外,目前 TDSQL PG 版也反对通过 dblink 去拜访 Oracle 中的数据、select 字段别名不须要 as 润饰、update 别名反对、insert all 语法同时插入多个表、特有的分页查问语法、只读事物中要获取序列等。

传统数据库架构瓶颈

3. Oracle 兼容能力

3.1 分区表能力

TDSQL PG 版反对 range、list、hash、高性能等距离分区,并且能够实现多级分区级联,在分区表的拜访办法上全面兼容 Oracle 语法,除能够间接拜访子表外,还反对带父表关联子表拜访。同时 TDSQL PG 版也反对 update 分区字段的值。以下图为例,0-30 范畴的子表中的 id 分区键的值通过 update 将其改为 50 时,因为 50 大于 30,零碎会主动将批改后的数据退出到 30-60 范畴的子表,而删除 0 -30 范畴子表中的旧数据。TDSQL PG 版还具备分区子表合并拆分能力及新加分区时 default 分区主动挪动的能力。

3.2 分区子表合并 & 拆分

随着工夫的推移,在应用过程中,零碎中的分区会越来越多。为方便管理,很多用户在晚期想将分区进行合并,TDSQL PG 版也像 Oracle 一样提供了分区子表合并的能力。如图中右边所示,通过 merge partitions 202001 和 202001 的分区,造成新的分区,能够无效缩小分区数量,便于管理。

如果常常拜访的热点数据所在分区内数据过多,就容易扫描到很多不必要的数据,这时可将分区进行拆分。如图中左边所示,将热点分区 0 -60 范畴分区 split 拆分,后续拜访热点数据 50 时就只需扫描 30-60 范畴的分区,能够无效缩小数据扫描,进步查问效率。

具体的实现形式为:merge 时数据库底层会新建一个分区,将指定要合并的分区数据全面迁徙,再删除旧的分区。Split 时,数据库底层会创立出新的 2 个分区,将旧分区的数据依照大于 / 小于拆分点进行划分,别离插入不同的新的小分区,再删除旧分区。

3.3 Default 分区数据保护

分区表中个别会有一个默认的 default 子分区,用于存储不属于其余子分区的数据。比方在下图中,2019 年 12 月、2020 年 3 月的数据,都不属于已有的 2020 年 1、2 月的分区,因而这些数据会主动放在 default 子分区中。如果后续用户新创建了 2020 年 3 月的分区,TDSQL PG 版能够像 oracle 一样,主动将属于 2020 年 3 月的数据从 default 子分区迁徙到新分区中,在 default 子分区中就只剩 2019 年 12 月的数据。整个过程中用户齐全无感知,只须要创立分区,TDSQL PG 版外部会主动进行迁徙。TDSQL PG 版底层具体的实现办法:扫描 default 分区表,将满足新分区的数据插入新分区,删除 default 分区表中这些数据。

3.4 存储过程 / 函数扩大语法能力

为全面兼容 oracle,TDSQL PG 版的存储过程和函数在创立调用语法上也进行了适配,除后面提到的函数体不须要 $$ 突围、以 / 结尾、空参数不须要括号等细节外,TDSQL PG 版还反对在任意的 statement 语句、block 代码块前增加 label 标签,再 goto 跳转到指定的标签,而原生 PostgreSQL 只能在循环前加 label。实现形式是将执行指针 cur 被赋值为 label 所在位置,再从 label 所在的地位持续往下执行。

3.5 WITH FUNCTION 语法反对

除了储过程,TDSQL PG 版还对存储函数进行了扩大,比方在函数上增加了对 WITH FUNCTION 语法的反对。以下图为例,select 调用的 add function 函数只在此语句中无效,其余语句有效。如果零碎中曾经有同名函数,这个 select 语句中的 WITH FUNCTION 的优先级会高于其余同名函数。实现形式为:函数编译后不存入 pg_proc,存入 Query 的构造体中,随着 query 的清理而被清理;考察时优先查找 Query 带的 function,没有找到再查 pg_proc。

3.6 PACKAGE

Oracle 中 Package 比拟常见,用户罕用的函数大都存储在 Package 中。目前 TDSQL PG 版也反对 Package,用户能够将自定义的罕用函数封装到 Package 中,应用时指定 Package 来调用对应函数。具体的实现形式是:在创立 package 时后盾会创立一个对应的 schema 和外面的函数(函数内容为空),创立包体的时候指定函数内容时再去 alter function,包里的变量都放在 schema 上面,可参考 PL 实现 PL 中的变量性能。删除时则是先删除包体再删除包。

3.7 ROWID & ROWNUM

ROWID 和 ROWNUM 都是 Oracle 特有的语法,PostgreSQL 并不反对,TDSQL PG 版对此进行兼容革新,反对 ROWID 和 ROWNUM。

两者的区别在于:ROW ID 的兼容实现是在用户建表时,指定该表是 With ROWID。后续查问就能够查问到 ROWID 具体的值,ROWID 相当于惟一标识,在用户写入阶段会从本地 SEQUENCE 获取惟一 ID 值再加上分布式的 nodeid 进行填充,写入到用户数据文件中。ROWNUM 的实现是做完过滤和投影后 CN 返回给用户时增加的一个编号,在用户最初返回阶段进行增加。

3.8 MERGE INTO

Merge into 能够将两个表进行合并。以下图为例,指标是 Merge 到 Test1 中,但参考 Test2 的数据。如果能匹配上,就批改 Test1 里的数据,使数据与 Test2 的记录统一,如果不匹配,就把 Test2 的数据插入到 Test1 中。最终执行的成果相似于 Test1 合并了 Test2,将 Test2 中的数据 Merge 到 Test1 中。在实现过程中,TDSQL PG 版增加了 merge 算子,在 Query 构造体中新增了
int mergeTarget_relation;
List* mergeSourceTargetList;
List mergeActionList; / list of actions for MERGE (only) */

3.9 Start with connect by

语法解析反对 connect by 查问。在解析时通过函数 make connect by stmt 将 select stmt 改写为通过递归 CTE 查问来实现 start with connect by 档次查问子句。后续通过 TDSQL PG 版本身反对的递归 CTE 语句来执行。

3.10 PIVOT & UNPIVOT

Pivot 能够将行数据转列属性。语法:
PIVOT ‘(‘ target_el FOR columnref IN_P ‘(‘ pivot_expr_list ‘)’ ‘)’
TDSQL PG 版实现办法是将不再 target_el 以及 columnref 中的列作为 group by 列,通过 pivot_expr_list 对 target_el 中的汇集函数参数用 case when 进行重写,规定是“有值取值、没值取空”。

UNPivot 能够将列属性转行数据, 实质是转化为 join lateral。实现办法是获取 IN 中的列,拼接成 VALUES(…),将 UNPIVOT column 和 FOR column 拼接成 VALUES 的别名,将查问中 FROM 前面的其余表与 value rte 表做 join lateral。

3.11 其余兼容能力

此外,TDSQL PG 版反对 Oracle 中的日期、工夫、字符串、表达式等罕用函数。目前 TDSQL PG 版能够兼容 98% 以上的运营商、保险行业罕用 Oracle 语法,兼容 85% 以上的银行机构罕用 Oracle 语法,无效升高传统 IT 企业的国产化及信创门槛。

Oracle to TDSQL PG 版迁徙

4.1 迁徙工程面临问题

从 Oracle 到 TDSQL PG 版的迁徙过程会波及到四个问题:一是老本高且工作量大;二是迁徙技术简单;三是兼容水平不明确;四是迁徙过程无标准化流程,突发问题频繁。咱们将上述问题分门别类,逐个进行解决。

针对工作量大的问题,能够通过 TDSQL PG 版提供的繁难自动化迁徙平台,下发一个迁徙工作即可解决;针对迁徙技术简单的问题,咱们会为用户提供业余的技术支持,帮助用户进行迁徙;针对兼容水平不明确的问题,咱们会在迁徙过程中进行评估,生成评估报告来阐明兼容水平;针对迁徙过程无标准化流程的问题,咱们会在每一步都输入相干文档、报告来进行迁徙,促使流程标准化。

4.2 迁徙工具技术架构

TDSQL PG 版迁徙工具的技术架构,分为数据抽取模块和数据装载模块。数据抽取模块会从源库外面抽取,实时导出用户数据。数据装载模块会在指标库里进行实时数据写入,进行数据迁徙。

针对局部语法不能齐全兼容的问题,咱们会进行语法转换,把数据传递到数据装载模块,数据装载模块会间接实时写入到指标库中。迁徙过程中,监控模块会实时监控整个迁徙工作,期间会输入兼容报告,迁徙完后进行数据校验。

4.3 兼容性评估

兼容性评估会输入两个报告:对象兼容报告和利用兼容报告。对象兼容是指数据库的对象,如表、索引、视图、函数或数据类型等信息;利用兼容次要是指前端应用层发送给源端执行的 SQL。咱们会针对这两方面输入兼容报告。

4.4 兼容性评估报告

对象兼容报告,分为三种色彩:蓝色代表齐全兼容,不必做任何革新就能够将 Oracle 中对象在 TDSQL PG 版中进行应用;绿色代表外部转换,针对 Oracle 的应用语法或类型,工具会主动转换成 TDSQL PG 版中适配的语法和类型,从而进行迁徙;红色代表不能转换,齐全不兼容,须要用户人工接入。

4.5 迁徙全流程介绍

整个迁徙流程可分为四个环节。首先是利用开发适配和生产环境筹备。在进行利用开发适配过程中,能够并行地进行生产环境的零碎布局,调验原先的零碎布局。其次是零碎测试环节,将原先在 Oracle 中的存量、增量数据全副迁徙过去进行测试验证,蕴含性能验证和性能验证。

验证完后到双轨制上线环节,相当于老零碎和新零碎同时并行运行。正式上线投产后,再依据用户需要判断是否须要将 TDSQL PG 版中的数据同步到老零碎中。这个过程须要和用户共同完成,图中绿色局部是须要用户配合的局部,蓝色局部则是咱们负责的局部。

4.6 双轨运行计划
下图是咱们的双轨运行计划,图中有两个架构,别离是 Oracle To TDSQL PG 版和 TDSQL PG To Oracle。

业务上线后期,咱们采纳双轨运行,反对从 Oracle 到 TDSQL PG 版以及从 TDSQL PG 版到 Oracle 的数据同步。通过业务开关,用户能够依据需要,抉择将局部业务放在原有零碎或将另一部分业务放在新零碎,也能够抉择全副放在新零碎或老零碎。当双轨运行继续稳固后才会进行正式上线。双轨制运行相当于过渡环节,如果有问题,用户能够升高回退到以前的零碎上,给数据减少了双层爱护。当然,双轨制运行的过程相应地也会更加简单。

TDSQL PG 版起源于技术成熟、功能强大的 PostgreSQL,在此基础上腾讯云数据库结构和发行了性能更丰盛、稳定性更好、兼容性更广、安全性更高、性能更强、扩展性极好的分布式数据库 TDSQL PG 版产品。

腾讯公司对 TDSQL PG 版具备齐全自主知识产权,实现平安可控,具备在中高端市场规模化代替国外数据库的能力,在数据库根底软件层面无力撑持了国家平安可控策略倒退。以后 TDSQL PG 版曾经在金融、保险、通信、税务、公安、消防、政务等多个行业的外围交易系统上线运行,为泛滥行业客户提供优质服务。

退出移动版