象牙数据库 IvorySQL v2.3 特性浅析
引言
第一次接触到 IvorySQL 数据库是在编写 2022年5月中国数据库排行榜 的时候,那时候 IvorySQL 刚上榜,时隔一年多,IvorySQL 的排名已上升不少,更是在最近发布的 2023开源数据库排行 中,跻身三十强。过去一年,IvorySQL 在 Github 上的源码仓库 Star 数,从 90 上升到今天的 560,真的很棒!
象牙数据库 IvorySQL
IvorySQL (Ivory 译为,象牙) 是由瀚高 (Highgo) 发起的基于 PostgreSQL 的衍生开源项目,采用 Apache-2.0 license,100% 兼容原生 PostgreSQL。IvorySQL 导入并增强了 Orafce 扩展插件,以此支持、兼容 Oracle 的诸多特性,如 PACKAGE、数据类型、转换函数等。IvorySQL 增加了 compatible_mode
开关,可以切换 PostgreSQL 和 Oracle 兼容模式。在 Oracle 兼容性方面,IvorySQL 还增加了独有的 PL/iSQL 过程语言,以此来支持 Oracle 的 PL/SQL 语法和 Oracle 风格的 PACKAGES。在即将发布的 IvorySQL v3.0 中,将支持双端口,即端口 5333 用于 IvorySQL 连接,端口 1521 用于 Oracle 模式连接。
2021 年 12 月 15 日,发布了 IvorySQL 的第一个版本。今年 6 月 28 日,发布了 IvorySQL 2.3,下图为目前 IvorySQL 的发布时间线。
IvorySQL 源码编译
IvorySQL v2.3 是基于 PostgreSQL 15.3 开发的,所以 IvorySQL 编译过程大致与 PG 15 类似,前段时间写过一篇 PG 15 源码编译的文章 《【PG15】【番外篇】自定义 Dockerfile 构建 PostgreSQL 15 编译版 Docker 镜像》 ,这里只再强调一下区别,详细过程不再复述。
- 下载 IvorySQL 2.3 的源码包
1 | wget https://github.com/IvorySQL/IvorySQL/archive/refs/tags/Ivory_REL_$PG_VERSION.tar.gz |
- IvorySQL 的默认监听端口为 5333,以区别于 PostgreSQL 的 5432。服务启动后,在日志文件中可看到监听端口,或直接查看 postgres 进程的端口也可以看到 5333。
-
源码包 (
Ivory_REL_2_3.tar.gz
) 和解压后的文件夹 (IvorySQL-Ivory_REL_2_3
) 名称不一致,在编译过程中需要注意一下,希望官方可以将命名统一。(IvorySQL#332 ) -
IvorySQL 编译时,使用命令
make
会将所有 contrib 扩展进行编译,而在 PostgreSQL 中需要使用make world
才可以。 -
IvorySQL 编译时,会默认将扩展插件 orafce 也进行编译,并在 IvorySQL 启动时默认 enable (1.x 是没有问题的,2.x 暂不会自动加载)。(IvorySQL#183 )
IvorySQL 特性
IvorySQL 数据库
IvorySQL 编译后,便可初始化数据库,并启动数据库。
1 | initdb --pgdata=$PGDATA |
启动后,分别查看版本,用户,数据库,模式,扩展,兼容模式信息。
可以看到,IvorySQL 数据库已默认创建超级用户 ivorysql
,并以 template1
为模板创建数据库 ivorysql
。
IvorySQL: 表 pg_catalog.pg_proc
新增字段 proaccess
对比 IvorySQL v2.3 和 PostgreSQL v15.2 可以发现,在 IvorySQL 中,表 pg_catalog.pg_proc
增加了一个字段 proaccess
。
- IvorySQL
- PostgreSQL
IvorySQL: 新增表 pg_catalog.pg_variable
在 IvorySQL 中新增表 pg_catalog.pg_variable
,这在 PostgreSQL 中是没有的。
1 | postgres=# select * from pg_catalog.pg_variable; |
表结构如下:
1 | ivorysql=# \d+ pg_catalog.pg_variable |
IvorySQL: 兼容模式 compatible_mode
IvorySQL 中增加了配置项 compatible_mode
用于选择兼容 PostgreSQL 模式还是 Oracle 模式,默认值为 postgres
,配置方法:
-
在初始化时,
initdb
后接选项-c, --compatible-mode = oracle
,如果不指定,则默认使用postgres
。 -
可以在配置文件中进行修改:
1 | [ivorysql@centos7 data]$ grep mode postgresql.conf |
- 也可以在会话中进行修改:
1 | ivorysql=# set compatible_mode = 'oracle' ; |
IvorySQL: orafce 扩展
前文提到 IvorySQL 通过支持、增强 orafce 扩展从而对 Oracle 进行兼容,但是在 IvorySQL 2.3 中,这个插件并非开箱即用,而是需要手动安装:
1 | ivorysql=# \dx |
至于不能“开箱即用”的原因,则是因为一个 Bug,具体可参考 issue:Initdb -c Oracle failed to load orafce automatically#183
IvorySQL: Oracle 兼容性 – 包 (PACKAGE)
这个特性在文章 IvorySQL功能点介绍–软件包 中已经介绍地很详细了,这里需要强调的是,如果想要使用 PACKAGE,那么首先需要将兼容模式切换到 oracle,并且需要确认已经安装扩展 orafce。
这里借用文中的案例做以演示:
1 | -- create table |
BTW, 创建包时只能使用语法 CREATE [OR REPLACE] PACKAGE
,目前尚不支持 CREATE [IF NOT EXISTS] PACKAGE
语法。
1 | ivorysql=# drop package if exists mybooks; |
IvorySQL: 元命令 \dPKG
上图中已经演示 \dPKG
的用法,这个元命令是 IvorySQL 特有的,用来查看已经创建包的相关信息。
这里还有个小插曲,因为这条命令在官方文档中并无体现,所以翻了下源码,然后就发现了代码注释中的 typo,顺手提了个 PR #331 ,不知是否会顺利 merge。(2023-07-28, PR 已经 merge,IvorySQL 研发响应蛮快 👍)
此外,关于 PACKAGE 的信息也可直接查询表 pg_catalog.pg_package
。
1 | ivorysql=# select * from pg_catalog.pg_package; |
IvorySQL: 全局唯一索引 (Global Unique Index)
IvorySQL 支持在分区表上创建跨分区的唯一性检查,索引创建成功后,在插入或者更改数据时,如果有重复值将报错。可用于对非分区键的其他列做唯一性检查。举例如下:
- PG
可以正常创建分区表,但不支持 global
语法,也无法只对 v
列创建唯一索引,因为它不是分区键。
只能在分区键 d
列创建分区索引 idx_g_u
。所有测试数据均可写入,但可以看到 v
列存在重复值。
- IvorySQL
可以正常创建分区表,以及全局唯一索引 idx_g_u
。
接下来写入测试数据,第一部分正常写入,第二部分报错,提示重复的值违反唯一约束。查询表 tpg
中的数据,发现只有第一部分测试数据写入成功。
注:
在本例中,relkind
表示对象类型,relkind
的三个取值含义分别为:i
表示索引 (index),I
表示分区索引 (partitioned index),g
表示全局索引 (global index)。
1 | ivorysql=# \dt+ pg_class |
期待改进
- Github 上的 Release Notes 展示格式不够友好,建议调整一下,会显得更加专业。
- 最好能够搭建 IvorySQL 自己的 yum 仓库, highgo 上的信息不完全准确。
- IvorySQL 的文档中心亟需迭代更新,建议多增加“特色”功能介绍与演示,期待新版文档站点上线。
The End.
作为国产开源关系型数据库产品,在竞争如此激烈的竞“技”场,IvorySQL 要奋力加油啊!
期待 IvorySQL 3.0 的发布,并期望带来更多“惊喜”的新特性。
REF
- Title: 象牙数据库 IvorySQL v2.3 特性浅析
- Author: 严少安
- Created at: 2023-07-27 20:17:26
- Updated at: 2023-07-27 20:17:26
- Link: https://shawnyan.cn/2023/ivorysql/ivorysql-v2.3-feature/
- License: This work is licensed under CC BY-NC-SA 4.0.