postgresql数据库版本从10.12升级到13.11(离线安装)

升级原因:

PostgreSQL 12.5之前版本中存在SQL注入漏洞,攻击者可利用该漏洞有权在至少一个模式中创建非临时对象,可以以超级用户的身份执行任意SQL函数。

PostgreSQL: Security Information

升级准备工作

1、原数据库备份

2、离线安装

参考:CentOS离线安装postgresql - 知乎

PostgreSQL: Documentation: 13: pg_upgrade

PostgreSQL 数据库跨版本升级常用方案_不剪发的Tony老师的博客-CSDN博客

方法一:源码离线安装

1)下载源码:

PostgreSQL: File Browser

postgresql数据库版本从10.12升级到13.11(离线安装)_第1张图片

2)下载完成后,通过ftp上传到服务器:

postgresql数据库版本从10.12升级到13.11(离线安装)_第2张图片

3)执行解压命令:

tar -xvf postgresql-13.11.tar.gz

 解压完成后生成 postgresql-13.11目录

4)进行编译:

cd postgres-13.11
./configure --prefix=/lz_run/pgsql13/

configuration配置说明:

如果只进行默认配置,可直接在源码解压路径下运行命令:./configure默认配置会安装仅使用C编译器的服务端和其他程序、客户端接口等。

默认会安装到/usr/local/pgsql路径下。#数据库软件安装路径

如果需要重新进行configure,则建议首先执行以下: make distclean #该命令重置源码树至初始状态

常用./configure选项:

--prefix=PREFIX

将所有文件放置到PREFIX指定的路径下(而非默认的/usr/local/pgsql)

--enable-nls[=LANGUAGES]

启用本地语言支持(NLS)。若不指定LANGUAGE,则会安装所有可用的语言。

需要Gettext API

--with-perl

创建PL/Perl服务端语言。

--with-python

创建PL/Python服务端语言。

--with-openssl

支持SSL(加密)连接。需要安装OpenSSL。

--with-pgport=NUMBER

为客户端及服务端设置默认端口号。默认为5432。

执行命令过程中可能会出现缺少依赖包的错误,那安装依赖包后,重新运行命令即可。

5)来构建build 

make

6)安装

make install

如果需要卸载PostgreSQL,则可以执行

make uninstall

如果需要重新进行configure,则建议首先执行以下: make distclean #该命令重置源码树至初始状态

方法二:rpm离线安装

1)下载安装包

由于需要离线安装,所以需要首先下载rpm包到本地,下载地址为:

PostgreSQL: Linux downloads (Red Hat family)


点击postgresql的rpm合集,如下,选择与操作系统匹配的版本

postgresql数据库版本从10.12升级到13.11(离线安装)_第3张图片

继续点入

postgresql数据库版本从10.12升级到13.11(离线安装)_第4张图片

 postgresql数据库版本从10.12升级到13.11(离线安装)_第5张图片
上面的postgresql13、postgresql13-contrib、postgresql13-libs、postgresql13-server每个点进去,都会看到在该大版本号下的不同的小版本好的包,选择一个合适的小版本号下载即可,本次下载的内容如下:
postgresql13-13.11-1PGDG.rhel7.x86_64 、postgresql13-contrib-13.11-1PGDG.rhel7.x86_64、postgresql13-libs-13.11-1PGDG.rhel7.x86_64、postgresql13-server-13.11-1PGDG.rhel7.x86_64 

2)ftp上传rpm包并进行安装

上传到/opt 目录

postgresql数据库版本从10.12升级到13.11(离线安装)_第6张图片

使用rpm 命令进行安装,该方法不能改变安装路径

postgresql11-libs-11.16-1PGDG.rhel7.x86_64.rpm、postgresql11-11.16-1PGDG.rhel7.x86_64.rpm、postgresql11-server-11.16-1PGDG.rhel7.x86_64.rpm

rpm -ivh postgresql13-libs-13.11-1PGDG.rhel7.x86_64.rpm

rpm -ivh postgresql13-13.11-1PGDG.rhel7.x86_64.rpm

rpm -ivh postgresql13-server-13.11-1PGDG.rhel7.x86_64.rpm

rpm -ivh postgresql13-contrib-13.11-1PGDG.rhel7.x86_64.rpm

