GP备份的工具gpcrondump是一个Python脚本,是对gp_dump的一个封装。而gp_dump则负责整个备份过程的控制与结果处理,包括获取元数据信息、启动Segment节点备份、状态维护等动作。

gpcrondump的详细参数:

更多参数请参考官方文档,或者查看命令help。对于详细的使用方法,这里不再讨论。

gpcrondump以DB为单位进行备份,当一次收到多个DB的备份请求时,则每个DB顺序依次进行备份。针对每个DB,gpcrondump会做一些预处理后,组织一个完整的gp_dump执行命令后执行。最基本的gp_dump命令如下:

gpcrondump不同的参数带来不同的gp_dump命令,比如“–table-file”等。

gp_dump是真正进行数据备份的主体。其操作的主要步骤如下:

  1. 参数、数据对象的处理

    除了对参数处理以外,这里的行为与pg_dump相似,会对需要导出的数据对象、依赖关系等进行处理。

  2. 从这里,获取每个Segment的信息,包括主机、端口、角色等。

  3. 之后调用gp_backup_launch函数,在Segment端启动一个Agent进程

    根据参数的不同,gp_backup_launch函数会启动不同的独立Agent进程。默认的是gp_dump_agent,这个Agent会封装pg_dump。GP也支持备份到Data Domain Boost等外部存储,即在独立的Agent进程中调用不同的agent工具。

    gp_backup_launch函数会等待gp_dump_agent执行结束后返回结果。

  4. Agent的实现与PG的pg_dump基本类似。不同的是,在参数处理之后,会将这个节点的隔离级别设置为串行。因此,多少会对备份期间的事务性能产生一定影响。而如果只是查询的话则影响不大。

    pg_dump和gp_dump_agent的实现都是用COPY或者FETCH语句将表的数据导出。

  5. 结果返回

    在gp_dump_agent执行结束后,结果返回作为每个节点上gp_backup_launch函数的执行结果。

GP备份的机制充分利用了每个节点的并行,可以极大的提高备份速度。一方面单个节点的数据量可以控制在一定范围,另一方面不同节点之间并行互不影响。

Hope you have fun.