gptransfer
描述
gptransfer工具将数据库对象从源Greenplum数据库系统复制到目标系统。用户可以执行以下类型的操作之一
用--full选项拷贝Greenplum数据库系统。
这一选项将源系统中所有用户创建的数据库复制到不同的目标系统。如果指定 --full选项,则必须同时指定源系统和目标系统。目标系统不能包含任何用户定义的数据库,只能包含默认数据库postgres、template0和template1。
将一组用户定义的数据库表复制到目标系统。 -f和-t将一组用户定义的数据库表复制到目标系统。-d选项复制所有用户定义的表、表数据,并从指定的数据库重新创建表索引。
如果目标系统与源系统相同,则还必须使用--dest-database选项指定目标数据库。 指定目标数据库时,源数据库表将被复制到指定的目标数据库中。
对于分区表,可以使用-f选项指定 --partition-transfer-non-partition-target或 --partition-transfer选项,以从源数据库复制分区表的特定叶子分区。 叶子分区是分区数据库的最低级分区。对于 --partition-transfer选项,目标表是叶子分区。对于 --partition-transfer-non-partition-target 选项,目标表是非分区表。
如果指定了一组无效的gptransfer选项或者指定的源表或数据库不存在,则gptransfer将返回一个错误并退出。不会有数据被复制。
使用gptransfer工具在Greenplum数据库系统之间复制数据库对象:
- 使用源数据库系统上的Greenplum数据库工具gpfdist,gpfdists协议不受支持。
- 使用源数据库系统上的可写外部表和目标数据库系统上可读外部表。
- 使用在可写外部表和可读外部表之间传输数据的命名管道。
将数据复制到目标系统时,将在目标系统的Greenplum数据库的Segment上重新分配。这是gptransfer复制数据库数据时的数据流:
可写外部表 > gpfdist > 命名管道 > gpfdist > 可读外部表
有关使用gptransfer传输数据的信息,请见Greenplum数据库管理员指南中的“使用gptransfer迁移数据”。
在传输整个数据库时,数据库中的方案和表名称只能包含字母数字字符和下划线字符(_)。另外,不支持Unicode字符。将数据库、方案或表指定为选项或文件时,应用相同的命名限制。
注解
gptransfer工具有效地传输大量数据的表。由于设置并行传输所需的开销,因此建议不要使用该工具传输少量数据的表。使用其他方法例如COPY命令,将模式和较小的表复制到目标数据库可能更有效,然后使用gptransfer批量传输大型表。
当在不同的Greenplum数据库系统之间复制数据库数据时,gptransfer 需要一个文本文件来列出所有的源Segment主机名和IP地址。使用--source-map-file选项指定文件的名称和位置。 如果文件丢失或没有列出所有的Segment主机,gptransfer返回一个错误并退出。请参阅文件格式信息选项的说明。
源和目标Greenplum数据库的Segment主机需要能够相互通信。 为了确保Segment主机可以通信,可以使用Linuxnetperf工具。
如果为源Greenplum数据库系统创建了文件空间,则目标系统上必须存在相应的文件空间。
在使用gptransfer之前,必须在两个系统之间交换SSH密钥。gptransfer工具使用SSH连接到源系统以创建命名管道并启动gpfdist 实例。用户可以使用Greenplum数据库的gpssh-exkeys工具以及所有源和目标主要主机的列表在Greenplum数据库主机之间交换密钥。
源系统和目标系统必须能够访问gptransfer工作目录。默认目录是用户的主目录。用户可以使用 --work-base-dir选项指定不同的目录。
gptransfer工具在Master主机的~/gpAdminLogs目录中记录消息。gptransfer在每次运行的当天用名称gptransfer_date.log创建日志文件并且将消息追加到其中。用户可以使用-l log_directory选项为日志文件指定一个不同的目录。
名为~/gptransfer_process_id的工作目录在源群集中的Segment主机上被创建。gptransfer创建的gpfdist实例的日志文件位于这些目录中。将--gpfdist-very-verbose选项添加到gptransfer命令行将提高gpfdist日志记录级别。
gptransfer工具不会更改配置文件,如postgres.conf和pg_hba.conf。用户必须单独设置目标系统配置。
gptransfer工具不会更改外部对象,如Greenplum数据库扩展、第三方jar文件和共享对象文件。用户必须单独安装外部对象。
除非指定--full选项,否则gptransfer工具不会更改依赖的数据库对象。例如,如果某个表的默认值是用户定义函数的列,则在使用-t、-d或-f选项时,该函数必须存在于目标系统数据库中。
如果使用-d、-t或-f选项移动一组数据库表,并且目标表或数据库不存在,gptransfer将创建它。该工具在复制数据之前重新创建表上的任何索引。
如果目标系统上存在表,并且没有指定选项--skip-existing、--truncate或--drop,gptransfer将返回错误并退出。
如果在复制表的过程中发生错误,或者表验证失败,则gptransfer将继续复制其他指定的表。gptransfer 完成之后,它会显示出现错误的表的列表,将失败的表的名称写入文本文件,然后打印文件的名称。用户可以使用这个文件和gptransfer -f选项来重试复制表。
包含发生错误的表的列表的文件的名称是failed_migrated_tables_yyyymmdd_hhmmss.txt。yyyymmdd_hhmmss是gptransfer进程启动时的时间戳。该文件在gptransfer执行目录中创建。
gptransfer完成复制数据库对象后,该工具会将复制到目标数据库的每个表的行数与源数据库中的表进行比较。该工具返回每个表的验证结果。用户可以通过指定--no-final-count选项来禁用对表行的计数验证。
注意: 如果行数不匹配,则不会将该表添加到列出发生传输错误的表的文件中。
gp_external_max_segs服务器配置参数控制可同时访问单个gpfdist实例的Segment实例的数量。设置较低的值可能会影响gptransfer的性能。有关参数的信息,请参阅Greenplum数据库参考指南。
对于源系统和目标系统的限制
如果要将数据量较大的系统中的数据复制到Segment主机数量较少的系统,则目标系统上的主Segment总数必须大于或等于源系统Segment主机总数 。
例如,假设一个目标系统总共有24个主Segment。这意味着源系统不能超过24个Segment主机。
从主Segment实例数量大于目标系统的源Greenplum数据库系统复制数据时,与从Segment实例数少于目标系统的情况相比,数据传输可能会更慢。gptransfer工具在两种情况下会使用命名管道和gpfdist实例的不同配置。
-a
安静模式,不要提示用户进行确认。
--analyze
在非系统表上运行ANALYZE命令。默认不运行ANALYZE命令。
--base-port=base_gpfdist_port
源Segment系统上的gpfdist基础端口。如果未指定,则默认值为8000。
--batch-size=batch_size
设置gptransfer并发复制到目标数据库的表的最大数量。如果未指定,则默认值为2。最大值为10。
注意: 如果传输的顺序很重要,请指定值1。这些表将根据-t和-f选项中指定的顺序进行顺序传输。
-d database
要复制的源数据库。可以多次指定此选项以将多个数据库复制到目标系统。所有用户定义的表和表数据都被复制到目标系统。
可以使用Python正则表达式语法来指定一组数据库。正则表达式模式必须以斜线(/RE_pattern/)包起来。如果使用正则表达式,则名称必须用双引号(“)包围。例子-d “demo/.*/“指定Greenplum数据库安装中以demo开头的所有数据库。
注意: 以下两个-d选项的例子是等价的。它们都指定一组数据库,以demo开始,以零个或多个数字结尾。
-d "/demo[0-9]*/"
如果源数据库不存在,gptransfer会返回一个错误并退出。如果目标数据库不存在,则创建一个数据库。
不适用于--full、-f、-t、--partition-transfer或--partition-transfer-non-partition-target选项。
或者,指定-t 或-f选项来复制指定的一组表。
--delimiter=delim
用于由gptransfer创建的可写外部表的分隔符。指定一个单独的ASCII字符,用于分隔每行数据中的列。默认值是一个逗号(,)。如果delim是逗号(,)或未指定此选项,则gptransfer将把CSV格式用于可写外部表。否则,gptransfer使用TEXT格式。
如果未指定--delimiter、--format和--quote选项,则这些是可写外部表的设置:
FORMAT ‘CSV’ ( DELIMITER ‘,’ QUOTE E’\001’ )
用户可以指定格式为”\digits”(八进制)的分隔字符,例如非打印字符。即反斜线后面接上字符的八进制值。八进制格式必须被封闭在双引号中。这个例子指定了八进制字符\001,SOH字符:
--dest-database=dest_database_name
目标Greenplum数据库系统中的数据库。 如果未指定,则将源表复制到与源系统数据库具有相同名称的目标系统数据库中。
如果源和目标Greenplum数据库系统相同,则此选项是必需的。
如果目标数据库不存在,则会创建它。
不适用于--full、samp class=”ph codeph”>—partition-transfer或--partition-transfer-non-partition-target选项。
--dest-host=dest_host
目标Greenplum数据库主机名或IP地址。如果未指定,则默认为运行gptransfer的系统的主机(127.0.0.1)。
--dest-port=dest_port
目标Greenplum数据库端口号,如果未指定,则默认为5432。
--dest-user=dest_user
用于连接到目标Greenplum数据库系统的用户标识。 如果未指定,则默认为用户gpadmin。
--drop
指定此选项以删除目标数据库中已存在的表。 在复制表数据之前,gptransfer会删除表并重新创建表。
最多只能指定--skip-existing--truncate或--drop中的一个选项。如果没有指定其中的一个,并且目标系统中存在该表,gptransfer将返回一个错误并退出。
不适用于--full、--partition-transfer或--partition-transfer-non-partition-target选项。
--dry-run
信息显示在命令行并写入日志文件。
-f table-file
包含要从Greenplum数据库源系统复制的完整表名的列表的文件的位置和名称。 在文本文件中,每行指定一个完全限定的表(database.schema.table)。
可以使用Python正则表达式语法来指定一组表。有关使用正则表达式的信息,请参阅-d 选项。
如果源表不存在,gptransfer将返回错误并退出。如果目标数据库或表不存在,则创建该目标数据库或表。
只复制表和表数据并重新创建索引。依赖对象不被复制。
用户不能指定视图或系统目录表。--full选项复制用户定义的视图。
如果指定-d选项来复制数据库中的所有表,则不能从数据库中指定单个表。
对于--full、-d或-t选项无效。
--partition-transfer (分区的目标表)
使用-f选项指定此选项可将分区表的叶子分区表中的数据从源数据库复制到目标数据库中的叶子分区表。由-f选项指定的文本文件包含具有此语法的完全限定叶子分区表名称的列表。
src_db.src_schema.src_prt_tbl[, dst_db.dst_schema.dst_prt_tbl]
通配符在完全限定的表名称中不受支持。 目标分区表必须存在。如果在文件中未指定目标叶子分区表,那么gptransfer会将数据复制到目标Greenplum数据库系统中相同的完全限定的表名(db_name.schema.table)。如果源和目标Greenplum数据库系统相同,则必须指定一个目标表,其中源表和目标表中至少有一项必须不同:db_name、schema或table。
如果源表或目标表不是叶子分区,则该工具 将返回一个错误,并且不传输数据。
对于源数据库和目标数据库中的分区表,这些特性必须相同。
- 表列的数量以及列数据类型的顺序(源和目标在表名和表列名上可以不同)
- 指定的源和目标表的分区级别
- 在分层结构(分区类型和分区列)中指定的源和目标叶子分区和子分区的分区标准
这个选项对这些选项无效: -d、--dest-database、 --drop、-F、 --full、--schema-only、 -T、-t。
注意: 如果目标表不为空,或者源或目标表中的数据在传输操作(插入或删除行)过程中发生更改,则由于行计数不匹配而导致表行计数验证失败。
如果目标表不为空,则可以在传输操作之前指定-truncate选项以截断表。
用户可以指定-x选项以在传输操作期间获取表上的排它锁。
--partition-transfer-non-partition-target (非分区的目标表)
使用-f选项指定此选项可将数据从源数据库中的分区表的叶子分区表复制到目标数据库中的非分区表。-f 选项指定的文本文件包含源数据库中完全合格的叶子分区表名称列表,以及包含此语法的目标数据库中的非分区表名称。
通配符在完全限定的表名称中不受支持。 目标表必须存在,并且文件中需要源表名和目标表名
如果源表不是叶子分区表或目标表不是一个正常(非分区)表,该工具返回一个错误,并没有数据传输。
如果源和目标Greenplum数据库系统相同,则必须指定一个目标表,其中源表和目标表中至少有一项必须不同:db_name、 schema或table。
对于源数据库中的分区表和目标数据库中的表,表列数和列数据类型的顺序必须相同(源和目标表列名称可以不同)
可以在文件中为属于单个分区表的多个源叶子分区表指定相同的目标表。不支持将属于不同分区表的源叶子分区表中的数据传输到单个非分区表。
这个选项对这些选项无效: -d、--dest-database、 --drop、-F、 --full、--schema-only、 -T、-t、 --truncate、 --validate。
注意: 如果源表或目标表中的数据在传输操作期间发生更改(插入或删除行),则由于行计数不匹配,表行计数验证将失败。
用户可以指定-x选项以在传输操作期间获取表上的排它锁。
-F table-file
文件的位置和名称,其中包含要排除传输到目标系统的完整表名的列表。 在文本文件中,每行指定一个完全限定的表格。
可以使用Python正则表达式语法来指定一组表。 有关使用正则表达式的信息,请参阅-d选项。
在开始传输之前,该工具从正在传输到目标数据库的表的列表中除去排除的表。 如果排除表导致不传输表,则不会在目标系统中创建数据库或模式。
如果源表不存在,gptransfer将显示警告。
用户不能指定视图或系统目录表。
不适用于--full、--partition-transfer或 --partition-transfer-non-partition-target 选项。
用户可以指定--dry-run选项来测试命令。 -v选项显示并记录排除的表。
--format=[CSV | TEXT]
指定由 gptransfer创建的可写外部表格的格式来传输数据。逗号分隔值的值为 CSV,纯文本为 TEXT默认值是 CSV。
如果未指定--delimiter、--format和 --quote选项,则这些是可写外部表的默认设置:
FORMAT ‘CSV’ ( DELIMITER ‘,’ QUOTE E’\001’ )
如果指定了TEXT,则还必须使用 --delimiter=delim 选项指定非逗号分隔符。这些是可写外部表的设置:
FORMAT ‘TEXT’ ( DELIMITER delim ESCAPE ‘off’ )
--full
将Greenplum数据库源系统完全迁移到目标系统。 必须为目标系统指定选项(--source-map-file选项,--dest-host选项),必要时指定其他目标系统选项。
--full 选项不能用-t、-d、-f、--partition-transfer或 --partition-transfer-non-partition-target 选项指定。
完整迁移将复制所有数据库对象,包括所有用户定义数据库的表、索引、视图、用户、角色、函数和资源队列。 默认数据库postgres、template0和template1不会移动。
如果目标系统中存在一个数据库(默认的postgres、template0和template1数据库除外),gptransfer会返回一个错误并退出
注意: 只有当数据库包含大量数据量较大的表时,才建议使用--full选项。 由于设置并行传输所需的开销,当数据库包含具有少量数据的表时,不建议使用该工具。有关更多信息,请参阅注解。
--gpfdist-verbose
将gpfdist 进程的日志记录级别设置为verbose(-v)。不能用--gpfdist-very-verbose指定。
输出记录在源Greenplum数据库集群的Segment主机的~/gptransfer_process_id目录中的gpfdist日志文件中。
--gpfdist-very-verbose
将gpfdist 进程的日志记录级别设置为非常详细(-V)。不能用--gpfdist-verbose指定。
输出记录在源Greenplum数据库集群的Segment主机的~/gptransfer_process_id目录中的gpfdist日志文件中。
-l log_dir
指定gptransfer的日志文件目录。如果未指定,则默认为~/gpAdminLogs。此目录在源Greenplum集群的Master主机上创建。
--max-line-length=length
为gpfdist 工具设置允许的最大数据行长度(以字节为单位)。如果未指定,则默认值为10485760。有效范围为32768(32K)至268435456(256MB)。
当用户数据包含非常宽的行时(或者当line too long 的错误信息发生时)应该被使用。 不应该使用其他方式,因为它会增加资源分配。
--no-final-count
禁用在gptransfer完成将数据库对象复制到目标数据库之后执行的表行计数验证。 默认值是将复制到目标数据库的表的行数与源数据库中的表进行比较。
-q | —quiet
如果指定,则禁止状态消息。消息只被发送到日志文件。
--quote=character
gptransfer 用 CSV 格式创建可写的外部表时的引号字符。指定用于包围列数据的 单个ASCII字符。 默认值是八进制字符\001,即SOH 字符。
用户可以指定格式为 “\digits”(八进制)的分隔字符,例如非打印字符。 即反斜线后面接上字符的八进制值。八进制值必须用双引号括起来。
--schema-only
只创建由该命令指定的模式。数据不被传输。
如果使用--full选项指定,则gptransfer复制源数据库的完整数据库模式,包括所有表、索引、视图、用户定义的类型(UDT)和用户定义的函数(UDF)。没有数据传输。
如果使用带-t或-f选项的--schema-only,gptransfer仅创建表和索引。数据不会被传输。
不适用于--partition-transfer、--partition-transfer-non-partition-target或--truncate 选项。
--skip-existing
如果该表已存在于目标数据库中,请指定此选项以跳过从源数据库复制表。
最多只能指定--skip-existing、--truncate或--drop中的一个选项。如果没有指定其中的一个,并且目标系统中存在该表,gptransfer将返回一个错误并退出。
不适用于--full选项。
--source-host=source_host
源Greenplum数据库主机名或IP地址。 如果未指定,则默认主机是运行gptransfer的系统(127.0.0.1)。
--source-map-file=host_map_file
列出源Segment主机名和IP地址的文件。 如果缺少这个文件或没有列出所有的Segment主机,gptransfer会返回一个错误并退出。
hostname,IPaddress。 这个例子列出了四台Greenplum数据库主机及其IP地址。
sdw1,192.0.2.1
sdw2,192.0.2.2
sdw3,192.0.2.3
sdw4,192.0.2.4
如果指定了--full选项,或者源Greenplum数据库系统与目标系统不同,则此选项是必需的。 如果源系统和目标系统相同,则不需要此选项
--source-port=source_port
源Greenplum数据库端口号。如果未指定,则默认值为5432。
--source-user=source_user
用于连接到源Greenplum数据库系统的用户标识。如果未指定,则默认为用户gpadmin
--sub-batch-size=sub_batch_size
指定迁移表时执行的操作(如启动gpfdist实例,为移动操作创建命名管道)所执行操作的最大并行度。如果未指定,则默认值为25。最大值为50。
指定--batch-size选项来控制gptransfer 并发处理的表的最大数量。
-t db.schema.table
从源数据库系统中复制一张表。必须指定完全限定的表名。
可以使用Python正则表达式语法来指定一组表。有关使用正则表达式的信息,请参阅-d选项。
如果目标表或数据库不存在,则会创建它。该选项可以多次指定以包含多个表。 只有表和表数据被复制并且索引被重新创建。依赖对象不被复制。
如果源表不存在,则gptransfer返回一个错误并退出。
如果指定-d 选项来复制数据库中的所有表,则不需要从数据库中指定单个表。
不适用于--full、-d、-f、--partition-transfer或--partition-transfer-non-partition-target选项。
-T db.schema.table
从源数据库系统中的表中排除传输。必须指定完全限定的表名。
可以使用Python正则表达式语法来指定一组表。有关使用正则表达式的信息,请参阅-d选项。
可以多次指定此选项以包含多个表。只有指定的表被排除。要排除依赖对象,必须明确指定它们
在开始传输之前,该工具从正在传输到目标数据库的表的列表中删除排除的表。如果排除表导致不传输表,则不会在目标系统中创建数据库或模式。
如果源表不存在gptransfer将显示警告。
不适用于--full、--partition-transfer或--partition-transfer-non-partition-target选项。
用户可以指定--dry-run选项来测试命令。-v选项显示并记录排除的表。
--timeout seconds
指定gptransfer传递给其使用的gpfdist进程的超时值,以秒为单位。这个值是Greenplum数据库建立到gpfdist进程的连接所允许的时间。在高流量网络上运行时,用户可能需要增加这个值。
默认值是300秒(5分钟)。最小值是2秒,最大值是600秒。
--truncate
指定此选项以截断目标数据库中已存在的表。
最多只能指定--skip-existing、--truncate或--drop中的一个选项。如果没有指定任何一个并且目标系统中存在该表,则gptransfer将返回一个错误并退出。
不适用于--full选项。
--validate=type
对表数据执行数据验证。这些是支持的验证类型
count - 指定此值来比较源表数据和目标表数据之间的行数。
MD5 - 指定此值以比较源表和目标表数据之间的MD5值。
如果对表的验证失败,gptransfer将显示表的名称,并将文件名写入文本文件failed_migrated_tables_yyyymmdd_hhmmss.txt。yyyymmdd_hhmmss是gptransfer进程启动时的时间戳。该文件是在执行gptransfer的目录中创建的。
注意: 该文件包含表迁移期间验证失败或发生其他错误的表名。
-v | —verbose
如果指定,则将日志记录级别设置为verbose。 在命令执行期间,额外的日志信息被写入日志文件和命令行。
--work-base-dir=work_dir
指定gptransfer用于存储临时工作文件(如PID文件和命名管道)的目录。默认目录是用户的主目录
源系统和目标系统必须能够访问gptransfer工作目录。
-x
在源数据库上,当gptransfer插入到外部表中并在验证后被释放时,获得排它锁。
在目标数据库上,当gptransfer从外部表中选择并在验证之后释放时,获得排他锁。
如果未指定-x选项并指定了--validate,则在迁移过程中将数据插入到源表或目标表中时,会发生验证失败。如果发生验证错误,gptransfer工具将显示消息。
-h | -? | —help
显示在线帮助。
--version
显示此工具的版本。
示例
该命令将数据库db1中的表public.t1和数据库db2中的所有表复制到系统mytest2中。
gptransfer -t db1.public.t1 -d db2 --dest-host=mytest2 \
如果数据库db1和db2不存在于系统mytest2中,则会创建它们。如果目标系统上存在任何源表,则gptransfer会截断表并将数据从源复制到目标表。
此命令将叶子分区表从源系统复制到目标系统。
gptransfer -f input_file --partition-transfer --source-host=source_host \
--source-user=source_user --source-port=source_port --dest-host=dest_host \
--dest-user=dest_user --dest-port=dest_port --source-map-file=host_map_file
input_file中的这一行将一个叶子分区从源系统复制到目标系统。
该行假设源和目标系统中的分区表类似于下表。
在原系统的destdb数据库的public方案中,具有叶子分区表public.employee_1_prt_seniors的分区表。这个CREATE TABLE 命令用叶子分区表创建一个分区表。
CREATE TABLE employee(id int, level char(1))
DISTRIBUTED BY (id)
PARTITION BY list (level)
(PARTITION seniors VALUES ('S'),
PARTITION juniors VALUES ('J'),
DEFAULT PARTITION other );
本示例在过滤文件中使用Python正则表达式来指定要传输的一组表。此命令用过滤文件/tmp/filter_file指定-f选项来限制传输的表。
gptransfer -f /tmp/filter_file --source-port 5432 --source-host test4 \
这是/tmp/filter_file的内容。
在第一行中,方案的正则表达式(arc/.*/)以及表的正则表达式(/.*/)将传输限制为以arc开头的方案名称的所有表。
在第二行中,方案的正则表达式(c/(..)/y)和表的正则表达式(/.*/)限制传输为具有长度为四个字符且以c开始并以y结尾的方案名称的所有表。例如,crty。
运行该命令时,数据库test1中满足任一条件的表都将传输到目标数据库。