安装 postgresql13-13.11-1PGDG.rhel7.x86_64.rpm 过程中可能出现

的报错,那安装libicu库就可以了,下载地址为:

 https://centos.pkgs.org/7/centos-x86_64/libicu-50.2-4.el7_7.x86_64.rpm.html

 下载完成后通过ftp上传到服务器,然后执行安装命令:

rpm -ivh libicu-50.2-4.el7_7.x86_64.rpm

安装 postgresql13-contrib-13.11-1PGDG.rhel7.x86_64.rpm过程中也可能出现缺少库文件的错误,

错误如下:

 那安装libxslt库就可以了,下载地址为:

https://centos.pkgs.org/7/centos-x86_64/libxslt-1.1.28-6.el7.x86_64.rpm.html
同样上传到服务器,再执行安装命令即可

rpm -ivh libxslt-1.1.28-6.el7.x86_64.rpm

成功安装后截图如下:

 postgresql数据库版本从10.12升级到13.11(离线安装)_第7张图片

  3、初始化数据库

我们采用第二种方法进行安装,安装后postgre的位置为:/usr/pgsql-13/

postgresql数据库版本从10.12升级到13.11(离线安装)_第8张图片

1)创建pgsql数据目录:

mkdir /lz_data/pgsql_data13

2)设置文件夹权限

chown -R postgres:postgres /lz_data/pgsql_data13

chmod 0700 /lz_data/pgsql_data13

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

su postgres
/usr/pgsql-13/bin/initdb -D /lz_data/pgsql_data13

4)将旧版本配置文件 pg_hba.conf 和 postgresql.conf 、postgresql.auto.conf 中的改动在对应的新配置文件中再次进行修改.(我是直接用老的文件覆盖新的)

配置文件存放位置查找方法:

psql -U postgres -c 'SHOW config_file'

postgresql数据库版本从10.12升级到13.11(离线安装)_第9张图片

 5)修改postgres用户密码:

\password postgres

执行结果如下: 

6)修改启动文件的数据库存储目录:

vi /usr/lib/systemd/system/postgresql-13.service 中 Environment=PGDATA=/lz_data/pgsql_data13/

 7)最后执行:

systemctl daemon-reload

4、利用pg_upgrade工具进行升级

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

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

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

sudo systemctl stop postgresql
sudo systemctl disable postgresql

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

/usr/pgsql-13/bin/pg_upgrade \
  --old-datadir /lz_data/pgsql_data/ \
  --new-datadir /lz_data/pgsql_data13/ \
  --old-bindir /lz_run/pgsql/bin/ \
  --new-bindir /usr/pgsql-13/bin \
  --check

执行结果如下:

postgresql数据库版本从10.12升级到13.11(离线安装)_第10张图片

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

/usr/pgsql-13/bin/pg_upgrade \
  --old-datadir /lz_data/pgsql_data/ \
  --new-datadir /lz_data/pgsql_data13/ \
  --old-bindir /lz_run/pgsql/bin/ \
  --new-bindir /usr/pgsql-13/bin \  

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

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

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

SELECT version();

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

./analyze_new_cluster.sh

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

 ./delete_old_cluster.sh

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

yum remove postgresql12*

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

如果只运行了 --check 选项命令,表示没有真正执行升级,重新启动服务即可;
如果升级时没有使用 --link 选项,旧版本的数据库集群没有任何修改,重新启动服务即可;
如果升级时使用了 --link 选项,数据库文件可能已经被新版本的集群使用:
如果 pg_upgrade 在链接操作之前终止,旧版本的数据库集群没有任何修改,重新启动服务即可;
如果没有启动过新版本的后台服务,旧版本的数据库集群没有修改,但是链接过程已经将 $PGDATA/global/pg_control 文件重命名为 $PGDATA/global/pg_control.old;此时需要将该文件名中的 .old 后缀去掉,然后重新启动服务即可;
如果已经启动了新版本的数据库集群,已经修改了数据库文件,再启动旧版本的服务可能导致数据损坏;此时需要通过备份文件还原旧版本的数据库。
关于 pg_upgrade 的详细使用和升级注意事项,例如流复制结构和日志传输复制结构中备用节点的升级,可以参考PostgreSQL: Documentation: 15: pg_upgrade。

你可能感兴趣的:(数据库,postgresql,centos)