PostgresQL14.9升级到14.13
step 1.查看当前数据库版本和测试数据
[postgres@localhost ~]$ postgres -V postgres (PostgreSQL) 14.11 [postgres@localhost ~]$ psql psql (14.11) Type "help" for help. postgres=# postgres=# select version(); version ---------------------------------------------------------------------------------------------------------- PostgreSQL 14.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit (1 row) postgres=# create table test(id int,name text); CREATE TABLE postgres=# insert into test values(1,'a'); INSERT 0 1 postgres=# \q |
step 2.备份源库
pg_dumpall -U postgres -f /home/postgres/dumpall_data.sql
[postgres@localhost ~]$ pg_dumpall -U postgres -f /home/postgres/dumpall_data.sql [postgres@localhost ~]$ [postgres@localhost ~]$ more dumpall_data.sql -- -- PostgreSQL database cluster dump -- SET default_transaction_read_only = off; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; -- -- Roles -- CREATE ROLE appauditor; ALTER ROLE appauditor WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'SCRAM-SHA-256$4096:2tS6p/7oJnQ6V5jMNcAxZw==$aTtOrt6/+8WlvgMzBeU8NnG/xjtajSybHBrMZvmRDj4=:9amsGr+U E0RCyPpWre7R8qGDpa3uFztJEovFIHmP0YA='; |
step 3.查看编译选项
如何查看已经编译的pg当时编译的编译选项,可以使用pg_config。
pg_config 工具打印当前安装的 postgres版本配置参数。
[postgres@localhost ~]$ pg_config BINDIR = /pg14/soft/bin DOCDIR = /pg14/soft/share/doc/postgresql HTMLDIR = /pg14/soft/share/doc/postgresql INCLUDEDIR = /pg14/soft/include PKGINCLUDEDIR = /pg14/soft/include/postgresql INCLUDEDIR-SERVER = /pg14/soft/include/postgresql/server LIBDIR = /pg14/soft/lib PKGLIBDIR = /pg14/soft/lib/postgresql LOCALEDIR = /pg14/soft/share/locale MANDIR = /pg14/soft/share/man SHAREDIR = /pg14/soft/share/postgresql SYSCONFDIR = /pg14/soft/etc/postgresql PGXS = /pg14/soft/lib/postgresql/pgxs/src/makefiles/pgxs.mk CONFIGURE = '--prefix=/pg14/soft' '--with-openssl' CC = gcc -std=gnu99 CPPFLAGS = -D_GNU_SOURCE CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 CFLAGS_SL = -fPIC LDFLAGS = -Wl,--as-needed -Wl,-rpath,'/pg14/soft/lib',--enable-new-dtags LDFLAGS_EX = LDFLAGS_SL = LIBS = -lpgcommon -lpgport -lssl -lcrypto -lz -lreadline -lpthread -lrt -ldl -lm |
step 4.安装新版数据库14.13
[postgres@localhost ~]$ tar zxvf postgresql-14.13.tar.gz postgresql-14.13/ postgresql-14.13/.dir-locals.el postgresql-14.13/contrib/ postgresql-14.13/contrib/tcn/ postgresql-14.13/contrib/tcn/tcn.control postgresql-14.13/contrib/tcn/Makefile postgresql-14.13/contrib/tcn/tcn.c postgresql-14.13/contrib/tcn/tcn--1.0.sql postgresql-14.13/contrib/sslinfo/ postgresql-14.13/contrib/sslinfo/sslinfo--1.0--1.1.sql postgresql-14.13/contrib/sslinfo/sslinfo.control [postgres@localhost ~]$ cd postgresql-14.13/ [postgres@localhost postgresql-14.13]$ ./configure --prefix=/pg1413/soft --with-openssl checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking which template to use... linux checking whether NLS is wanted... no checking for default port number... 5432 checking for block size... 8kB make && make install |
【安装报错】
权限被拒绝,安装软件之前忘记创建目录了。
make[2]: Leaving directory `/home/postgres/postgresql-14.13/src/backend/utils' make[1]: Leaving directory `/home/postgres/postgresql-14.13/src/backend' make -C src install make[1]: Entering directory `/home/postgres/postgresql-14.13/src' make -C common install make[2]: Entering directory `/home/postgres/postgresql-14.13/src/common' /bin/mkdir -p '/pg1413/soft/lib' /bin/mkdir: cannot create directory ‘/pg1413’: Permission denied make[2]: *** [installdirs] Error 1 make[2]: Leaving directory `/home/postgres/postgresql-14.13/src/common' make[1]: *** [install-common-recurse] Error 2 make[1]: Leaving directory `/home/postgres/postgresql-14.13/src' make: *** [install-src-recurse] Error 2 |
【解决方案】:
使用root创建目录,给权限之后,重新make install一下就可以了。
[root@localhost ~]# mkdir -p /pg1413 [root@localhost ~]# chown -R postgres:postgres /pg1413 [root@localhost ~]# [postgres@localhost postgresql-14.13]$ make install /bin/mkdir -p '/pg1413/soft/bin' /bin/install -c createdb '/pg1413/soft/bin'/createdb /bin/install -c dropdb '/pg1413/soft/bin'/dropdb /bin/install -c createuser '/pg1413/soft/bin'/createuser |
step 5.关闭源库
pg_ctl stop
[postgres@localhost postgresql-14.13]$ pg_ctl stop waiting for server to shut down.... done server stopped |
step 6.修改环境变量
[postgres@localhost ~]$ vi .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/.local/bin:$HOME/bin export PATH export LANG=en_US.UTF-8 export PS1="[\u@\h \W]\$ " export PGPORT=5666 export PGDATA=/dbs/pg14/data -->数据目录不改 export PGHOME=/pg1413/soft -->要改 export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH export PATH=$PGHOME/bin:$PATH:. export DATE=`date +"%Y%m%d%H%M"` export MANPATH=$PGHOME/share/man:$MANPATH export PGUSER=postgres export PGDATABASE=postgres export PATH=/pg1413/soft/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/postgres/.local/bin:/home/postgres/bin:.:/pg1413/pgbouncer/bin -->要改 |
step 7.使用新版数据库执行文件启动数据库
[postgres@localhost ~]$ pg_ctl start waiting for server to start....2024-11-27 09:06:41.029 CST [28582] FATAL: could not access file "pg_stat_statements": No such file or directory 2024-11-27 09:06:41.029 CST [28582] LOG: database system is shut down stopped waiting pg_ctl: could not start server Examine the log output. 【原因分析】 旧版本数据库有安装pg_stat_statements模块,新版本没有安装 pg_stat_statements是用来查询运行时间长的SQL语句。 【解决办法】 安装包本身自带这个模块,到安装包里把这个模块安装上, [postgres@localhost ~]$ cd ~/postgresql-14.13/contrib/pg_stat_statements/ [postgres@localhost pg_stat_statements]$ make & make install [1] 28630 make -C ../../src/backend generated-headers make -C ../../src/backend generated-headers make[1]: Entering directory `/home/postgres/postgresql-14.13/src/backend' make[1]: Entering directory `/home/postgres/postgresql-14.13/src/backend' 再次启动数据库,继续报错 [postgres@localhost ~]$ pg_ctl start waiting for server to start....2024-11-27 09:10:41.741 CST [28658] FATAL: could not access file "passwordcheck": No such file or directory 2024-11-27 09:10:41.741 CST [28658] LOG: database system is shut down stopped waiting pg_ctl: could not start server Examine the log output. 【原因分析】 旧版本数据库有配置密码复杂度检查模块,新版本没有安装 【解决办法】 到安装包里把密码复杂度模块安装上。 [postgres@localhost ~]$ cd ~/postgresql-14.13/contrib/passwordcheck/ [postgres@localhost passwordcheck]$ [postgres@localhost passwordcheck]$ make & make install [1] 28667 make -C ../../src/backend generated-headers make -C ../../src/backend generated-headers make[1]: Entering directory `/home/postgres/postgresql-14.11/src/backend' make -C catalog distprep generated-header-symlinks make[1]: Entering directory `/home/postgres/postgresql-14.11/src/backend' [postgres@localhost passwordcheck]$ pg_ctl start waiting for server to start....2024-11-27 09:12:24.344 CST [28712] FATAL: could not access file "pgaudit": No such file or directory 2024-11-27 09:12:24.344 CST [28712] LOG: database system is shut down stopped waiting pg_ctl: could not start server Examine the log output. 【原因分析】 旧版本数据库有安装审计插件,新版本没有安装 【解决办法】 重新安装审计插件 [postgres@localhost pgaudit-1.6.2]$ cd pgaudit-1.6.2/ -bash: cd: pgaudit-1.6.2/: No such file or directory [postgres@localhost pgaudit-1.6.2]$ [postgres@localhost pgaudit-1.6.2]$ make USE_PGXS=1 make: Nothing to be done for `all'. [postgres@localhost pgaudit-1.6.2]$ make install USE_PGXS=1 /bin/mkdir -p '/pg1413/soft/lib/postgresql' /bin/mkdir -p '/pg1413/soft/share/postgresql/extension' /bin/mkdir -p '/pg1413/soft/share/postgresql/extension' /bin/install -c -m 755 pgaudit.so '/pg1413/soft/lib/postgresql/pgaudit.so' /bin/install -c -m 644 .//pgaudit.control '/pg1413/soft/share/postgresql/extension/' /bin/install -c -m 644 .//pgaudit--1.6.2.sql .//pgaudit--1.6--1.6.1.sql .//pgaudit--1.6.1--1.6.2.sql '/pg1413/soft/share/postgresql/extension/' [postgres@localhost pgaudit-1.6.2]$ pg_ctl start waiting for server to start....2024-11-27 09:13:26.931 CST [28756] LOG: pgaudit extension initialized 2024-11-27 09:13:26.950 CST [28756] LOG: redirecting log output to logging collector process 2024-11-27 09:13:26.950 CST [28756] HINT: Future log output will appear in directory "/pglog". done server started 终于启动成功 |
【关于contrib模块】 PostgreSQL数据库contrib模块是一系列附加的、可选的、由社区开发和维护的扩展功能。这些模块提供了各种额外的功能,例如数据类型、函数、工具、扩展插件等,以满足特定需求或提供特定功能。它们不是核心的数据库系统的一部分,但可以根据需要安装和使用。 一些常见的contrib模块包括: 1、pg_stat_statements是最有用的扩展。它记录了运行了哪些查询、查询花费了多长时间以及有关查询的许多其他详细信息。这是管理数据库性能的关键扩展。 2、auto_explain是 contrib 中另一个有助于提高性能的插件。对于运行时间超过一定期限的查询,将自动记录解释计划——有助于性能调试。 3、pgcrypto:提供了加密功能,包括对称加密、哈希函数和数字签名等。 这些扩展模块允许用户根据自己的需求和特定的数据库应用场景来扩展和定制PostgreSQL。安装并启用这些模块可以为数据库提供额外的功能和灵活性。 contrib模块作为PostgreSQL的一个功能模块,可以在下载的安装包里找到这个模块,比如,如下显示为PostgreSQL 14.13版本contrib模块的相关内容,具体如下所示: 进入contrib模块目录后,可以看到很多的文件夹,每一个文件夹就代表一个用户定义模块,里面可能包含一个或者多个用户定义的函数。 比如选择contrib模块dblink这个目录,可以看到里面含有一些.sql、.c和.conf等文件。 [postgres@localhost dblink]$ more dblink--1.0--1.1.sql /* contrib/dblink/dblink--1.0--1.1.sql */ -- complain if script is sourced in psql, rather than via ALTER EXTENSION \echo Use "ALTER EXTENSION dblink UPDATE TO '1.1'" to load this file. \quit CREATE FUNCTION dblink_fdw_validator( options text[], catalog oid ) RETURNS void AS 'MODULE_PATHNAME', 'dblink_fdw_validator' LANGUAGE C STRICT; CREATE FOREIGN DATA WRAPPER dblink_fdw VALIDATOR dblink_fdw_validator; 上面这段代码的具体作用就是用于升级 dblink 扩展到 1.1 版本,并创建了用于验证外部数据封装器的函数和相关配置。 从上面图可以看到目录下含有一些C语言代码文件,PostgreSQL是使用C语言编写的,而C语言代码在调用底层硬件方面具有天然的优势,这也是PostgreSQL相对其它一些语言代码开发的数据库的优势所在。 在https://pgpedia.info/c/contrib-module.html这篇文章里,对contrib模块有比较详细的解释,我将这段英文内容翻译成中文如下: contrib 模块是作为源代码分发的附加功能,但默认情况下未启用的。它们通常提供作为扩展模块或额外的客户端或服务器应用程序。它们是核心分发的一部分,但默认情况下未启用,因为它们要么提供特定的功能,要么被视为实验性质的,或者在某些情况下被用于提供已整合到 PostgreSQL 核心的功能的向后兼容性。 将 PostgreSQL 作为软件包提供的操作系统通常会提供 contrib 模块作为子软件包,通常称为 “postgresql-contrib” 或类似的名称。contrib 模块的源代码可以在 PostgreSQL 源代码分发的 “contrib/” 目录中找到。除非使用 “make world” 目标,否则不会自动构建任何 contrib 模块,在这种情况下将构建所有 contrib 模块。在 “contrib/” 目录中运行 “make && make install” 也将导致构建所有模块。 另外随着PostgreSQL版本的不断迭代,不同版本所含的contrib模块在兼容性上也有差别,以下是这幅图也是来自https://pgpedia.info/c/contrib-module.html对不同PostGreSQL版本contrib模块兼容性差异的对比。 在https://www.mankier.com/package/postgresql-contrib这篇文章中,对于部分PostGreSQL的一些contrib 模块的组件也有相应的解释,我将原文翻译成中文,内容如下: 常用命令 oid2name: 解析 PostgreSQL 数据目录中的 OID 和文件节点 pg_amcheck: 检查一个或多个 PostgreSQL 数据库的损坏情况 pg_archivecleanup: 清理 PostgreSQL WAL(写前日志)归档文件 pg_recvlogical: 控制 PostgreSQL 逻辑解码流 pg_test_fsync: 确定 PostgreSQL 的最快的 wal_sync_method pg_test_timing: 测量时间开销 pg_waldump: 显示 PostgreSQL 数据库集群的写前日志的可读版本 pgbench: 在 PostgreSQL 上运行基准测试 vacuumlo: 从 PostgreSQL 数据库中删除孤立的大对象 如果希望详细了解contrib模块里各用户定义模块的具体含义,可以仔细阅读github上https://github.com/postgres/postgres/tree/master/contrib这部分对各模块的详细介绍,不过这需要很强的代码阅读能力,对于初学者来说确实是一个很大的挑战。 |
那有没有办法提前知道旧版本数据库安装了哪些插件? postgres=# SELECT * FROM pg_extension; postgres=# \dx postgres=# SELECT * FROM pg_available_extensions; postgres=# show shared_preload_libraries; |
step8.登录数据库查看版本,验证数据
验证版本: [postgres@localhost pgaudit-1.6.2]$ pg_ctl -V pg_ctl (PostgreSQL) 14.13 [postgres@localhost pgaudit-1.6.2]$ psql psql (14.13) Type "help" for help. postgres=# select version(); version ---------------------------------------------------------------------------------------------------------- PostgreSQL 14.13 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit (1 row) 验证数据: postgres=# select * from test; id | name ----+------ 1 | a (1 row) |