目前小版本升级的步骤:
1.安装最新版本数据库
2.停止数据库实例
3.对数据目录进行备份
4.使用新版本启动数据库
5.调整环境变量,PGHOME/LD_LIRARAY_PATH等
目前PG大版本的升级方法主要有以下四种方式:
1.转储数据的方式(pg_dump或pg_dumpall导出数据,pg_restore或psql导入)
2.通过pg_upgrade进行升级
3.pg_logical 扩展进行升级
4.通过内置逻辑复制的方式进行版本升级
注:不管如何升级,升级前,都需要做备份!避免意外情况,导致数据异常无法恢复。
一、postgres9.2.4版本安装
1、创建用户
[root@vkeep ~]# groupadd postgres
[root@vkeep ~]# useradd -g postgres postgres -m -s /bin/bash
[root@vkeep ~]# echo "Database@123" | passwd --stdin postgres
2、安装依赖包
[root@vkeep ~]# yum install gcc gcc-c++ zlib-devel readline readline-devel perl-ExtUtils-Embed pam-devel openssl openssl-devel cmake libxslt-devel libxml2-devel openldap-devel python-devel tcl tcl-devel bison flex xmlto -y
3、创建数据库目录
[root@vkeep ~]# mkdir -p /data/postgres9/{soft,postgresql,pgdata}
[root@vkeep ~]# chown -R postgres: /data
4、创建环境变量
[root@vkeep ~]# su - postgres
[postgres@vkeep ~]$ echo 'export PGPORT=5432
export PG_HOME=/data/postgres9/postgresql
export PATH=$PG_HOME/bin:$PATH
export PGDATA=/data/postgres9/pgdata
export LD_LIBRARY_PATH=$PG_HOME/lib
export LANG=en_US.utf8
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
' >> ~/.bash_profile && source ~/.bash_profile
5、上传源码包,并解压
# 解压源码包
[postgres@vkeep ~]$ cd /data/postgres9/soft/
[postgres@vkeep soft]$ tar -zxf postgresql-9.2.4.tar.gz
6、编译源码包
[postgres@vkeep soft]$ cd postgresql-9.2.4/
[postgres@vkeep postgresql-9.2.4]$ ./configure --prefix=/data/postgres9/postgresql --with-pgport=5432 --with-openssl --with-perl \
--with-tcl --with-python --with-pam --without-ldap --with-libxml --with-libxslt \
--enable-thread-safety --with-wal-blocksize=16 --with-blocksize=8
7、安装数据库
[postgres@vkeep postgresql-9.2.4]$ make -j 4 && make install
8、初始化数据库
[postgres@vkeep postgresql-9.2.4]$ # 初始化数据库集簇
[postgres@vkeep postgresql-9.2.4]$ initdb -D $PGDATA -W
9、启动数据库
[postgres@vkeep postgresql-9.2.4]$ pg_ctl -D $PGDATA start
10、创建数据库用户和数据库
[postgres@vkeep pgdata]$ psql -d postgres -p 5432
postgres=# create database testdb;
postgres=# create user keep with Superuser password 'keep';
11、配置远程连接
# 配置连接
[postgres@vkeep pgdata]$ cd $PGDATA
[postgres@vkeep pgdata]$ sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" postgresql.conf
[postgres@vkeep pgdata]$ echo 'host all all 0.0.0.0/0 md5' >> pg_hba.conf
# 重启数据库
[postgres@vkeep pgdata]$ pg_ctl stop
[postgres@vkeep pgdata]$ pg_ctl -D $PGDATA start
# 验证远程连接
[postgres@vkeep pgdata]$ psql -d testdb -U keep -p 5432 -h 192.168.140.96
二、postgres14.6版本安装
1、创建数据库目录
[postgres@vkeep ~]# mkdir -p /data/postgres14/{soft,postgresql,pgdata}
2、上传源码包,并解压
# 解压源码包
[postgres@vkeep ~]$ cd /data/postgres14/soft
[postgres@vkeep soft]$ tar -zxf postgresql-14.6.tar.gz
3、编译源码包
[postgres@vkeep soft]$ cd postgresql-14.6
[postgres@vkeep postgresql-14.6]$ ./configure --prefix=/data/postgres14/postgresql --with-pgport=54321 --with-openssl --with-perl \
--with-tcl --with-python --with-pam --without-ldap --with-libxml --with-libxslt \
--enable-thread-safety --with-wal-blocksize=16 --with-blocksize=8
4、安装数据库
[postgres@vkeep postgresql-14.6]$ make -j 4 && make install
5、初始化数据库
[postgres@vkeep postgresql-14.6]$ /data/postgres14/postgresql/bin/initdb -D /data/postgres14/pgdata -W
三、创建测试数据
此处不严谨:由于pg9.2.4没有pgbench命令,所以用pg14版本生成数据
[postgres@vkeep ~]$ /data/postgres14/postgresql/bin/pgbench -i -s 10 -U postgres testdb
[postgres@vkeep ~]$ psql testdb
psql (9.2.4)
Type "help" for help.
testdb=# \d
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+----------
public | pgbench_accounts | table | postgres
public | pgbench_branches | table | postgres
public | pgbench_history | table | postgres
public | pgbench_tellers | table | postgres
(4 rows)
testdb=# select count(1) from pgbench_accounts;
count
---------
1000000
(1 row)
testdb=# select count(1) from pgbench_branches ;
count
-------
10
(1 row)
testdb=# select count(1) from pgbench_history ;
count
-------
0
(1 row)
testdb=# select count(1) from pgbench_tellers ;
count
-------
100
(1 row)
四、进行升级
1、兼容性比较
# 注意:需要停止新旧版本数据库的进程
[postgres@vkeep ~]$ /data/postgres14/postgresql/bin/pg_upgrade -c -k -b /data/postgres9/postgresql/bin -B /data/postgres14/postgresql/bin -d /data/postgres9/pgdata -D /data/postgres14/pgdata -p 54321 -P 5432

