当前位置: 首页>数据库>正文

pg_upgrade升级postgresql pg数据库update

 

描述

pg_upgrade(以前称为pg_migrator)允许存储在PostgreSQL数据文件中的数据升级到更高的PostgreSQL主版本,而不需要进行主版本升级所需的数据的dump/restore,例如把版本从10.7升级到11.2。

PostgreSQL大版本会定期添加新特性,这些新特性通常会改变系统表的布局,但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。如果将来的主要版本改变了数据存储格式,使旧的数据格式变得不可读,pg_upgrade将不能用于这种升级。(社区会尽量避免这种情况。)

参数

-b (--old-bindir=bindir): 旧的集群可执行目录。

-B (--new-bindir=bindir): 新的集群可执行目录。

-d (--old-datadir=configdir): 旧的集群数据目录。

-D (--new-datadir=configdir): 旧的集群数据目录

-k (--link):link模式,相对于克隆模式,克隆模式需要将文件复制到新的集群。

-c (--check):只做“检查”,不改变任何数据。它将进行许多一致性检查。在进行大版本升级前,总是首先使用这个命令来进行升级前的预检。

更多信息可通过pg_upgrade --help进行查询。

 

流程

1. 在开始使用实际的pg_upgrade命令升级之前,我们应该先使用备份工具对源数据库进行备份。

比如:pgBackRest 

2、使用pg_upgrade进行升级。

①安装高版本的二进制文件。为了区分高版本和低版本的安装目录,可能需要修改老的数据集群目录,并且新的服务器使用基于特定版本的安装目录。比如源实例是目录为/usr/pgsql-10.0/bin,新的高版本的目录为/usr/pgsql-12.0/bin。

②初始化新的PostgreSQL集群。

通过initdb初始化新的集群,并且,要用兼容旧数据库实例的initdb 选项。

/usr/pgsql-12.0/bin/initdb --username=root --encoding=UTF8 --lc-collate=C --lc-ctype=en_US.utf8  --data-checksums -D /var/lib/pgsql/12/data

③停掉源库的连接,停掉源库。

/usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data/ -mf stop

④使用pg_upgrade --check命令,进行大版本的预检。

/usr/pgsql-12.0/bin/pg_upgrade --old-bindir=/usr/pgsql-10.0/bin --new-bindir=/usr/pgsql-12.0/bin --old-datadir=/var/lib/pgsql/10/data/ --new-datadir=/var/lib/pgsql/12/data/ --link --check

输出结果示例:

Performing Consistency Checks on Old Live Server
------------------------------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok

*Clusters are compatible*

⑤执行升级:pg_upgrade去掉-c(--check)

/usr/pgsql-12.0/bin/pg_upgrade --old-bindir=/usr/pgsql-10.0/bin --new-bindir=/usr/pgsql-12.0/bin --old-datadir=/var/lib/pgsql/10/data/ --new-datadir=/var/lib/pgsql/12/data/ --link --check

Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Creating dump of global objects                             ok
Creating dump of database schemas
  postgres
  template1
  testextenddb
                                                            ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok

Could not create a script to delete the old cluster's data files
because user-defined tablespaces or the new cluster's data directory
exist in the old cluster directory.  The old cluster's contents must
be deleted manually.

real    0m9.514s
user    0m0.125s
sys 0m0.448s

 

理想情况下,升级能够正常完成,即pg_upgrade输出类似我上面的结果,但是....很多情况下由于一些数据格式不兼容、或者参数问题,常常会出现升级失败的现象。这时候就要具体问题具体解决了。不过大致思路是上面的没错...

 

 

 

 


https://www.xamrdz.com/database/6hp1924649.html

相关文章: