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

upgrade

文章目录

    • 升级方案概述
    • 通过逻辑备份与还原进行升级
    • 利用 pg_upgrade 工具进行升级
    • 使用逻辑复制功能进行升级
    • 总结

大家好,我是只谈技术不剪发的 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,我们在同一台服务器上进行升级。

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

    然后备份数据库:

    pg_dumpall > outputfile
    

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

  2. 停止旧版本的后台服务:

    pg_ctl stop
    

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

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

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

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

    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    
  6. 将旧版本配置文件 pg_hba.conf 和 postgresql.conf 等中的改动在对应的新配置文件中再次进行修改。

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

     /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
    
  8. 最后,利用新版本的 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。

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

    sudo systemctl stop postgresql-12
    sudo systemctl disable postgresql-12
    
  2. 安装新版本的 PostgreSQL 软件。例如 PostgreSQL 13.0,安装目录位于 /usr/pgsql-13/。

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

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

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

    sudo systemctl stop postgresql-13
    
  6. 通过 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 表示将新版本的数据目录硬链接到旧版本的数据目录,而不会复制一份新的数据文件,可以快速进行升级。

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

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

    sudo systemctl start postgresql-13
    sudo systemctl enable postgresql-13
    
  9. 连接服务器查看数据库的版本信息:

    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|
    
  10. 收集统计信息。pg_upgrade 不会生成新版本数据库的统计信息,但是会创建一个脚本文件,执行该文件:

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

      ./delete_old_cluster.sh
    

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

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

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

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

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

逻辑复制

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

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

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11334.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从dblink谈起,我们在postgresql中跨库更新数据

dblink(Database Link)数据库链接顾名思义就是数据库的链接,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以…

postgresql 数据库小版本更新

postgresql 数据库小版本更新 记录一次pg小版本更新 文章目录 postgresql 数据库小版本更新前言一.下载最新的pg版本 pg11(11.18)二 pg11.5 升级 pg11.18过程1. 查看当前数据库版本:2. 关闭pg11.5数据库3. 安装pg11.184.修改 配置文件5. 重新…

15、ChatGPT 会让嵌入式工程师失业吗?

ChatGPT 会让嵌入式工程师失业吗? 如果说陈**不怕失业,那么,你觉得ChatGPT 会让嵌入式工程师失业吗? 我们先来看下ChatGPT给出的答案: ChatGPT 作为一款人工智能聊天机器人,不一定会让嵌入式工程师失业。事…

ChatGPT 会让嵌入式工程师失业吗?

关注、星标公众号,直达精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 最近两天关于“CETC中电科的事件”闹得沸沸扬扬,为什么这个事能闹得如此之大? 原因很简单,作为打工人(新生代农民工)&…

gmail邮箱怎么收不到邮件

今天发现gmail能发送邮件但是收不到邮件,通过google知道解决通过网页打开GMAIL后台的设置选项,找到"设置POP\IMAP",把转发功能重新开通一下。 我的是如下图 把POP的对所有邮件启用POP,保存更改,就能收到了。

系统分享|教你如何注册Z-library全球最大的数字图书馆,并获取个人独立域名!

目录 什么是Z-Library? 导言 Z-library 的起源与背景 独特的Z-library 特点 Z-Library能做什么? 最新网址 注册教程 1、创建账户 ​编辑2、邮箱创建 3、接受验证码 4、注册成功 5、搜索书籍下载 6、下载资料 7、设置选择 8、设置Z-access 9、你…

复旦团队发布国内首个模型MOSS 类ChatGPT

