本文作者:颜少安,IvorySQL 贡献者。
本文为授权转载。
2024 年 8 月,我在《PG 12 即将退役,建议升级到 16.4》一文中提到,PostgreSQL 12 版本即将“停运”。而后,2024 年 11 月,PostgreSQL 12.22 发布,这也是 PG 12 最后一个小版本,标志着这个版本的生命周期即将结束。建议升级到更高版本,比如 IvorySQL 4.0。
近期,基于 PostgreSQL 17 的《IvorySQL 4.0 正式发布》,为用户带来了更多新特性和性能提升,并继续增强 Oracle 兼容性。
IvorySQL 项目紧跟 PostgreSQL 的发布节奏,计划每季度发布一个最新内核的小版本。
2025 年发布路线图如下:
- 2025 年第一季度发布 v4.2(PG 内核 17.2),支持多 CPU 架构和操作系统,添加架构设计相关文档。
- 2025 年第二季度发布 v4.3(PG 内核 17.3),Oracle 模式兼容自增列,IvorySQL Operator 内核升级。
- 2025 年第三季度发布 v4.4(PG 内核 17.4),IvorySQL Cloud v4。
- 2025 年第四季度发布 v5.0(PG 内核 18.0),Oracle 模式兼容 rowid。
在未来的版本规划中,IvorySQL 或将支持 MySQL 模式。
本文将详细演示如何在 Rocky Linux 9 系统上安装 IvorySQL 4.0,以及将 PostgreSQL 12.22 中的数据迁移到 IvorySQL 4.0 的步骤和注意事项,为需要完成数据库升级和迁移的用户提供一些参考。
升级方案
在进行数据库升级时,通常有以下两种常见的跨大版本升级方案:
新建数据库
在新环境(包括但不限于主机硬件、操作系统)新建数据库,通过导入导出工具 pg_dumpall
或 ETL/CDC 迁移工具将数据从现有环境迁移到新环境。这种方法的优点是可以在不影响现有业务的情况下进行升级,风险相对较低。缺点是需要额外的硬件和网络资源来搭建新环境。此外,迁移完成后还需要对新环境进行一系列的配置和优化,以确保其能够满足业务需求。
原地升级
在现有环境通过 pg_upgrade
工具进行原地升级,只升级数据库版本,不考虑服务器硬件和操作系统的升级。这种方法的优点是不需要额外的硬件资源,升级过程相对简单。缺点是升级过程中可能会对现有业务造成一定的影响,存在一定的风险。此外,原地升级对数据库版本的兼容性要求较高,如果新旧版本之间的差异较大,可能会出现一些兼容性问题。
在选择升级方案时,可以从这几个角度方面进行考虑和对比:数据库数据量大小,对应用停机时间的影响,新版本数据库是否支持现、新软硬件环境,对人员的技能要求和成本控制。
安装 IvorySQL 4.0
在前文 IvorySQL 4.0 新增支持 Ubuntu 系统中介绍了如何在 Ubuntu 系统安装 IvorySQL 4.0,本小节将演示如何在 Rocky Linux 9 系统安装 IvorySQL 4.0 数据库。
Rocky Linux 是 Red Hat Enterprise Linux 的开源兼容版本,具有良好的稳定性和兼容性。在之前的文章《在 Rocky9 上安装 PostgreSQL15 的五种方法》中介绍过在 Rocky Linux 系统上安装 PostgreSQL 数据库有几种方法,当然这些方法同样适用于 IvorySQL。在安装 IvorySQL 之前,需要确认操作系统的版本和内核版本,确保其满足 IvorySQL 的安装要求。
[shawnyan@rl9 ~]$ hostnamectlStatic hostname: rl9.shawnyan.cn
Operating System: Rocky Linux 9.5 (Blue Onyx)Kernel: Linux 5.14.0-503.15.1.el9_5.x86_64Architecture: x86-64
[shawnyan@rl9 ~]$
IvorySQL 数据库的本地安装方式通常包括:YUM/DNF 源安装、RPM 安装、源码安装、Docker 安装。
接下来以 RPM 安装为例,进行演示。
- 下载 RPM 包并上传至服务器。
[shawnyan@rl9 ivorysql4]$ ll -h
total 53M
-rw-r--r-- 1 shawnyan shawnyan 3.1M Jan 9 02:07 ivorysql4-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 4.9M Jan 9 02:07 ivorysql4-contrib-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 6.5M Jan 9 02:07 ivorysql4-devel-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 1.9M Jan 9 02:07 ivorysql4-docs-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 1.5M Jan 9 02:07 ivorysql4-libs-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 11M Jan 9 02:07 ivorysql4-llvmjit-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 235K Jan 9 02:07 ivorysql4-plperl-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 267K Jan 9 02:07 ivorysql4-plpython3-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 121K Jan 9 02:07 ivorysql4-pltcl-4.0-1.rhel9.x86_64.rpm
-rw-r--r-- 1 shawnyan shawnyan 24M Jan 9 02:07 ivorysql4-server-4.0-1.rhel9.x86_64.rpm
- 执行安装。
[shawnyan@rl9 ivorysql4]$ sudo dnf install ./ivorysql4-*
Dependencies resolved.
===========================================================================================Package Arch Version Repository Size
===========================================================================================
Installing:ivorysql4 x86_64 4.0-1.rhel9 @commandline 3.1 Mivorysql4-contrib x86_64 4.0-1.rhel9 @commandline 4.9 Mivorysql4-devel x86_64 4.0-1.rhel9 @commandline 6.4 Mivorysql4-docs x86_64 4.0-1.rhel9 @commandline 1.8 Mivorysql4-libs x86_64 4.0-1.rhel9 @commandline 1.5 Mivorysql4-llvmjit x86_64 4.0-1.rhel9 @commandline 11 Mivorysql4-plperl x86_64 4.0-1.rhel9 @commandline 234 kivorysql4-plpython3 x86_64 4.0-1.rhel9 @commandline 266 kivorysql4-pltcl x86_64 4.0-1.rhel9 @commandline 121 kivorysql4-server x86_64 4.0-1.rhel9 @commandline 24 M
Installing dependencies:clang-devel x86_64 18.1.8-3.el9 AppStream 3.2 Mclang-tools-extra x86_64 18.1.8-3.el9 AppStream 20 Mlibedit-devel x86_64 3.1-38.20210216cvs.el9 AppStream 39 kllvm-devel x86_64 18.1.8-3.el9 AppStream 3.8 Mllvm-googletest x86_64 18.1.8-3.el9 AppStream 376 kllvm-static x86_64 18.1.8-3.el9 AppStream 33 Mllvm-test x86_64 18.1.8-3.el9 AppStream 635 klz4 x86_64 1.9.3-5.el9 BaseOS 58 kTransaction Summary
===========================================================================================
Install 18 Packages
...
Complete!
[shawnyan@rl9 ivorysql4]$
- 声明环境变量。
export PGHOME=/usr/local/ivorysql/ivorysql-4
export PGDATA=/var/lib/ivorysql/ivorysql-4/data
export PATH=$PGHOME/bin:$PATH
- 初始化数据目录。
[ivorysql@rl9 ~]$ initdb
The files belonging to this database system will be owned by user "ivorysql".
This user must also own the server process.The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".Data page checksums are disabled.fixing permissions on existing directory /var/lib/ivorysql/ivorysql-4/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... okinitdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.Success. You can now start the database server using:pg_ctl -D /var/lib/ivorysql/ivorysql-4/data -l logfile start[ivorysql@rl9 ~]$
- 启动数据库。
[ivorysql@rl9 ~]$ pg_ctl -D /var/lib/ivorysql/ivorysql-4/data -l logfile start
waiting for server to start.... done
server started
- 查验数据库版本。
[ivorysql@rl9 ~]$ psql -c 'select version()'version
-------------------------------------------------------------------------------------------------------------------------PostgreSQL 17.0 (IvorySQL 4.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3), 64-bit
(1 row)
到此,IvorySQL 4.0 数据库安装成功。
从 PostgreSQL 升级到 IvorySQL
备份全库
IvorySQL 的控制信息与 PostgreSQL 有所区别,目前无法使用 pg_upgrade
直接从 PostgreSQL 升级到 IvorySQL。
[ivorysql@rl9 ~]$ pg_controldata | tail -n2
database mode: 1
case conversion mode: 1
我们可以通过 pg_dumpall
工具将数据从 PostgreSQL 导出,并导入到 IvorySQL,以此完成数据库升级任务。
备份前再次确认 PG 数据库中的表、数据。
[postgres@rl9 ~]$ psql -d shawnyan
psql (12.22)
Type "help" for help.shawnyan=# \dList of relationsSchema | Name | Type | Owner
--------+------------+-------+----------mydb | t | table | postgresmydb | t_product | table | postgresmydb | t_wishlist | table | postgres
(3 rows)shawnyan=# select count(*) from t;count
-------1
(1 row)shawnyan=# select count(*) from t_product;count
-------1000
(1 row)shawnyan=# select count(*) from t_wishlist;count
-------3
(1 row)
执行备份。
pg_dumpall -c -f /tmp/pg12.sql
导入新库
直接从 psql 客户端执行恢复。
psql -f /tmp/pg12.sql
连接 IvorySQL 数据库确认数据是否正常导入。
[ivorysql@rl9 ~]$ psql
psql (17.0)
Type "help" for help.ivorysql=# \lList of databasesName | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------ivorysql | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |shawnyan | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |template0 | ivorysql | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/ivorysql +| | | | | | | | ivorysql=CTc/ivorysqltemplate1 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | postgres=CTc/postgres+| | | | | | | | =c/postgres
(5 rows)ivorysql=# \c shawnyan
You are now connected to database "shawnyan" as user "ivorysql".
shawnyan=# set search_path=mydb;
SET
shawnyan=# \dList of relationsSchema | Name | Type | Owner
--------+------------+-------+----------mydb | t | table | postgresmydb | t_product | table | postgresmydb | t_wishlist | table | postgres
(3 rows)
经查验,数据已经成功导入到 IvorySQL 4.0 数据库中,表结构和数据与 PostgreSQL 12.22 中的一致。
总结
本文介绍了从 PostgreSQL 12.22 升级到 IvorySQL 4.0 的主要步骤,包括在 Rocky Linux 9 上安装 IvorySQL 4.0,以及将 PostgreSQL 12.22 中的数据迁移到 IvorySQL 4.0 的过程,通过备份和恢复的方式,可以顺利完成数据库的升级和迁移工作。
在实际生产环境中,升级和迁移数据库是一个非常复杂的过程,需要考虑的因素较多。除了上述步骤外,还需要同步确认数据库高可用组件的升级,扩展插件的升级,监控项的调整,应用程序的连接驱动、安全认证,数据库功能变化和参数变化带来的影响,其他兼容性变更,以及对应用程序可能造成影响的其他因素等等。
升级完成后,还有可能需要重新收集执行计划,重建索引等工作。因此,在进行数据库升级和迁移之前,建议制定详细的升级计划和方案,并进行充分的测试和验证,以确保升级过程的顺利进行和业务的稳定运行。
关于 IvorySQL
lvorySQL 是由瀚高股份主导研发的一款开源的兼容 Oracle 的 PostgreSQL。IvorySQL 与 PostgreSQL 国际社区紧密合作,保持与最新 PG 版本内核同步,为用户提供便捷的升级体验。基于双 Parser 架构设计,100% 与原生 PostgreSQL 兼容,支持丰富的 PostgreSQL 周边工具和扩展,并根据用户需求提供定制化工具。同时,IvorySQL 4.0 提供更全面灵活的 Oracle 兼容功能,具备高度的 SQL 和 PL/SQL 兼容性能够为企业构建更加高效、稳定和灵活的数据库解决方案。
- 公众号:IvorySQL开源数据库社区
- 官网:https://www.ivorysql.org
- GitHub:https://github.com/IvorySQL/IvorySQL
- 社群:Wechat 搜索“ivorysql_official” 添加小助理进群