postgres数据库大版本升级

Postgres数据库大版本升级

1.升级的介绍

当前PostgreSQL版本号由主要版本号和次要版本号组成。 10之前的版本由三部分组成,

10开始只有两部分数字组成。例如,在版本号10.1中,10是主要版本号,1是次要版本号,

这意味着这将是主版本10的第一个次要版本。 对于PostgreSQL版本10.0之前的版本,版本号由三个数字组成,例如9.5.3。

在这些情况下,主要版本由版本号的前两个数字组(例如9.5)组成,次要版本是第三个数字,

例如3,这意味着这将是主要版本9.5的第三次要版本。

数据库升级分为两种,一种是小版本迭代升级,另一种是主板本升级。小版本升级很简单,只需要重启一下数据库即可。要在兼容的版本间升级,你只需要简单地在服务器关闭时替换可执行文件并重启服务器。 数据目录则保持不变--次要升级就这么简单。

PostgreSQL版本发布规则,一年一个大版本,一个季度一个小版本;PG遇到的BUG问题,社区会很快进行修复,并在下一个版本中发布,因此有必要进行对数据库版本升级。

对于PostgreSQL的主发行, 内部数据存储格式常被改变,这使升级复杂化。传统的把数据移动到新主版本的方法是先转储然后重新载入到数据库,不过这可能会很慢,所以使用 一种更快的方式pg_upgrade。

目前PG大版本的升级方法主要有以下四种方式:

1.转储数据的方式(pg_dump或pg_dumpall导出数据,pg_restore或psql导入)

2.通过pg_upgrade进行升级

3.pg_logical 扩展进行升级

  1. 通过内置逻辑复制的方式进行版本升级

环境准备

2.1 安装PG9.6

1.创建用户

groupadd -g 70000 pg96

useradd -u 70000 -g pg96 pg96

echo "pg96" | passwd --stdin pg96

2.创建目录

mkdir -p /pg96/{pgdata,archive,scripts,backup,postgresql,soft}

cp /opt/postgresql-9.6.0.tar.gz /pg96/soft/

chown -R pg96:pg96 /pg96

chmod -R 775 /pg96

3.安装依赖

yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel

yum install -y zlib-devel perl python36 tcl openssl ncurses-devel openldap pam

yum install -y zlib libicu

4.编译

su - pg96

cd /pg96/soft

tar zxvf postgresql-9.6.0.tar.gz

cd postgresql-9.6.0

./configure --prefix=/pg96/postgresql --without-readline

make -j 4 && make install

5.环境变量

cat >> ~/.bash_profile <<"EOF"

export LANG=en_US.UTF-8

export PS1="[\u@\h \W]\$ "

export PGPORT=5400

export PGDATA=/pg96/pgdata

export PGHOME=/pg96/postgresql

export PGUSER=postgres

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

EOF

source ~/.bash_profile

6.初始化

su - pg14

/pg96/postgresql/bin/initdb -D /pg96/pgdata -E UTF8 --locale=en_US.utf8 -U postgres

7.修改参数文件

cat >> /pg96/pgdata/postgresql.conf <<"EOF"

listen_addresses = '*'

port=5400

logging_collector = on

log_directory = 'pg_log'

log_filename = 'postgresql-%a.log'

log_truncate_on_rotation = on

EOF

cat > /pg96/pgdata/pg_hba.conf << EOF

# TYPE DATABASE USER ADDRESS METHOD

local all all trust

host all all 127.0.0.1/32 trust

host all all 0.0.0.0/0 md5

host replication all 0.0.0.0/0 md5

local replication all trust

EOF

8.启动

su - pg96

pg_ctl start

pg_ctl status

netstat -anp | grep 5400

2.2 安装PG14.9

1.创建用户

groupadd -g 60000 pg14

useradd -u 60000 -g pg14 pg14

echo "pg14" | passwd --stdin pg14

2.创建目录

mkdir -p /pg14/{pgdata,archive,scripts,backup,postgresql,soft}

cp /opt/postgresql-14.9.tar.gz /pg14/soft/

chown -R pg14:pg14 /pg14

