PostgreSQL 12.5之前版本中存在SQL注入漏洞,攻击者可利用该漏洞有权在至少一个模式中创建非临时对象,可以以超级用户的身份执行任意SQL函数。
PostgreSQL: Security Information
参考:CentOS离线安装postgresql - 知乎
PostgreSQL: Documentation: 13: pg_upgrade
PostgreSQL 数据库跨版本升级常用方案_不剪发的Tony老师的博客-CSDN博客
PostgreSQL: File Browser
tar -xvf postgresql-13.11.tar.gz
解压完成后生成 postgresql-13.11目录
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。
执行命令过程中可能会出现缺少依赖包的错误,那安装依赖包后,重新运行命令即可。
make
make install
如果需要卸载PostgreSQL,则可以执行
make uninstall
如果需要重新进行configure,则建议首先执行以下: make distclean #该命令重置源码树至初始状态
由于需要离线安装,所以需要首先下载rpm包到本地,下载地址为:
PostgreSQL: Linux downloads (Red Hat family)
点击postgresql的rpm合集,如下,选择与操作系统匹配的版本
继续点入
上面的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
上传到/opt 目录
使用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
成功安装后截图如下:
我们采用第二种方法进行安装,安装后postgre的位置为:/usr/pgsql-13/
mkdir /lz_data/pgsql_data13
chown -R postgres:postgres /lz_data/pgsql_data13
chmod 0700 /lz_data/pgsql_data13
su postgres
/usr/pgsql-13/bin/initdb -D /lz_data/pgsql_data13
配置文件存放位置查找方法:
psql -U postgres -c 'SHOW config_file'
\password postgres
执行结果如下:
6)修改启动文件的数据库存储目录:
vi /usr/lib/systemd/system/postgresql-13.service 中 Environment=PGDATA=/lz_data/pgsql_data13/
7)最后执行:
systemctl daemon-reload
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
执行结果如下:
其中 --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。