pg_upgrade
pg_upgrade (以前的pg_migrator - 直到PostgreSQL 8.4)是一个内置工具,有助于将旧版PostgreSQL服务器升级到新版本,而无需转储和恢复。可以使用pg_upgrade升级PostgreSQL的最旧版本是8.4.x. 考虑到系统表是两个主要版本之间发生最大变化的表,它能够执行更快的升级。内部数据存储格式受影响较小。
实际上,在我们的一个测试中,我们能够在不到10秒的时间内将2 TB数据库服务器从PostgreSQL 9.6.5升级到11.1。
流程概述
要了解它是如何工作的,请考虑运行在9.3.3上的PostgreSQL服务器,该服务器需要升级到PostgreSQL 11。在开始升级过程之前,应该在服务器上安装新的PostgreSQL版本的二进制文件 - 比如PostgreSQL 11.2。
准备和一致性检查
安装新的PostgreSQL版本后,使用新的二进制文件初始化一个新的数据目录,并在另一个端口启动它,即在我们的示例中与PostgreSQL 9.3.3使用不同的端口。使用pg_upgrade在两个服务器(PG 9.3.3和PG 11.2)之间执行一致性检查 - 在两个不同的端口上运行。如果您遇到任何错误,例如缺少扩展,则需要在继续升级之前修复这些错误。一旦通过一致性检查,您就可以继续了。
如果在执行一致性检查时出现错误,那么日志看起来是这样的
$ usr/pgsql-11/bin/pg_upgrade -b usr/pgsql-9.3/bin -B usr/pgsql-11/bin -d var/lib/pgsql/9.3/data -D var/lib/pgsql/11/data_new -c## Performing Consistency Checks on Old Live ServerChecking cluster versions okChecking database user is the install user okChecking database connection settings okChecking for prepared transactions okChecking for reg* data types in user tables okChecking for contrib/isn with bigint-passing mismatch okChecking for invalid "unknown" user columns okChecking for hash indexes okChecking for roles starting with "pg_" okChecking for incompatible "line" data type okChecking for presence of required libraries fatalYour installation references loadable libraries that are missing from thenew installation. You can add these libraries to the new installation,or remove the functions using them from the old installation. A list ofproblem libraries is in the file: loadable_libraries.txt
Failure, exiting
$ cat loadable_libraries.txt
could not load library "$libdir/pg_repack": ERROR: could not access file "$libdir/pg_repack": No such file or directory
为了避免错误,在此示例中,您需要为新的PostgreSQL版本安装此缺少的扩展pg_repack,并重新运行检查以确保所有检查都已通过且没有收到任何错误。
进行升级
一旦通过,您可以采用两种方式。第一种选择是让pg_upgrade将旧数据目录的数据文件复制到由新PostgreSQL版本初始化的新数据目录中。第二个选项是让pg_upgrade使用硬链接而不是复制数据文件。复制几TB的数据库可能非常耗时。使用硬链接方法使得该过程非常快,因为它不涉及复制文件。
要使用带有pg_upgrade的硬链接,可以传递一个额外的参数-k,如下面的命令所示。
$ /usr/pgsql-11/bin/pg_upgrade -b /usr/pgsql-9.3/bin -B /usr/pgsql-11/bin -d /var/lib/pgsql/9.3/data -D /var/lib/pgsql/11/data_new -k在Unix文件系统中,文件或目录是指向存储在其中的元数据(磁盘块位置、属性等)的inode(索引节点)的链接。每个inode由整数或inode编号标识。当您将pg_upgrade与硬链接一起使用时,它会在新数据目录内部创建另一个文件/目录,该目录链接到与该文件/目录的旧数据目录中相同的inode。因此,它会跳过对象的物理副本,但会创建每个对象并将它们链接到同一个inode。
这样可以减少磁盘IO并避免在服务器中占用额外空间。需要注意的一点是,只有在同一文件系统上升级PostgreSQL时,此选项才有效 。这意味着,如果要在数据库升级期间升级到新磁盘或更快的磁盘,则硬链接选项不起作用。在这种情况下,您需要使用文件复制方法。
本文翻译自:https://www.percona.com/blog/2019/04/12/fast-upgrade-of-legacy-postgresql-with-minimum-downtime-using-pg_upgrade/




