postgresql9.2.4 跨版本升级14.6

目前小版本升级的步骤:

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
相关推荐
Doris_LMS2 小时前
Git的强软硬回退(三)
运维·服务器·数据库·git·idea
深思慎考2 小时前
LinuxC++项目开发日志——高并发内存池(1-定长内存池)
linux·c++
(Charon)2 小时前
基于 epoll 的高并发服务器原理与实现(对比 select 和 poll)
运维·服务器
Jtti3 小时前
在 Debian 系统上清理缓存的方式和具体操作方法
运维·缓存·debian
williamdsy3 小时前
【postgresql】JPA LIKE 查询触发 PostgreSQL `text ~~ bytea` 报错的排查与最佳实践
数据库·postgresql
伐尘3 小时前
【mac】如何在 macOS 终端中高效查找文件:五种实用方法
运维·macos
川石课堂软件测试3 小时前
Oracle 数据库如何查询列
linux·数据库·sql·功能测试·oracle·grafana·prometheus
zzu123zsw4 小时前
第15章 Jenkins最佳实践
运维·jenkins
万物得其道者成5 小时前
Cursor + 云效 DevOps MCP
运维·devops