chmod -R 775 /pg14

3.安装依赖

yum install -y cmake make gcc zlib gcc-c++ perl readline readline-devel

yum install -y zlib-devel perl python36 tcl openssl ncurses-devel openldap pam

yum install -y zlib libicu

4.编译

su - pg14

cd /pg14/soft

tar zxvf postgresql-14.9.tar.gz

cd postgresql-14.9

./configure --prefix=/pg14/postgresql --without-readline

make -j 4 && make install

3. 9.6.0升级到14.9

3.1 设置权限

chown -R pg96:pg96 /pg14

3.2 新版本初始化

su - pg96

rm -rf /pg14/pgdata

/pg14/postgresql/bin/initdb -D /pg14/pgdata -E UTF8 --locale=en_US.utf8 -U postgres

3.3 检查兼容性

/pg14/postgresql/bin/pg_upgrade -c -k -b /pg96/postgresql/bin -B /pg14/postgresql/bin -d /pg96/pgdata -D /pg14/pgdata -p 5400 -P 5432

3.4 创建测试数据

postgres=# create database testdb;

[pg96@centos79 ~]$ pgbench -i -s 10 -U postgres testdb

3.5 执行升级

pg_upgrade升级有三种方式。

1)常规复制方式;不会对旧集簇产生影响,但是当数据文件大时速度慢。

/pg14/postgresql/bin/pg_upgrade -b /pg96/postgresql/bin -B /pg14/postgresql/bin -d /pg96/pgdata -D /pg14/pgdata -p 5400 -P 5432

2)link链接方式;以硬链接方式重用旧的用户数据文件来执行快速升级,节省磁盘空间,但升级后旧集簇不可用,恢复耗时。

/pg14/postgresql/bin/pg_upgrade -k -b /pg96/postgresql/bin -B /pg14/postgresql/bin -d /pg96/pgdata -D /pg14/pgdata -p 5400 -P 5432

3)clone 克隆方式;结合以上两者的优势,它支持在Linux(内核4.5或更高版本)上的Btrfs和XFS(在文件系统创建reflink支持)。

/pg14/postgresql/bin/pg_upgrade --clone -b /pg96/postgresql/bin -B /pg14/postgresql/bin -d /pg96/pgdata -D /pg14/pgdata -p 5400 -P 5432

升级前需要关闭源库

[pg96@localhost pgdata]$ pg_ctl stop

waiting for server to shut down.... done

server stopped

[pg96@centos79 ~]$ /pg14/postgresql/bin/pg_upgrade -k -b /pg96/postgresql/bin -B /pg14/postgresql/bin -d /pg96/pgdata -D /pg14/pgdata -p 5400 -P 5432

3.6 配置文件

cat >> /pg14/pgdata/postgresql.conf <<"EOF"

listen_addresses = '*'

port=5432

logging_collector = on

log_directory = 'pg_log'

log_filename = 'postgresql-%a.log'

log_truncate_on_rotation = on

EOF

cat > /pg14/pgdata/pg_hba.conf << EOF

# TYPE DATABASE USER ADDRESS METHOD

local all all trust

host all all 127.0.0.1/32 trust

host all all 0.0.0.0/0 md5

host replication all 0.0.0.0/0 md5

EOF

新版本的postgresql.conf和pg_hba.conf等配置文件匹配旧集簇参数

3.7 修改环境变量

cat >> ~/.bash_profile <<"EOF"

export LANG=en_US.UTF-8

export PS1="[\u@\h \W]\$ "

export PGPORT=5432

export PGDATA=/pg14/pgdata

export PGHOME=/pg14/postgresql

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

EOF

source ~/.bash_profile

3.8收集统计信息

[pg96@centos79 ~]$ pg_ctl start

/home/pg96/delete_old_cluster.sh

[pg96@centos79 ~]$ /pg14/postgresql/bin/vacuumdb --all --analyze-in-stages

3.9 校验数据

[pg96@centos79 ~]$ psql

postgres=# \l

postgres=# \c testdb postgres

testdb=# \dt

testdb=# select version();

posted @   好运无敌  阅读(282)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示