Greenplum作为一个分布式数据库,其备份恢复的方式和pg还是有一些区别。其中gp支持两种模式的备份恢复:并行和非并行。两者的区别在于:
并行方式中每台Segment主机都同时将数据写入到自己本地的磁盘存储上。
而非并行的方式数据必须通过网络从Segment被发送到Master,然后由master接待你把所有的数据写入它的存储中。因此弊端也很明显:除了把I/O限制在一台主机上之外,非并行备份还需要Master拥有足够的本地磁盘存储以保存整个数据库。
并行备份:
并行备份通过gp自带的并行转储工具gpcrondump同时备份Greenplum的Master实例和每一个活动Segment实例。在Master上,gpcrondump会创建几个转储文件,其中包含DDL语句、系统目标和元数据文件之类的数据库信息。在每一个Segment上,gpcrondump会创建一个转储文件,它包含在那个Segment上重建数据的命令。
非并行备份:
使用pg自带的pg_dump和pg_dumpall非并行备份工具就可以被用来在Master主机上创建单个转储文件,它包含来自于所有活动Segment的所有数据。而且这种方式一般也不会去使用,因为比使用gp的并行备份工具慢很多,且所有的数据都必须通过Master。此外,在分布式系统中,Master主机常常会没有足够的磁盘空间来保存整个分布式Greenplum数据库的备份。
例子:
–使用gpcrondump并行备份
gpcrondump工具在Master和每个Segment上转储一个Greenplum数据库的内容为SQL脚本文件。这些脚本文件接下来可以被用来恢复这个数据库。
[gpadmin@test180 gpseg-1]$ gpcrondump -x postgres
默认情况将会把备份的数据保存在GPDATA目录下的db_dumps目录里,也可以使用-u选项指定目录。
–查看备份文件:
可以看到数据分别被备份到master和segment节点对应的目录下面。
[gpadmin@test180 db_dumps]$ pwd
/home/gpadmin/gpdata/masterdata/gpseg-1/db_dumps
[gpadmin@test180 db_dumps]$ ll
总用量 4
drwxrwxr-x 2 gpadmin gpadmin 4096 12月 5 16:49 20191205
[gpadmin@test180 db_dumps]$ pwd
/home/gpadmin/gpdata/segmentdata1/gpseg0/db_dumps
[gpadmin@test180 db_dumps]$ ll
总用量 0
drwxrwxr-x 2 gpadmin gpadmin 84 12月 5 16:49 20191205
增量备份:
gpcrondump和gpdbrestore工具支持追加优化表(包括列存表)的增量备份和恢复。
一个增量备份只包含从最近的增量或者完全备份以来改变过的追加优化表和列存表。
对于分区的追加优化表,只有变化过的追加优化/列存表分区会被包括在增量备份中。
增量备份包括所有的堆表。
恢复一个增量备份要求一个完全备份及所有的后续增量备份,一直到正在恢复的这个备份。
我们可以使用gpdbrestore的–incremental选项来进行增量备份,开始增量备份之前要确保已经有一个完全备份。
[gpadmin@test180 db_dumps]$ gpcrondump -x postgres --incremental
–查看:
[gpadmin@test180 20191205]$ ls -lrt
总用量 80
-rw------- 1 gpadmin gpadmin 114 12月 5 16:49 gp_cdatabase_-1_1_20191205164931
-rw------- 1 gpadmin gpadmin 2541 12月 5 16:49 gp_dump_status_-1_1_20191205164931
-rw------- 1 gpadmin gpadmin 876 12月 5 16:49 gp_dump_-1_1_20191205164931.gz
-rw------- 1 gpadmin gpadmin 196 12月 5 16:49 gp_dump_-1_1_20191205164931_post_data.gz
-rw-rw-r-- 1 gpadmin gpadmin 1115 12月 5 16:49 gp_dump_20191205164931.rpt
-rw-rw-r-- 1 gpadmin gpadmin 118 12月 5 16:49 gp_dump_20191205164931_last_operation
-rw-rw-r-- 1 gpadmin gpadmin 14 12月 5 16:49 gp_dump_20191205164931_co_state_file
-rw-rw-r-- 1 gpadmin gpadmin 14 12月 5 16:49 gp_dump_20191205164931_ao_state_file
-rw-rw-r-- 1 gpadmin gpadmin 46 12月 5 17:10 gp_dump_20191205171002_table
-rw------- 1 gpadmin gpadmin 114 12月 5 17:10 gp_cdatabase_-1_1_20191205171002
-rw------- 1 gpadmin gpadmin 2921 12月 5 17:10 gp_dump_status_-1_1_20191205171002
-rw------- 1 gpadmin gpadmin 974 12月 5 17:10 gp_dump_-1_1_20191205171002.gz
-rw------- 1 gpadmin gpadmin 196 12月 5 17:10 gp_dump_-1_1_20191205171002_post_data.gz
-rw-rw-r-- 1 gpadmin gpadmin 1231 12月 5 17:10 gp_dump_20191205171002.rpt
-rw-rw-r-- 1 gpadmin gpadmin 46 12月 5 17:10 gp_dump_20191205171002_dirty_list
-rw-rw-r-- 1 gpadmin gpadmin 14 12月 5 17:10 gp_dump_20191205171002_ao_state_file
-rw-rw-r-- 1 gpadmin gpadmin 118 12月 5 17:10 gp_dump_20191205171002_last_operation
-rw-rw-r-- 1 gpadmin gpadmin 14 12月 5 17:10 gp_dump_20191205171002_co_state_file
-rw-rw-r-- 1 gpadmin gpadmin 15 12月 5 17:10 gp_dump_20191205164931_increments
-rw-rw-r-- 1 gpadmin gpadmin 56 12月 5 17:10 gp_dump_20191205171002_table_list
数据库会自动生成一个gpcrondump_history用来记录备份的历史:
postgres=# \d gpcrondump_history
Table "public.gpcrondump_history"
Column | Type | Modifiers
--------------------+-----------------------------+-----------
rec_date | timestamp without time zone |
start_time | character(8) |
end_time | character(8) |
options | text |
dump_key | character varying(20) |
dump_exit_status | smallint |
script_exit_status | smallint |
exit_text | character varying(10) |
Distributed by: (rec_date)
postgres=# select * from gpcrondump_history ;
rec_date | start_time | end_time | options | dump_key | dump_exit_status | script_exit_status | exit_text
----------------------------+------------+----------+-----------------------------------------------------------------+----------------+------------------+--------------------+-----------
2019-12-05 16:49:36.577853 | 16:49:31 | 16:49:36 | -x postgres | 20191205164931 | 0 | 0 | COMPLETED
2019-12-05 17:08:36.15585 | 17:08:30 | 17:08:35 | -x postgres -u /home/gpadmin/gpdata/masterdata/gpseg-1/db_dumps | 20191205170830 | 0 | 0 | COMPLETED
2019-12-05 17:10:08.473965 | 17:10:02 | 17:10:07 | -x postgres --incremental | 20191205171002 | 0 | 0 | COMPLETED
(3 rows)