从 PostgreSQL 升级至 IvorySQL 4.0
本文作者:严少安,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 ~]$ hostnamectl
Static hostname: rl9.shawnyan.cn
Operating System: Rocky Linux 9.5 (Blue Onyx)
Kernel: Linux 5.14.0-503.15.1.el9_5.x86_64
Architecture: 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 M
ivorysql4-contrib x86_64 4.0-1.rhel9 @commandline 4.9 M
ivorysql4-devel x86_64 4.0-1.rhel9 @commandline 6.4 M
ivorysql4-docs x86_64 4.0-1.rhel9 @commandline 1.8 M
ivorysql4-libs x86_64 4.0-1.rhel9 @commandline 1.5 M
ivorysql4-llvmjit x86_64 4.0-1.rhel9 @commandline 11 M
ivorysql4-plperl x86_64 4.0-1.rhel9 @commandline 234 k
ivorysql4-plpython3 x86_64 4.0-1.rhel9 @commandline 266 k
ivorysql4-pltcl x86_64 4.0-1.rhel9 @commandline 121 k
ivorysql4-server x86_64 4.0-1.rhel9 @commandline 24 M
Installing dependencies:
clang-devel x86_64 18.1.8-3.el9 AppStream 3.2 M
clang-tools-extra x86_64 18.1.8-3.el9 AppStream 20 M
libedit-devel x86_64 3.1-38.20210216cvs.el9 AppStream 39 k
llvm-devel x86_64 18.1.8-3.el9 AppStream 3.8 M
llvm-googletest x86_64 18.1.8-3.el9 AppStream 376 k
llvm-static x86_64 18.1.8-3.el9 AppStream 33 M
llvm-test x86_64 18.1.8-3.el9 AppStream 635 k
lz4 x86_64 1.9.3-5.el9 BaseOS 58 k
Transaction 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 ... ok
initdb: 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=# \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
mydb | t | table | postgres
mydb | t_product | table | postgres
mydb | 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=# \l
List of databases
Name | 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/ivorysql
template1 | 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=# \d
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
mydb | t | table | postgres
mydb | t_product | table | postgres
mydb | 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” 添加小助理进群
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版