PostgreSQL 数据库跨版本升级常用方案解析

大家好,我是只谈技术不剪发的 Tony 老师。对于企业而言,将数据库系统升级到新版本通常可以获得更好的性能、更多的功能、最新的安全补丁和错误修复等。因此,本文就来介绍一下 PostgreSQL 数据库版本升级的 3 种常用方案。

升级方案概述

PostgreSQL 版本号由主要版本和次要版本组成。例如,PostgreSQL 12.4 中的 12 是主要版本,4 是次要版本;PostgreSQL 10.0 之前的版本由 3 个数字组成,例如 9.6.19,其中 9.6 是主要版本,19 是次要版本。

发布次要版本是不会改变内存的存储格式,因此总是和相同的主要版本兼容。例如,PostgreSQL 12.4 和 PostgreSQL 12.0 以及后续的 PostgreSQL 12.x 兼容。对于这些兼容版本的升级非常简单,只需要关闭数据库服务,安装替换二进制的可执行文件,重新启动服务即可。

接下来,我们主要讨论 PostgreSQL 的跨版本升级问题,例如从 PostgreSQL 12.x 升级到 PostgreSQL 13.y。主要版本的升级可能会修改内部数据的存储格式,因此需要执行额外的操作。常用的跨版本升级方法和适用场景如下:

升级方法 适用场景 停机时间
逻辑备份与还原 中小型数据库,例如小于 100 GB
支持跨平台数据迁移
取决于数据库的大小
pg_upgrade 工具 大中型数据库,例如大于 100 GB
本机就地升级
几分钟
逻辑复制 大中型数据库,例如大于 100 GB
跨平台支持
几秒钟

是的

📝如果使用厂商提供的 PostgreSQL 定制版本,也可能通过他们提供的工具实现版本升级,具体参考相关文档。

注意事项:升级主要版本通过会导致用户可见的不兼容性,因此应用程序可能需要进行相应的修改。具体的变化可以参考发行说明,尤其是“Migration”部分的内容;如果跨多个主要版本进行升级,需要阅读每个中间版本的发行说明。

通过逻辑备份与还原进行升级

传统的跨版本升级方法利用 pg_dump/pg_dumpall 逻辑备份导出数据库,然后在新版本中通过 pg_restore 进行还原。导出旧版本数据库时推荐使用新版本的 pg_dump/pg_dumpall 工具,可以利用最新的并行导出和还原功能,同时可以减少数据库膨胀问题。

逻辑备份与还原非常简单但速度比较慢,停机时间取决于数据库的大小,因此适合中小型数据库的升级。

下面我们介绍这种升级方法的具体操作,假如当前 PostgreSQL 软件的安装目录位于 /usr/local/pgsql,同时数据目录位于 /usr/local/pgsql/data,我们在同一台服务器上进行升级。

执行逻辑备份之前停止应用程序,确保没有数据更新,因为备份开始后的更新不会被导出。如有必要,可以修改 /usr/local/pgsql/data/pg_hba.conf 文件禁止其他人访问数据库。

然后备份数据库:

pg_dumpall > outputfile

如果已经安装了新版本的 PostgreSQL,可以使用新版本的 pg_dumpall 命令备份旧版本数据库。

停止旧版本的后台服务:

pg_ctl stop

或者通过其他方式停止后台服务。

如果安装目录没有包含特定版本标识,可以将目录改名,必要时可以再修改回来。可以使用类似以下的命令重命名目录:

mv /usr/local/pgsql /usr/local/pgsql.old

安装新版本 PostgreSQL 软件,假如安装目录仍然是 /usr/local/pgsql。

初始化一个新的数据库集群,需要使用数据库专用用户(通常是 postgres;如果是升级版本,应该已经存在该用户)执行操作:

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

将旧版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改动在对应的新配置文件中再次进行修改。

使用数据库专用用户启动新版本的后台服务:

 /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data

最后,利用新版本的 psql 命令还原数据:

/usr/local/pgsql/bin/psql -d postgres -f outputfile

为了减少停机时间,可以将新版本的 PostgreSQL 安装到另一个目录(例如 /usr/local/pgsql-13),同时使用不同的端口启动服务。然后同时执行数据库的导出和导入:

pg_dumpall -p 5432 | psql -d postgres -p 5433

