1. 小版本软件升级
小版本不会改变内部存储格式且向上兼容,因此小版本升级只需安装新可执行文件并启动数据库实例即可。
1.1 数据备份--确保可回退
-- 数据备份 pg_dump -h localhost -U postgres db_name > db_name.sql -- 软件备份 tar -zcvf $PGDATA $PGHOME pg.tgz
1.2 安装新版本软件
1.3 配置新环境变量及参数postgresql.conf等文件
1.4 启动服务
systemctl restart postgresql
1.5 检查确认
2. 大版本软件升级
大版本有可能更新系统表结构,内置函数等变化,因此大版本升级可以将数据转储成文件在导入新版本的方式实现软件升级;也可以通过pg_upgrade,pg_logical或逻辑复制的方式实现。
2.1 升级途径
1)备份还原
2)pg_upgrade
3)pg_logical
2.2 升级步骤
2.2.1 备份还原方式
1)软件安装
./configure --prefix=/ups/app/pgsql-12 --with-pgport=1988 --with-openssl --with-systemd
make world
make install-world
2)备份旧版本配置文件
su - postgres mkdir -p ~/confbk cp ${PGDATA}/*.conf ~/confbk/
3)更新新版本软件的参数配置
-- 覆盖pg_hba.conf cp ~/confbk/pg_hba.conf ${NEWPGDATA}/pg_hba.conf cp ~/confbk/postgresql.conf ${NEWPGDATA}/pg_<old_version>.conf vi ${NEWPGDATA}/postgresql.conf -- 查找include参数并执行旧版本配置文件${NEWPGDATA}/pg_<old_version>.conf include = 'pg_<old_version>.conf'
4)配置数据库为只读模式
alter database <dbname> set default_transaction_read_only = TRUE; --检查是否有活动连接 select state,count(*) cnt from pg_stat_activity where pid <> pg_backend_pid() group by state;
5)备份数据到文件
su - postgres pg_dumpall -p 1921 >backup.sql
6)还原数据到新版本
su - postgres psql -p 1988 -f backup.sql
--整合命令 pg_dumpall -p 1921 | psql -p 1988
7)启动新版本
systemctl start postgresql-12
8)检查确认
2.2.2 pg_upgrade方式
-- 单机或主库升级
1)安装新版本软件及初始化数据目录
2)检查兼容性
pg_upgrade --old-port=1921 --old-bindir=/ups/app/pgsql-11/bin --new-bindir=/ups/app/pgsql-12/bin --old-datadir=/ups/data/pgdata/11/pg_root --new-datadir=/ups/data/pgdata/12/pg_root --check
3)升级
# 3.1)普通模式升级 pg_upgrade --old-port=1921 --old-bindir=/ups/app/pgsql-11/bin --new-bindir=/ups/app/pgsql-12/bin --old-datadir=/ups/data/pgdata/11/pg_root --new-datadir=/ups/data/pgdata/12/pg_root # 3.2)连接模式升级 pg_upgrade --old-port=1921 --old-bindir=/ups/app/pgsql-11/bin --new-bindir=/ups/app/pgsql-12/bin --old-datadir=/ups/data/pgdata/11/pg_root --new-datadir=/ups/data/pgdata/12/pg_root --link ### 当使用连接模式运行pg_upgrade后,程序将旧版本数据目录中的pg_control重命名为pg_control.old
4)更新统计信息
${PGHOME}/bin/vacuumdb -p 1988 -a --analyze-in-stages
5)启动并验证
6) 升级后处理
如果需要做任何升级后处理,pg_upgrade 将在完成后发出警告。它也将 生成必须由管理员运行的脚本文件。这些脚本文件将连接到每一个需要做 升级后处理的数据库。每一个脚本应该这样运行:
psql --username=postgres --file=script.sql postgres
这些脚本可以以任何顺序运行并且在运行之后立即删除。
-- 升级从库
1)配置同步复制模式
select application_name, client_addr, sync_state from pg_stat_replication; -- 修改 ${PGDATA}/postgresql.conf 参数 "synchronous_standby_names = '*' " vi ${PGDATA}/postgresql.conf synchronous_standby_names = '*' -- 加载配置 psql -p 1921 select pg_reload_conf();
2)关闭集群并校验检查点
--先关闭主库,后关闭从库 pg_clt -m fast stop -- pg_controldata确认检查点 ${PGHOME}/bin/pg_controldata | grep "Latest checkpoint location"
3)升级主库到新版本
同上pg_upgrade方式升级步骤
4)升级从库
--备份从库配置文件
-- 复制新版本主库数据库目录到备库
-- 应用旧从库配置文件
5)启动新版本主库及从库
--启动主库 pg_ctl start --启动从库 pg_ctl start
6)检查
select version(); select application_name, client_addr, sync_state from pg_stat_replication;
2.2.3 pg_logical方式(逻辑复制)
限制条件
1)9.4以上版本 2)每张表必须有主键或replica identity 3)不能复制 unlogged和临时表 4)无法复制DDL(升级期间DDL) 5)一次只复制实例中的一个database
1)实例化新版本数据目录
2)启动新版本
pg_ctl start
3)从低版本导入schema到新版本
${PGHOME}/bin/pg_dump -Fp -v -c -s -h localhost -p 1921 -d devdb |${PGHOME}/bin/psql -p 1988 -d devdb