恢复到不同的Greenplum系统配置

恢复到不同的Greenplum系统配置

要使用gpdbrestore执行并行恢复操作,正在恢复的系统必须具有和被备份的系统相同的配置。要把数据库对象和数据恢复到一种不同的系统配置(例如一个具有更多Segment的系统)中,需要通过Greenplum的Master装载并行备份文件来恢复。要执行一次非并行恢复,必须有:

  • 一个由gpcrondump操作创建的完整备份集。Master的备份文件含有创建数据库对象的DDL。Segment的备份文件含有数据。
  • 一个运行着的Greenplum数据库系统。
  • 要恢复到其中的数据库在系统中存在。

Segment转储文件对每个表包含一个COPY命令,后面跟着以定界文本格式表示的数据。收集所有Segment实例的转储文件,并且通过Master运行它们来恢复数据以及把数据重新分布到新的系统配置上。

要把一个数据库恢复到一种不同的系统配置

  1. 确保有一个完全的备份集,包括Master的转储文件(gp_dump_-1_1_timestampgp_dump_-1_1_timestamp_post_data)以及每个Segment实例一个的转储文件(例如gp_dump_0_2_timestampgp_dump_1_3_timestampgp_dump_2_4_timestamp等等)。每一个转储文件必须有相同的时间戳键。gpcrondump在每个Segment实例的数据目录中创建转储文件。必须收集所有的转储文件并且把它们移动到Master主机上的一个位置。可以把每个Segment转储文件拷贝到Master、装载它然后在装载成功后删除它。
  2. 确保要恢复到其中的数据库已经在系统中创建。例如:
    $ createdb database_name
  3. 装载Master转储文件来恢复数据库对象。例如:
    $ psql database_name -f /gpdb/backups/gp_dump_-1_1_20160714
  4. 装载每一个Segment转储文件来恢复数据。例如:
    $ psql database_name -f /gpdb/backups/gp_dump_0_2_20160714
    $ psql database_name -f /gpdb/backups/gp_dump_1_3_20160714
    $ psql database_name -f /gpdb/backups/gp_dump_2_4_20160714
    $ psql database_name -f /gpdb/backups/gp_dump_3_5_20160714
    ...
  5. 装载后续数据文件来恢复索引、触发器、主键约束等数据库对象。
    $ psql database_name -f /gpdb/backups/gp_dump_0_5_20160714_post_data
  6. 基于来自原始数据库的值更新数据库序列。
    可以使用系统工具gunzipegrep从原始的Greenplum数据库的Master转储文件gp_dump_-1_1_timestamp.gz中把序列值信息抽取到一个文本文件中。这个命令把该信息抽取到文件schema_path_and_seq_next_val中。
    gunzip -c path_to_master_dump_directory/gp_dump_-1_1_timestamp.gz | egrep "SET search_path|SELECT pg_catalog.setval"  
       > schema_path_and_seq_next_val

    这个示例命令假设原始的Greenplum数据库的Master转储文件在/data/gpdb/master/gpseg-1/db_dumps/20150112中。

    gunzip -c /data/gpdb/master/gpseg-1/db_dumps/20150112/gp_dump_-1_1_20150112140316.gz 
      | egrep "SET search_path|SELECT pg_catalog.setval" > schema_path_and_seq_next_val

    在抽取该信息后,使用Greenplum数据库的psql工具更新数据库中的序列。这个示例命令更新数据库test_restore中的序列信息:

    psql test_restore -f schema_path_and_seq_next_val