执行以上操作时,新旧版本的后台服务同时运行,新版本使用 5433 端口,旧版本使用 5432 端口。

利用 pg_upgrade 工具进行升级

pg_upgrade 工具可以支持 PostgreSQL 跨版本的就地升级,不需要执行导出和导入操作。pg_upgrade 可以支持 PostgreSQL 8.4.X 到最新版本的升级,包括快照版本和测试版本。

pg_upgrade 提供了升级前的兼容性检查(-c 或者 --check 选项)功能, 可以发现插件、数据类型不兼容等问题。如果指定了 --link 选项,新版本服务可以直接使用原有的数据库文件而不需要执行复制,通常可以在几分钟内完成升级操作。

下面我们介绍这种升级方法的具体操作,假如当前 PostgreSQL 软件的安装目录位于 /usr/pgsql-12/,同时数据目录位于 /var/lib/pgsql/12/data/,我们将其升级为 PostgreSQL 13。

确定没有客户端访问之后备份数据库,然后停止旧版本的后台服务。例如 CentOS 可以执行以下命令:

sudo systemctl stop postgresql-12
sudo systemctl disable postgresql-12

安装新版本的 PostgreSQL 软件。例如 PostgreSQL 13.0,安装目录位于 /usr/pgsql-13/。

初始化新版本的数据库集群。数据目录设置为 /var/lib/pgsql/13/data/。

如果旧版本中安装了扩展模块,在新版本中也需要安装相应的共享对象文件或者 DLL 文件。但是不要执行CREATE EXTENSION命令,因为会从旧数据库中进行升级。另外,如果使用了任何自定义的全文搜索文件(字典、同义词、词库、停用词),也需要复制到新的数据库集群目录中。

停止新版本的后台服务。例如 CentOS 可以执行以下命令:

sudo systemctl stop postgresql-13

通过 pg_upgrade 执行升级操作,使用数据库专用用户(通常是 postgres)执行以下操作:

/usr/pgsql-13/bin/pg_upgrade \
 --old-datadir /var/lib/pgsql/12/data/ \
 --new-datadir /var/lib/pgsql/13/data/ \
 --old-bindir /usr/pgsql-12/bin/ \
 --new-bindir /usr/pgsql-13/bin/ \
 --check

其中 --check 表示执行升级检查,而不会真的执行升级操作。通过检查之后,可以去掉该参数执行升级:

/usr/pgsql-13/bin/pg_upgrade \
 --old-datadir /var/lib/pgsql/12/data/ \
 --new-datadir /var/lib/pgsql/13/data/ \
 --old-bindir /usr/pgsql-12/bin/ \
 --new-bindir /usr/pgsql-13/bin/ \
 --link

其中 --link 表示将新版本的数据目录硬链接到旧版本的数据目录,而不会复制一份新的数据文件,可以快速进行升级。

将旧版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改动在对应的新配置文件中再次进行修改。

启动新版本的后台服务。例如 CentOS 可以执行以下命令:

sudo systemctl start postgresql-13
sudo systemctl enable postgresql-13

连接服务器查看数据库的版本信息:

SELECT version();
version                        |
-------------------------------------------------------------------------------------------------------|
PostgreSQL 13.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit|

收集统计信息。pg_upgrade 不会生成新版本数据库的统计信息,但是会创建一个脚本文件,执行该文件:

./analyze_new_cluster.sh

如果确认升级成功,可以选择删除或者保留旧的数据库软件和集群。pg_upgrade 同样提供了一个删除旧数据库集群的脚本:

 ./delete_old_cluster.sh

然后可以删除旧版本的 PostgreSQL 软件,例如 CentOS 可以执行以下命令:

yum remove postgresql12*

如果想要回退到旧版本的数据库,可以分为不同的情况:

  • 如果只运行了 --check 选项命令,表示没有真正执行升级,重新启动服务即可;
  • 如果升级时没有使用 --link 选项,旧版本的数据库集群没有任何修改,重新启动服务即可;
  • 如果升级时使用了 --link 选项,数据库文件可能已经被新版本的集群使用:
  1. 如果 pg_upgrade 在链接操作之前终止,旧版本的数据库集群没有任何修改,重新启动服务即可;
  2. 如果没有启动过新版本的后台服务,旧版本的数据库集群没有修改,但是链接过程已经将 $PGDATA/global/pg_control 文件重命名为 $PGDATA/global/pg_control.old;此时需要将该文件名中的 .old 后缀去掉,然后重新启动服务即可;
  3. 如果已经启动了新版本的数据库集群,已经修改了数据库文件,再启动旧版本的服务可能导致数据损坏;此时需要通过备份文件还原旧版本的数据库。

