白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理

2023-11-21 07:04

本文主要是介绍白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两年前听瀚高的一个朋友说他们要做一个开源数据库项目,基于PostgreSQL,主打与Oracle的兼容性,并且与PG社区版内核同步发布。当时我听了有点不太相信,瀚高的Highgo是在PG内核上增加了一定的Oracle兼容性的特性,一般也会比PG社区版慢上几个版本,如果他们开源这么个数据库产品,会不会影响Highgo的发展。虽然我对瀚高投资开源数据库表示一些担忧,不过IvorySQL社区还是发展起来了,前几天还正式发布了3.0版本,在GITHUB上也获得了630+ STAR,在墨天轮国产数据库热度榜上排名136,排在中游偏上的水平。一个开源产品做到3.0版本,应该算是进入比较良性的阶段了。

图片

在SQL引擎上,IvorySQL采用了一种特殊的双解析器模式,对于Oracle兼容模式和PG兼容模式分别有独立的解析树。大部分国产数据库产品对于Oracle数据库兼容的方法是在语法解析器中增加Oracle兼容的语法,而不是这种方式。IvorySQL这样设计的好处是Oracle兼容解析器的发展与PG解析器的发展是独立的,相互的影响较小。

通过分离解析器还有一些其他的好处,首先解析器的复杂度降低,隔离故障,更不容易出错。另外当PG升级时可以直接使用开源社区的原生解析器,不需要考虑Oracle语法的变化,Oracle语法变化时,也不会影响PG解析器,只需要独立升级就可以了。不过这么做也有一点不好的地方,那就是不能混搭使用PG和ORACLE语法。对于大多数应用场景而言,目前必须融合二者需求的需求并不多。    

在Oracle数据库向IvorySQL迁移之时,IvorySQL的Oracle SQL解析器可以帮助用户降低迁移工作的难度,加快迁移速度。系统今后升级后,系统可以逐步兼容PG语法 ,从而慢慢平移到PG SQL解析器上。IvorySQL通过PL/iSQL插件实现与Oracle PL/SQL过程语言的兼容。PL/iSQL不仅支持存储过程,还支持匿名块等Oracle专用语法。

半个月前,IvorySQL的同学问我有没有兴趣试试他们马上要发布的V3.0版本,据说与2.x版本相比,在与Oracle兼容性方面有了较大的增强。对于测试数据库产品,我向来是比较有兴趣的,更何况是一个与Oracle有相当兼容性的PG数据库产品。

与原生态的 PG相比,IvorySQL的部署还是略微复杂一些的,需要安装一些依赖包。因为对Python的LIB库版本有要求,因此我刚开始在公司实验室已经安装了无数PG类国产数据库的环境中的安装部署没有成功,因为里面冲突的依赖库太多了。因此我就改为在笔记本电脑的wsl 环境中体验了。在一个干净的CentOS7环境中,部署起来还是很顺利的。    

图片

首先yum install -y libicu libxslt python3安装Python3和libicu、libxslt等依赖包。然后就可以安装IvorySQL提供的各种安装包了。

图片

顺次安装ivorysql3-libs-3.0-1.rhel7.x86_64.rpm、ivorysql3-3.0-1.rhel7.x86_64.rpm、 ivorysql3-contrib-3.0-1.rhel7.x86_64.rpm、ivorysql3-server-3.0-1.rhel7.x86_64.rpm,一分钟齐活。对于RPM安装,安装文档中的创建ivorysql用户和用户组是不需要的,实际上安装ivorysql3的时候,这些都已经自动创建了。设置好环境变量后就可以直接初始化数据库了。    

图片

从安装的体验来说,虽然安装包比较多,而且Python3对环境的依赖包有些要求,不过在一个全新的CentOS7环境上安装还是比较丝滑的。接下来我们来初步体验一下IvorySQL的功能。

图片

我们首先来体验一下PG兼容模式,这里我们遇到了一个小BUG,连接IvorySQL数据库默认的数据库是ivorysql,不过当前的IvorySQL 3.0BETA版initdb的时候只创建了postgres数据库,没有创建ivorysql数据库。我想3.0正式版中这个问题应该很容易解决。    

图片

目前IvorySQL支持大多数的Oracle数据类型,不过好像目前还不支持LOB/CLOB之类的大字段。不过我们可以在建表时使用PG存储BLOB的模式来存储LOB字段。

图片

以PG兼容的端口号登录数据库,可以看到IvorySQL对待Oracle兼容模式的数据类型方面,采用的是一种混合策略,如果数据类型与PG完全兼容,则用PG原生的类型,如果类型与PG不完全兼容,则使用新创建的数据类型。

图片

我们再来看看在PG兼容模式下创建的表。

图片