2、执行升级
pg_upgrade升级有三种方式。
1)常规复制方式;不会对旧集簇产生影响,但是当数据文件大时速度慢。
/data/postgres14/postgresql/bin/pg_upgrade -b /data/postgres9/postgresql/bin -B /data/postgres14/postgresql/bin -d /data/postgres9/pgdata -D /data/postgres14/pgdata -p 5432 -P 54321
2)link链接方式;以硬链接方式重用旧的用户数据文件来执行快速升级,节省磁盘空间,但升级后旧集簇不可用,恢复耗时。
/data/postgres14/postgresql/bin/pg_upgrade -k -b /data/postgres9/postgresql/bin -B /data/postgres14/postgresql/bin -d /data/postgres9/pgdata -D /data/postgres14/pgdata -p 5432 -P 54321
3)clone 克隆方式;结合以上两者的优势,它支持在Linux(内核4.5或更高版本)上的Btrfs和XFS(在文件系统创建reflink支持)。
/data/postgres14/postgresql/bin/pg_upgrade --clone -b /data/postgres9/postgresql/bin -B /data/postgres14/postgresql/bin -d /data/postgres9/pgdata -D /data/postgres14/pgdata -p 5432 -P 54321
# 如果升级报错,需要重新初始化新集群
# 小写为旧集群配置,大写为新集群配置
-p, --old-port=PORT old cluster port number (default 50432)
-P, --new-port=PORT new cluster port number (default 50432)
# 如果报错:/data/postgres14/postgresql/bin/psql: symbol lookup error: /data/postgres14/postgresql/bin/psql: undefined symbol: PQsetErrorContextVisibility,执行下面语句
export LD_LIBRARY_PATH=/data/postgres14/postgresql/lib:$LD_LIBRARY_PATH
升级
[postgres@vkeep ~]$ /data/postgres14/postgresql/bin/pg_upgrade -b /data/postgres9/postgresql/bin -B /data/postgres14/postgresql/bin -d /data/postgres9/pgdata -D /data/postgres14/pgdata -p 5432 -P 54321
Performing Consistency Checks
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/data/postgres14/postgresql/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh

3、修改环境变量
[postgres@vkeep ~]$ cat .bash_profile
export PGPORT=5432
export PG_HOME=/data/postgres14/postgresql
export PATH=$PG_HOME/bin:$PATH
export PGDATA=/data/postgres14/pgdata
export LD_LIBRARY_PATH=$PG_HOME/lib
export LANG=en_US.utf8
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
[postgres@vkeep ~]$ source .bash_profile
4、修改配置文件
[postgres@vkeep ~]$ cat >> /data/postgres14/pgdata/postgresql.conf <<"EOF"
listen_addresses = '*'
port=5432
unix_socket_directories='/data/postgres14/pgdata'
EOF
[postgres@vkeep ~]$ echo 'host all all 0.0.0.0/0 md5' >> /data/postgres14/pgdata/pg_hba.conf
5、启动数据库,收集统计信息
[postgres@vkeep ~]$ pg_ctl start
[postgres@vkeep ~]$ /data/postgres14/postgresql/bin/vacuumdb --all --analyze-in-stages

6、查看数据
[postgres@vkeep ~]$ psql
psql (14.6)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | postgres=CTc/postgres+
| | | | | =c/postgres
testdb | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(4 rows)
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# \dt
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+----------
public | pgbench_accounts | table | postgres
public | pgbench_branches | table | postgres
public | pgbench_history | table | postgres
public | pgbench_tellers | table | postgres
(4 rows)
testdb=# select count(1) from pgbench_accounts;
count
---------
1000000
(1 row)
testdb=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 14.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 row)

7、清理旧版本数据(可选)
安装完之后....
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/data/postgres14/postgresql/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
[postgres@vkeep ~]$ ls
delete_old_cluster.sh