关于 pg_upgrade 的详细使用和升级注意事项,例如流复制结构和日志传输复制结构中备用节点的升级,可以参考官方文档。

使用逻辑复制功能进行升级

PostgreSQL 逻辑复制支持跨版本之间的数据复制,而且支持不同平台之间的复制,因此也可以用于实现版本升级。我们可以安装一个新版本的数据库作为复制的从节点,当数据已经同步时执行一次主从切换,然后关闭旧版本的主节点。主从切换的升级方法通常只需要几秒钟就能完成,利用第三方高可用组件甚至可以实现零停机时间升级。

PostgreSQL 10 开始提供了内置的逻辑复制功能,或者也可以使用 pglogical、Slony、Londiste 以及 Bucardo 等逻辑复杂工具。

关于 PostgreSQL 逻辑复制结构的创建和主从切换,可以参考官方文档

总结

PostgreSQL 小版本升级只需要替换二进制文件即可,跨版本升级的方案主要有 3 种:通过 pg_dump/pg_dumpall 逻辑备份与还原进行升级,利用 pg_upgrade 工具进行升级,使用逻辑复制功能进行升级。了解它们的优缺点和适用场景可以帮助我们选择最佳的升级方式。

到此这篇关于PostgreSQL 数据库跨版本升级常用方案解析的文章就介绍到这了,更多相关PostgreSQL 版本升级内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker环境下升级PostgreSQL的步骤方法详解

    前段时间接到了要升级数据库的需求,在公司大佬的指导下搞定了升级的方案,在此记录一下. 查阅PostgreSQL 官方文档 可以得知,官方提供了两种方式对数据库进行升级--pg_dumpall与pg_upgrade. pg_dumpall是将数据库转储成一个脚本文件,然后在新版数据库中可以直接导入.这种方式操作简单,跟着官方文档就能轻松操作,但是明显只适用于数据量较少的情况,在我的测试环境里,导入一个2g的数据库用了将近10分钟. 所以我这里选用的是 pg_upgrade,这种方式是直接将数据文件

  • PostgreSQL 数据库跨版本升级常用方案解析

    大家好,我是只谈技术不剪发的 Tony 老师.对于企业而言,将数据库系统升级到新版本通常可以获得更好的性能.更多的功能.最新的安全补丁和错误修复等.因此,本文就来介绍一下 PostgreSQL 数据库版本升级的 3 种常用方案. 升级方案概述 PostgreSQL 版本号由主要版本和次要版本组成.例如,PostgreSQL 12.4 中的 12 是主要版本,4 是次要版本:PostgreSQL 10.0 之前的版本由 3 个数字组成,例如 9.6.19,其中 9.6 是主要版本,19 是次要版本

  • Java并发编程数据库与缓存数据一致性方案解析

    目录 一.序言 二.不同的声音 1.操作的先后顺序 2.处理缓存的态度 三.线程并发分析 查询数据 1.非并发环境 2.并发环境 更新数据 1.非并发环境 2.并发环境 依赖环境 四.先数据库后缓存 数据一致性 1.问题描述 2.解决方式 特殊情况 解决方式 五.小结 一.序言 在分布式并发系统中,数据库与缓存数据一致性是一项富有挑战性的技术难点.本文将讨论数据库与缓存数据一致性问题,并提供通用的解决方案. 假设有完善的工业级分布式事务解决方案,那么数据库与缓存数据一致性便迎刃而解,实际上,目前

  • sql脚本函数编写postgresql数据库实现解析

    这篇文章主要介绍了sql脚本函数编写postgresql数据库实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 postgresql创建Long自增函数 CREATE SEQUENCE global_id_sequence; CREATE OR REPLACE FUNCTION seq_id(OUT result bigint) AS $$ DECLARE our_epoch bigint := 1314220021721; seq_id

  • postgresql数据库导出和导入及常用的数据库管理工具

    目录 简介 一.数据库的导出和导入 1. 使用pgAdmin导出和导入数据库 2. 使用Navicate导出和导入数据库 3. 使用DBeaver导出和导入数据库 二.数据库表的导出和导入 1. 使用pgAdmin导出和导入数据表 2. 使用Navicat导出和导入数据表 3. 使用DBeaver导出和导入数据表 总结 简介 本篇文章主要介绍PostgreSQL库和表的导出和导入以及常用的数据库管理工具的使用 一.数据库的导出和导入 1. 使用pgAdmin导出和导入数据库 导出 导入 新建数据

  • 透明化Sharding-JDBC数据库字段加解密方案

    目录 前言 背景 前序 需求场景分析 处理流程详解 整体架构 脱敏规则 脱敏处理过程 解决方案详解 新上线业务 已上线业务改造 系统迁移前 系统迁移中 系统迁移后 中间件脱敏服务优势 适用场景说明 限制条件 加密策略解析 SHARDINGENCRYPTOR SHARDINGQUERYASSISTEDENCRYPTOR 后续 前言 近期,博主公司应安全审计要求,需要对数据库中的用户关键信息做加密处理,这样,即使生产数据被脱裤,也不会泄露用户的敏感信息,在做了初步的需求归纳和功能分析后,我们制定了简

  • Python使用PyGreSQL操作PostgreSQL数据库教程

    PostgreSQL是一款功能强大的开源关系型数据库,本文使用python实现了对开源数据库PostgreSQL的常用操作,其开发过程简介如下: 一.环境信息: 1.操作系统: RedHat Enterprise Linux 4         Windows XP SP2 2.数据库: PostgreSQL8.3 3. 开发工具: Eclipse+Pydev+python2.6+PyGreSQL(提供pg模块) 4.说明: a.PostgreSQL数据库运行于RedHat Linux上,Win

  • MySQL数据库的高可用方案总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法发微博,发微信等.一般而言,衡量高可用做到什么程度可以通过一年内服务不可用时间作为参考,要做到3个9的可用性,一年内只能累计有8个小时不可服务,而如果要做到5个9的可用性,则一年内只能累计5分钟服务中断.所以虽说每个公司都说自己的服务是7*24不间断的,但实际上能做到5个9的屈指可数,甚至根本做不到

  • Postgresql备份和增量恢复方案

    前言 最近工作上使用的数据库一直是Postgresql,这是一款开源的数据库,而且任何个人可以将该数据库用于商业用途.在使用Postgresql的时候,让我最明显的感觉就是这数据库做的真心好,虽然说数据库的安装包真的很小,但是性能和操作的便捷是一点也不输给其他商业的大型数据库,另外在命令行界面下对该数据库直接进行操作的感觉真的是很爽.在使用数据库的时候,我们作为小公司的数据库管理员有一项工作是不可能避免的,那就是数据的备份和恢复问题.PostgreSQL虽然各个方面的有点很多,但是在数据库备份这

  • Postgresql主从异步流复制方案的深入探究

    前言 数据库的备份工作在日常生产中极为重要,如果你咨询一个DBA如何才能设计出高可用的数据备份与恢复方案,相信很多人都会从架构上给出很多容灾的意见.但归根到底,如果业务环节中数据库还牵涉到分布式环境,我认为一个好的方案需要达到三大要求: 多副本 持久化 一致性 日常架构设计中,我们不仅要保证数据额的成功备份,还要保证备份的数据可以快速恢复.在众多备份恢复可靠性方案中 主从复制 技术,可以说是最常见的实现,本文主要是介绍postgresql主备数据库的异步流复制的环境搭建与主备切换的操作实践,除了

  • 浅谈postgresql数据库varchar、char、text的比较

    如下所示: 名字 描述 character varying(n), varchar(n) 变长,有长度限制 character(n), char(n) 定长,不足补空白 text 变长,无长度限制 简单来说,varchar的长度可变,而char的长度不可变,对于postgresql数据库来说varchar和char的区别仅仅在于前者是变长,而后者是定长,最大长度都是10485760(1GB) varchar不指定长度,可以存储最大长度(1GB)的字符串,而char不指定长度,默认则为1,这点需要

随机推荐