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 扩展进行升级
- 通过内置逻辑复制的方式进行版本升级
环境准备
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(); |