在Oracle兼容模式下我们来看看刚才这张表是如何表示的。

图片

PG与Oracle在数据类型方面存在一定的差异,因此要拉平两种模式的数据类型,还是需要一个比较适当的策略的,并不是直接做成兼容就可以的,因为精度和访问特点还是有很大的差异的,在双模式下,如果强行拉平可能会引入很多BUG,我猜测这可能是当前IvorySQL采用此种策略的原因。当前的策略可以接受,不过是不是还可以做得更好一些呢?希望随着新版本的出现,这方面会给我们更多的惊喜。

下面我们测试下在PG兼容模式下是否具有Oracle兼容性支持的特性。用5432端口登录IvorySQL后,执行一些Oracle特有的匿名块和查询sysdate等操作。

图片

从上面的结果可以看出,标准的PG兼容端口登录数据库的时候,是不支持Oracle语法的。

图片

可以看出当前这个数据库的兼容模式是pg模式,数据库模式是oracle模式,说明当前的数据库是可以使用Oracle兼容模式去访问的。IvorySQL的database_mode有Oracle、PG两种数据库模式。PG数据库模式不能使用Oracle兼容模式访问,而oracle数据库模式可以通过PG或者Oracle兼容模式访问。Oracle兼容模式的端口是1521。    

图片

IvorySQL在原有PG的配置文件的基础上,新增了一个ivorysql.conf配置文件。这个文件中可以配置Oracle兼容模式的端口以及一些兼容性的配置。shared_preload_libraries = 'liboracle_parser, ivorysql_ora',从这一行配置中,我们可以看出liboracle_parser和ivorysql_ora是实现Oracle兼容性的关键组件,其代码在src/backend/oracle_parser目录下。

图片

通过Oracle 兼容模式的1521端口登录数据库,可以看到兼容模式已经是Oracle了。下面我们来看看Oracle兼容模式和Oracle到底兼容到什么程度。似乎sysdate,dual等Oracle语法都不报错了。连设置nls_date_format都不报错,不过似乎没有起作用。    

图片

不过从Ivy_guc.c里是能看到Oracle的这个参数的,难道是遇到BUG了吗。后来仔细一想,原来是许久没有怎么好好用Oracle,都有些忘记了。修改会话的NLS参数使用alert session不能用alter system。

图片

这回对了,而且连时间计算与Oracle的兼容性也很不错。

图片

在内置数据类型与内置函数方面,IvorySQL的支持还是不错的,大部分应用中比较常用的语法和函数都支持了。    

图片

在SEQUENCE兼容性测试上我遇到了一个小问题,创建语法是可以兼容的,不过使用的时候目前还不支持Oracle的Nextval语法,用PG的nextval函数是可以正常使用SEQUENCE的。经过与IvorySQL的同学交流也确认了这方面的兼容还没有正式开放出来,希望今后IvorySQL能在后续版本中提供支持,毕竟Sequence也是应用中最常用的 功能。    

图片

图片

因为兼容性问题,我不得不对存储过程做一些针对PG语法的修改。修改后一个类似Oracle存储过程的PL/iSQL存储过程按照预想的跑了起来。因为兼容性问题,我只能通过  select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') into v from dual ;给v赋值,而不能像Oracle的PL/SQL那样直接写v:= to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss')。经过和IvorySQL的同学沟通,目前PL语法方面还在继续改进,目前还不支持直接使用SQL中的内置函数。    

图片

对于PL/SQL兼容方面,这回IvorySQL把匿名块的语法也同时安排上了。匿名块在Oracle应用里还是有着广泛的应用的,我们的D-SMART在做数据库指标采集的时候,对于支持匿名块的数据库,优先使用匿名块的方式,这样可以减少RDBMS SERVER与客户端的网络交互,提高应用的效率。

这两天初步体验了一下IvorySQL,比起原生态的PG来,IvorySQL在Oracle的兼容性方面还是可圈可点的。目前的国产开源数据库产品也有不少了,不过提供对Oracle支持的还是比较少。大部分国产数据库企业都把与Oracle兼容的特性都放置到了商用版之中。IvorySQL在这方面还是诚意满满的,希望随着版本的迭代,瀚高会将越来越多的Oracle 兼容特性开放到IvorySQL中。IvorySQL作为一款与PG社区版同步较快的与Oracle保持比较好语法兼容性的开源数据库产品,对于一些想使用开源数据库来完成替代Oracle的用户来说,还是很值得拥有的。

如果对IvorySQL感兴趣,可以参考下面网址:

IvorySQL官网:https://www.ivorysql.org/zh-cn/

GITHUB        :https://github.com/IvorySQL/IvorySQL

GITEE           :IvorySQL (IvorySQL) - Gitee.com

这篇关于白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400657

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、