以下资料是根据Pivotal Greenplum官网翻译、Grenplum中文社区博客以及个人测试所得,如有部分描述错误,欢迎下方评论指出,共同进步。
目录
一:gpcopy介绍
gpcopy是一个数据迁移实用程序,可以在不同集群之间进行传输数据,可以将一个集群中的Greenplum数据库的元数据和数据复制到另一个集群的Greenplum数据库中。gpcopy可以迁移数据库的全部内容,包括数据库架构、表数据、索引、视图、角色、用户自定义函数、资源队列、资源组。
二:gpcopy相较于gptransfer
(1)复制数据更快:注意这里说的是数据,而不是元数据。gpcopy更快速原因可分为三点:segment间直接传输、Snappy压缩传输、数据校验。
①segment间直接传输:当一个表的数据超过指定数据行数(--on-segment-threshold默认为10000行)时,gpcopy会利用COPY ON SEGMENT特性使得gpcopy可以做到两个cluster的多节点间并发传输。除此之外,gpcopy的数据传输本身就是利用copy命令,而gptransfer则是通过外部表的SELECT和INSERT进行逐条操作,copy使用批量操作自然而然要比insert更快。
②Snappy压缩传输:gpcopy默认使用Google的Snappy格式对数据进行压缩和传输,而gptransfer使用zlib格式进行压缩和传输,百度snappy和zlib压缩性能对比,Snappy性能明显要高很多。
③数据校验:gpcopy和gptransfer都有两种校验方式,第一种校验方式相同:比较源表数据和目标表数据之间的行数,第二种校验方式也都是基于md5校验,但是gptransfer是先对源表和目标表进行排序,再对排序后的行计算MD5哈希值并逐行比较,反观gpcopy,先将每一行的所有列转换为文本,然后计算每行的md5值,最后对md5值进行XOR(异或)比较。
(2)数据迁移更稳定:命名管道以文件的形式存在于文件系统中,任何进程只要有权限,打开该文件即可通信。导致命名管道文件难以管理,也容易出问题。gpcopy没有命名管道文件。而gptransfer使用可写和可读外部表、Greenplum的gpfdist并行数据装载工具以及命名管道来从源数据库传输数据到目标数据库,所以命名管道必不可少。
参考地址:https://cloud.tencent.com/developer/news/355959
三:gpcopy版本发展史
根据官网解释、网上查阅资料了解以及手动实践,我发现,gpcopy改动变迁比较大的版本分别为1.0.0、1.1.0、1.5.0。
gpcopy1.0.0:始于greenplum-db-5.9.0,仅支持相同segment数的gpdb之间的数据迁移。
gpcopy1.1.0:始于greenplum-db-5.12.0,支持不同segment数的Greenplum集群间传输,分为两种情况,如下图。
①gpcopy从小集群到大集群传输架构图
②gpcopy从大集群到小集群传输架构图
gpcopy1.5.0:从4.3.33.0、5.21.0开始,gpcopy不再捆绑在greenplum的安装包中,成为Pivotal gpcopy的第一个独立发行版,gpcopy1.5.0相比较于之前版本做出了如下更改:
①在复制表数据时可以更改目标schema和table名称,前提是目标表必须存在,且必须具有与源表完全相同的表结构。
②默认支持传输表所有权和特权信息,以前只有在使用-full选项时才复制所有权和特权信息。
关于gpcopy实用程序最低运行的Greenplum环境:见《六:gpcopy使用测试注意点》第五节。
四:gpcopy命令(基于gpcopy1.5.0)
概要
选择要复制数据的选项
--full:此选项执行Greenplum数据库源系统到目标系统的迁移。迁移复制所有用户定义的数据库的所有数据库对象,包括表,索引,视图,角色,函数,用户定义类型(UDT),资源队列和资源组。默认数据库postgres,template0和template1不会被复制。不能使用--dbname,--include-table,--include-table-file或--include-table-json选项指定此选项。
--dbname database:要复制的源数据库名称。要将多个数据库复制到目标系统,请指定以逗号分隔的数据库列表,名称之间不得有空格。所有用户定义的表和表数据都将复制到目标系统。如果源数据库不存在,则gp