GaussDB Roach逻辑备份恢复
目录:
GaussDB Roach逻辑备份恢复原理
gs_dump逻辑备份恢复工具
roach逻辑备份恢复
逻辑备份恢复支持、规格及约束
续备份、续恢复
逻辑备份删除
存储介质
容错支持
特殊表名
并行处理
最佳实践
GaussDB Roach逻辑备份恢复实践
FAQ
GaussDB Roach逻辑备份恢复原理:
1. gs_dump逻辑备份恢复:
可以设置事务隔离级别。
gs_dump一致性备份:在单个database内保持一致,不同database之间无法保持一致,因为不同database之间需要切换connection,不能在不同database之间共享snapshot,因此只能在同一个database内保持一致性。
如果不保持一致。一个database数据量非常大,gs_dump备份时间会比较长,将会持有锁比较长的时间,对于一些需要ddl操作的database实例来说无法忍受。
解决方案:
细粒度备份,而不要备份整个database,
一次只备份一个table,调用gs_dump多次。
如果多个表之间有关联,将这些表放入一个gs_dump操作中,用-t tablename来操作。但是这个-t其实是解决了依赖关系,本质上还是按照依赖顺序串行导出。
一个单表数据量非常大,考虑分区表,也就是将数据进行了分片。否则这些表的ddl将会增加gs_dump之间的冲突。
对于数据量非常大的databse实例,推荐使用PITR物理增量备份。
gs_dump并行备份: gs_dump版本>=9.3,server版本>=9.2,需要支持pg_export snapshot
n+1个连接,-j n是并行度,1是主节点的连接
对于版本<9.2,需要并行度和数据库一致性,在备份的时候不能做dml操作。
2. roach逻辑备份恢复:
GaussDB是一个分布式数据库,数据自动分片存储。
GaussDB roach采用了基于单表粒度的备份恢复来实现逻辑备份,即一次只备份一个table,每次通过gs_dump导出table的ddl语句,并通过单独的外表方法(roach外表方法)来导出数据(不同表之间不保证数据一致性)。
GaussDB Roach逻辑备份恢复实践:
1. 逻辑备份恢复:
支持单表、多表(可以是不同schema的表)、schema、database级别逻辑备份。
schema、database都默认转为多表逻辑执行(基于单表的串行实现),备份出schema、database内包含的所有表数据。
可以从多表、schema、或者database逻辑备份中恢复出任意单张表或者多张表。
规格约束:不支持private table,nodegroup table, replication table,table has trigger/sequence表的备份恢复。
对于表之间依赖关系,trigger,sequence,index等没有进行导出,只备份恢复数据。
单表: --tablename table 其中tablename可以是schema.table; schema默认为public,database默认为postgres
单表备份:python $GPHOME/script/GaussRoach.py --master-port 9500 --agent-port 9600 --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t backup --tablename table [--schemaname schema] [--dbname database]
单表恢复:python $GPHOME/script/GaussRoach.py --master-port 9500 --agent-port 9600 --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t restore --tablename table [--schemaname schema] [--dbname database] --backup-key bkpkey [--clean]/[--create]
多表: --table-list --table-list选项与--tablename以及--schemaname不兼容;可以是不同schema中的表
tablelist文件内容示例:
public.t1
gauss.test
T2
Public."Temp"
汉字表名
cc.1a
多表备份:python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t backup --table-list tablelist [--schemaname schema] [--dbname database]
多表恢复:python $GPHOME/script/GaussRoach.py --master-port 9500 --agent-port 9600 --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t restore --tablelist tablelist [--dbname database] --backup-key bkpkey [--clean]/[--create]
Schema: --schemaname
Schema规格约束: 其中系统级schema "dbms_job", "dbms_lob", "dbms_om", "dbms_output", "dbms_random", "dbms_redact", "dbms_sql", "sys", "utl_file", "utl_raw", "cstore"不支持备份恢复,都会报错退出。
Schema备份:python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t backup --schemaname schema [--dbname database]
Schema恢复:python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t restore --schemaname schema [--dbname database] --backup-key bkpkey [--clean]/[--create]
其中-t restore --schemaname schema --dbname database --backup-key bkpkey 可以从database级别逻辑备份中恢复出指定的schema
Database: --dbname
Database规格约束:其中系统级schema "dbms_job", "dbms_lob", "dbms_om", "dbms_output", "dbms_random", "dbms_redact", "dbms_sql", "sys", "utl_file", "utl_raw", "cstore"不支持备份恢复,都会被默认过滤掉。
Database备份:python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t backup --dbname database
Database恢复:python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t restore --dbname database --backup-key bkpkey [--clean]/[--create]
2. 逻辑续备份、续恢复:
逻辑备份续备份、续恢复。其中续备份对于已经进行过校验的表名不会继续校验,以提升效率。如果在续备份时某些表已经被过滤掉,没有实际备份,而用户又对表对象属性进行了修改,希望能够得到备份,则考虑重新进行单表、多表重新备份,或者等待下次备份即可。
多表、schema、database等均支持续备份、续恢复,仅在备份、恢复失败之后才需要做。
续备份: --resume-backup --backup-key bkpkey
python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t backup --schemaname schema [--dbname database] --resume-backup --backup-key bkpkey
续恢复: --resume-restore--backup-key bkpkey
python $GPHOME/script/GaussRoach.py --master-port port_no --agent-port port_no --media-destination media_path --metadata-destination metadata_path --media-type DISK --logging --logging-level INFO -t restore --schemaname schema [--dbname database] --backup-key bkpkey [--clean]/[--create] --resume-restore
3. 逻辑备份删除: 通过指定backupkey来删除,cascade是将所有backupkey全部删除。
python $GPHOME/script/GaussRoach.py --master-port port_no --media-destination /home/dulong/backup/media --metadata-destination /home/dulong/backup/metadata --media-type DISK --logging --logging-level INFO -t delete --cascade --backup-key bkpkey
4. 存储介质:一般指定DISK,兼容NBU、OBS等多种存储方式
5. 容错支持:对于不支持的表会进行过滤,不会影响其他表的正常备份恢复。
恢复到新集群:默认备份恢复database是postgres,可以指定其他database。恢复到新集群需要加--create;而恢复到老集群则最好加--clean,会将原有数据清理删除再恢复已防止数据冗余;不加则直接恢复数据,可能会导致冲突或者数据冗余。
同样的,如果一个数据库中某些表已经被drop掉,恢复时这些表需要--create,而其他表需要--clean。用--clean时恢复时另一部分需要--create的表会被过滤掉,反之亦然。
6. 特殊表名:
汉字表名不需要加双引号
大写表名,大小写表名,首字母为数字,含有$, . 等特殊字符在对象中等都为特殊对象名。其中除了含大写字符的不能自动识别外,其余均可自动识别并加上双引号。表名含有. 时,默认. 前为schema名称,如果该.就是表名的一部分,则需要加两侧加双引号,以保证可以识别正确。
特殊对象名称需要加双引号,例如schema名为 a.b,表名为 'public.',传入必须加双引号,如‘“a.b”’,‘“public.”’,双引号外侧再加单引号是为了保证正确传入了对象名,如果传入“public.”,内部传入其实为'public.';如果对象名内有大写字符,也需要加双引号,否则内核会默认转为小写。
PS: 尽量不要数据库对象内加各种特殊符号。
7. 并行处理:
Gauss数据库为分布式数据库,默认进行了分片处理。每个数据库节点上有一个或多个datanode,一般一个datanode对应一个磁盘,而我们每个节点推荐>=2个datanode保证高可用等。数据落盘为每个datanode同时向磁盘写数据,不同datanode并行的向磁盘写入数据。
每个datanode内为串行的处理表数据,一个表数据处理完之后再处理下一个表(8.1)。在8.1及8.2后续版本中,将实现单个datanode的多个表并行的处理数据(自定义并发度)。
8. 最佳实践:
设置常规作业,利用多表逻辑备份业务中比较重要的表,schema及database备份往往将所有表备份,重要程度不高的表备份恢复仍然有较高开销。
对常规作业设置优先级,按优先级进行不同时间间隔的备份与恢复。
Database级别逻辑备份将备份整库数据,如果database实例内表数量大且规模大,性能会比较差(单个datanode内串行备份恢复);推荐使用PITR物理增量备份来替代Database逻辑备份。
如果逻辑备份恢复中途失败,尽可能使用续备份、续恢复以完成作业。续备份只备份未备份成功的表,且对已经校验过的表将不会进行二次校验,而现行的校验为串行校验,表数量比较大的时候开销仍然较大;续恢复将恢复未恢复成功的表。在8.1以及8.2后续版本中,将实现更为细粒度的续备份、续恢复,备份效率将更为提高。
合理设置压缩算法和压缩率
FAQ:
1. Why not gs_dumpall?
The gs_dumpall program exports all databases, one after another, into a single script file, which prevents you from performing the parallel restore. If you back up all databases this way, the restore process will take more time.
The processing of dumping all databases takes longer than each individual one so you do not know which dump of each database relates to a specific point in time.
If you have a good reason to use the gs_dump all to backup all databases, the following is the command:
gs_dumpall -U postgres > c:\gsbackup\all.sql
2. Why not gs_dump?
gs_dump虽然灵活,但是数据导出按照sql或者二进制,仅支持在单节点导出。数据量较大的情况下性能往往较差,且不易扩展。
3.一致性?
数据的一致性要求在备份恢复过程中要求并不一定很高,而对于性能,扩展性,灵活性等均有一定要求。因此牺牲一定一致性来换取更好的性能,易用性等,对于实际场景往往可以接受。
- 点赞
- 收藏
- 关注作者
评论(0)