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版已经在金融、保险、通信、税务、公安、消防、政务等多个行业的核心交易系统上线运行,为众多行业客户提供优质服务。

一文详解TDSQL PG版Oracle兼容性实践的更多相关文章

  1. HTML完全使用详解 PDF扫描版​

    <HTML完全使用详解>根据网页制作的实际特点和目前市场需要,全面系统地介绍了最新的HTML4.01.丰富的实例贯穿全书,能帮助您全面掌握HTML,而且本书所有实例均可直接修改使用,可以提 ...

  2. 【转发】NPAPI开发详解,Windows版

    NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...

  3. 一文详解Hexo+Github小白建站

    作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...

  4. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  5. 问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

    ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创 ...

  6. 1.3w字,一文详解死锁!

    死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...

  7. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  8. 一文详解 WebSocket 网络协议

    WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...

  9. (七)Transformation和action详解-Java&Python版Spark

    Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...

随机推荐

  1. c语言if语句是如何变成汇编代码的?

    1. 要编译的测试代码: int a; int b = 3; int main(void) { if (3) a = 4; else b = 5; } 2. 词法分析 词法分析将c源代码解析成一个个的 ...

  2. HashSet 如何保证元素不重复——hash码

    HashSet 不重复主要add 方法实现,使用 add 方法找到是否存在元素,存在就不添加,不存在就添加.HashSet 主要是基于HashMap 实现的,HashMap 的key就是 HashSe ...

  3. nothing to commit, working tree clean

    本地git提交代码,没有发现有什么啥情况. 本地代码提交不上去

  4. freeswitch APR库哈希表

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. 哈希表在开发中应用的非常广泛,主要场景是对查询效率要求较高的逻辑,是典型的空间换时间的数据结构实现. 大多数 ...

  5. 城市防汛应急管理智慧 Web GIS 可视化平台

    前言 今年第 17 号台风"狮子山"(热带风暴级)登陆海南岛,受"狮子山"影响,海南岛北半部地区出现暴雨到大暴雨.局地特大暴雨.台风带来的强风雨导致海南岛多地树 ...

  6. 力扣 - 剑指 Offer 46. 把数字翻译成字符串

    题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字 ...

  7. NOIp2021 原地退役记

    JS-0013 Day -2 - 2021.11.17 打了场 cmd_blk 出的模拟赛,T2 T3 都是做过的原题(AGC010C & ARC092D),于是直接摆烂交暴力垫底,成功为我的 ...

  8. Codeforces 436E - Cardboard Box(贪心/反悔贪心/数据结构)

    题面传送门 题意: 有 \(n\) 个关卡,第 \(i\) 个关卡玩到 \(1\) 颗星需要花 \(a_i\) 的时间,玩到 \(2\) 颗星需要 \(b_i\) 的时间.(\(a_i<b_i\ ...

  9. Codeforces 983E - NN country(贪心+倍增优化)

    Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...

  10. pycharm两个交互模式