在这篇博文中,我们将探讨pg_dump / pg_restore ,这是执行PostgreSQL升级最常用的选项之一。 了解pg_dump和pg_restore实用程序有用的方案非常重要。
这篇文章是我们升级或迁移你的Legacy PostgreSQL到新的PostgreSQL版本系列的第二篇,我们将探索可用于升级PostgreSQL数据库的不同方法。
关于pg_dump
pg_dump是一个执行单个数据库备份的实用程序。 除非您使用单独的命令并行执行此操作,否则无法备份多个数据库。 如果您的升级计划需要复制全局对象,则pg_dump需要由pg_dumpall补充。 要了解有关pg_dumpall的更多信息,请参阅我们之前的博客文章 。
pg_dump格式
pg_dump可以生成多种格式的转储 - 纯文本和自定义格式 - 每种格式都有自己的优势。 当您将pg_dump与自定义格式( - Fc )一起使用时,必须使用pg_restore来恢复转储
如果使用纯文本格式转储,则pg_dump会生成多个SQL命令的脚本文件。 它可以使用psql恢复
但是,自定义格式转储是压缩的,是不可读的。
与自定义格式转储相比,以纯文本格式转储的转储的大小可能略大。
有时,您可能希望在还原之前在目标PostgreSQL数据库中执行架构更改,例如,表分区。 或者,您可能希望仅从转储文件中还原选定的对象列表。
在这种情况下,您无法从数据库的纯格式转储中还原选定的表列表。 如果以自定义格式获取数据库转储,则可以使用pg_restore,它将帮助您选择一组特定的表进行恢复。
涉及升级的步骤
要记住的最重要的一点是,应该使用最新的二进制文件执行转储和恢复。 例如,如果我们需要从版本9.3迁移到版本11,我们应该使用PostgreSQL 11的pg_dump二进制文件连接到9.3。
当服务器配备两个不同版本的二进制文件时,最好从最新版本指定pg_dump的完整路径,如下所示:
/usr/lib/postgresql/11/bin/pg_dump <connection_info_of_source_system> <options>获得全局转储
在PostgreSQL中,用户/角色是数据库集群的全局,同一用户可以拥有不同数据库中对象的权限。 这些被称为“Globals”,因为它们适用于实例中的所有数据库。 尽早在目标系统中创建全局变量非常重要,因为其他DDL可能包含对这些用户/角色的GRANT。 在导入目标系统之前,最好将全局变量转储到文件中并检查文件。 这可以使用以下命令实现:
/usr/lib/postgresql/11/bin/pg_dumpall -g -p 5432 > tmp/globals_only.sql由于这会生成一个纯SQL转储文件,因此可以将其提供给连接到目标服务器的psql 。 如果不需要修改,可以使用下一个示例中的命令将全局变量直接传送到目标服务器。 由于这是一个普通的SQL转储文件,因此可以将其提供给psql进行恢复。
/usr/lib/postgresql/11/bin/pg_dumpall -g <source_connection_info> | psql -p <destination_connection_info>上述命令适用于本地服务器的升级。 如果要升级到远程数据库服务器,则可以在<destination_connection_info >中为主机名添加其他参数。
仅转储Schema
迁移的下一个阶段涉及创建模式对象。 此时,您可能希望将不同的数据库对象移动到不同的表空间,并对一些表进行分区。 如果此类架构修改是计划的一部分,那么我们应该将架构定义提取到纯文本文件。下面的命令,可以用来实现这一点:
/usr/lib/postgresql/11/bin/pg_dump -s -d databasename -p 5432 > tmp/schema_only.sql通常,大多数数据库对象不需要任何修改。 在这种情况下,最好使用PIPE将模式对象本身转储到目标数据库中,使用类似的命令:
/usr/lib/postgresql/11/bin/pg_dump -s -d databasename <source_connection> | psql -d database <destination_connection>一旦创建了所有模式对象,我们就应该只删除那些需要修改的对象。 然后我们可以使用修改后的定义重新创建它们。
复制数据
这是大多数数据在数据库服务器之间传输的阶段。 如果源和目标之间有良好的带宽,我们应该在这个阶段寻求实现最大的并行性。 在许多情况下,我们可以分析外键依赖关系层次结构并以一组表的并行批处理方式导入数据。 使用-a或--data-only仅 数据标志pg_dump可以进行仅数据复制。
复制各个表的数据
您可能必须将架构更改作为升级的一部分进行合并。 在这种情况下,您可以单独复制几个表的数据。 我们在这里提供一个例子:
/usr/lib/postgresql/11/bin/pg_dump <sourcedb_connection_info> -d <database> -a -t schema.tablename | psql <destinationdb_connection_info> <databasename>可能存在特殊情况,您只需要附加部分数据选择。 这尤其发生在时间序列数据上。 在这种情况下,您可以使用带有WHERE子句的复制命令来提取和导入特定数据。 您可以在以下示例中看到此信息:
/usr/lib/postgresql/11/bin/psql <sourcedb_connection_info> -c "COPY (select * from <table> where <filter condition>)” > /tmp/selected_table_data.sql摘要
如果您需要使用修改后的架构和无膨胀关系执行PostgreSQL服务器的更快升级,pg_dump / pg_restore可能会很有用。
文章翻译自http://okbob.blogspot.com/2019/03/how-to-split-string-to-array-by.html




