描述
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输出类似我上面的结果,但是....很多情况下由于一些数据格式不兼容、或者参数问题,常常会出现升级失败的现象。这时候就要具体问题具体解决了。不过大致思路是上面的没错...