复旦团队发布国内首个模型MOSS 类ChatGPT 首先看到这个标题,还有这个名字,我是正经(zhen jing)的 (bu shi 流浪地球?550W?不了解的可以把550W倒过来写,就懂了 看到新闻里的一些图…

语言模型 ChatGPT MOSS 使用体验分享

今早起床听闻复旦大学自然语言处理实验室团队发布了国内首个类ChatGPT对话语言模型MOSS。在好奇心的驱使下,我向贵实验室的小伙伴要来内测邀请码试玩了一番,顺便把MOSS与ChatGPT的试玩结果进行了对比,以下是部分对话历史记录: 目录…

textarea输入框监听和输入字数限制以及样式设置

html <p class"describe">分类描述</p><div class"desc"><textarea class"wishContent" placeholder"请输入分类描述&#xff0c;最多255字。" maxlength"255" ></textarea><div class&…

Android开发之EditText限制输入中文以及字数长度限制的标准姿势

老套路先上效果图&#xff1a; 设置输入框的两个筛选器&#xff1a; etGiftName.setFilters(new InputFilter[]{new ZsInputFilter(5,this), new LengthListener(5,this)}); 我们来看下筛选器如何实现的&#xff1a; 先看中文筛选器 package com.yhsh.mobile.giftcomponent;…

关于输入框限制字数输入问题

在输入框输入内容&#xff0c;当需要限制字数的时候&#xff0c;如果是Input或者textarea&#xff0c;可以直接用maxlength进行字数的限制。如果是用div(添加了contenteditable属性)&#xff0c;如果直接用input事件进行字数的限制&#xff0c;则会出现临界问题。 问题起源&…

thinkphp 模板截取中文(限制显示字数)

把如下代码粘贴到thinkphp核心包的/common/functions.php 的最后便可在html模型里直接使用 //函数解释&#xff1a; //msubstr($str, $start0, $length, $charset”utf-8″, $suffixtrue) //$str:要截取的字符串 // $start0&#xff1a;开始位置&#xff0c;默认从0开始 // $l…

人工智能能有多聪明,取决于这两个字

当代打工人&#xff0c;已经感受到人工智能带来的“寒气”。 今年以来&#xff0c;GPT-4 被陆续报道高分通过法律、医学、会计等领域的考试 [1]。不仅如此&#xff0c;GPT-4 还通过谷歌工程师面试拿到了年薪 18 万美元的 offer [2]&#xff0c;这让不少打工人开始担心被 AI 抢饭…

30岁+,帝都大厂夫妻+两娃的百万存款和家庭开销。。

周末闲来无事&#xff0c;心血来潮算了下家庭年开销。不算不知道&#xff0c;这一算花销还真是不小&#xff0c;好在我和老公都还能挣到钱。 先说明下家庭成员和职责分工&#xff1a; 老公&#xff1a;985本硕连读&#xff0c;工作10多年&#xff0c;待过了三家互联网大厂&…

面试题:Redis脑裂为何会导致数据丢失?

更多内容关注微信公众号&#xff1a;fullstack888 1 案例 主从集群有1个主库、5个从库和3个哨兵实例&#xff0c;突然发现客户端发送的一些数据丢了&#xff0c;直接影响业务层数据可靠性。 最终排查发现是主从集群中的脑裂问题导致&#xff1a;主从集群中&#xff0c;同时有两…

AI热潮中的黑马:曾经的显卡制造商是如何跻身AI巨头之列的?

导读&#xff1a;在芯片行业的风云变幻中,英伟达如何从一家显卡制造商翻身成为AI巨头?面对行业迭代速度极快、激烈竞争和显著的高成本特点,英伟达是如何构建属于自己的护城河,又是如何突破技术瓶颈,跑在前列的呢?他们是如何将"摩尔定律"推进到更高阶段创造出属于自…

低质量软件的最大“祸根”:虚构问题!

【编者按】软件质量的好坏与很多因素有关&#xff0c;例如开发者的投入水平&#xff0c;采取测试手段的标准&#xff0c;都有可能成为低质量的诱因。 原文链接&#xff1a;https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software 未经允许&#xff0c;禁止转…

解决国产系统 Docker 拉取大镜像卡顿之谜

今天解决了客户 arm64 机器上 docker pull 大镜像卡住的问题。 由来 同事让我帮忙解决客户现场 Docker 镜像无法拉取的问题&#xff0c;故障如下会一直卡住&#xff1a; $ docker pull xxx:5000/xxxx xxx: Pulling from xxx/xxxxxx 7c0b344a74c2: Extracting [> …

中国版ChatGPT“狂飙”的机会在哪儿?

能否为百度止颓&#xff0c;不仅取决于技术能力&#xff0c;更取决于公司的经营策略和市场环境。目前&#xff0c;百度在人工智能领域已经取得了一些成果&#xff0c;比如语音识别、图像识别等方面&#xff0c;但在对话系统领域仍有待提高。如果百度能够利用自身的优势&#xf…

GPT-3.5还没研究明白,GPT-4又来了,chatGPT会进化成什么样?

基于GPT-3.5的chatGPT热度才稍稍减退没多久&#xff0c;GPT-4又来了&#xff0c;文新一言的发布会也槽点满满&#xff0c;差距似乎越来越大了。 chatGPT到底厉害在哪&#xff1f;为什么突然就爆火了呢&#xff1f; 它的爆火&#xff0c;一方面&#xff0c;和它的出现形态有关…