现在的位置: 首页 > 数据库 > 正文

greenplum数据库备份恢复

2020年02月19日 数据库 ⁄ 共 4737字 ⁄ 字号 暂无评论

参考文档链接:https://gp-docs-cn.github.io/docs/admin_guide/managing/backup-main.html

关于并行备份(gp_dump)

1) GP同时备份Master和所有活动的Segment实例
2) 备份消耗的时间与系统中实例的数量没有关系

3) 在Master主机上备份所有DDL文件和GP相关的数据字典表

4) 每个Segment备份各自的数据

5) 所有备份文件组成一个完整的备份集合,通过唯一14位数字的时间戳来识别

关于非并行备份(pg_dump)

1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall

2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份文件

3) 不适合于全部数据备份,适用于小部分数据的迁移或备份

关于并行恢复(gp_restore)

1) 通过gp_dump产生的时间戳来辨识备份集合,恢复数据库对象和数据到分布式数据库中

2) 每个Segment并行恢复各自的数据

3) 被恢复的GP系统必须与备份的系统同构

关于非并行恢复(pg_restore)

1) 使用由pg_dump或pg_dumpall创建的备份文件来恢复

2) 使用非并行恢复可以实现异构系统恢复

备份数据库

备份数据库的四种选择

1) 为每个实例创建一个备份文件

可用于全库备份或者相同配置的系统之间迁移数据;

2) 使用gpcrondump进行定期备份

对gp_dump进行包装,使用cron调度GP数据库的后台进行备份;

调用gpcrondump的调度作业应该部署在GP的Master主机;
gpcrondump命令还备份数据库角色和服务器配置等数据库之外的对象
全备脚本如下:支持增量,具体自行查看

gpcrondump备份参考博客文章: https://yq.aliyun.com/articles/30330

[root@master backup]# cat backup.sh
#!/bin/sh
backupdir="/data/backup"
logdir=$backupdir
MASTER_DATA_DIRECTORY="/data/master/gpseg-1"
export MASTER_DATA_DIRECTORY
source /gp/greenplum-db/greenplum_path.sh
dbid="PG"
dbname="PG"
#for dbname in `psql -A -q -t -h $PGHOST -p $PGPORT -U $PGUSER -c "select datname from pg_database where datname 'template0'"`
#do
now=`date +%Y%m%d%H%M%S`
gpcrondump -a -C --dump-stats -g -G -h -r --use-set-session-authorization -x $dbname -u $backupdir --prefix $dbid -l $logdir
#done
3) 使用pg_dump或pg_dumpall创建单个备份文件

可用于不同数据库之间少量数据迁移或备份;

4) 文件系统备份

借助操作系统或者其他第三方工具来进行备份,实现增量备份

使用gp_dump

1) 备份GP数据库
$ gp_dump testdw1

注意调整selinux安全级别,/usr/sbin/setenforce 0

2) gp_dump命令将在数据目录生成如下的备份文件

在Master主机上

数据字典表:gp_catalog_1

创建数据库SQL语句:gp_cdatabase_1

创建schema SQL语句:gp_dump_1

创建Table SQL语句:gp_dump_1_post_data
在Segment主机上

用户数据文件:gp_dump_0_ _

日志文件:gp_dump_status_0_ _
使用gpcrondump

1) gpcrondump在Master和Segment的数据目录创建备份文件:/db_dumps/YYYYMMDD

2) Segment数据的备份使用gzip压缩格式

3) 使用CRON调度备份操作

定义一个调用gpcrondump的crontab条目。

例如,在午夜1点备份testdw数据库

0 1 0 * * * gpadmin source $GPHOME/greenplum_path.sh; gpcrondump –x testdw –c –g –G –a –q >> gp_testdwdump.log
非并行备份
1) 使用pg_dump或者pg_dumpall进行备份

2) 导出testdw数据库到SQL脚本文件: pg_dump testdw > testdw.sql

3) 导出包含分布键信息的testdw数据库到tar文件: pg_dump –Ft –gp-syntax testdw > testdw.tar

4) 导出testdw数据库到定制格式的归档文件:pg_dump –Fc testdw > testdw.dump

5) 导出单个表: pg_dump –t tb_cp_02 testdw > tb_cp_02_testdw.sql

6) 导出混合大小写名称的表: pg_dump –t ‘”MixedTableName”’ testdw > tab_testdw.sql

7) 集群备份: pg_dumpall > all.dump
恢复数据库

非并行恢复

1) 使用pg_restore或psql进行恢复

2) 恢复testdw数据库: pg_restore –d testdw testdw.dump

3) 恢复SQL备份文件: psql -d testdw –f tb_cp_02_testdw.sql
从并行备份文件恢复

1) 在决定使用恢复程序时,需确定以下几个问题:

a) 备份文件在哪里?

如果备份文件位于gp_dump生成的原始位置,可以简单的通过gp_restore命令恢复;

如果备份文件已经移除GP集群,使用gpdbrestore来恢复

b) 是否需要恢复整个系统,还是只恢复数据?

如果GP仍在运行并仅需要恢复数据,使用gp_restore或gpdbrestore命令来恢复;

如果丢失了整个集群或者需要从备份来重建整个集群,使用gpinitsystem命令

c) 是否恢复的系统与备份时的系统具有相同数量的Instance?

如果相同,使用gp_restore或gpdbrestore命令来恢复;

如果是在不同集群间迁移,必须使用非并行恢复
使用gp_restore恢复

1) 如果在备份时使用了参数:-s(仅模式),-a(仅数据),–gp-c(压缩),–gp-d(修改备份文件目录),那么在恢复时也要指定这些参数。

2) gp_restore命令将执行如下操作:

a) 在Master主机上

运行由gp_dump生成的gp_dump_1文件中SQL DDL命令,重建数据库的模式和对象;

在Master数据目录生成日志文件,日志文件的名称为:gp_restore_status_1

gp_restore在每个需要恢复的Instance上启动一个名为gp_restore_agent的程序,gp_restore_agent进程在Segment主机上运行并向Master主机上的gp_restore进程报告状态

b) 在Segment主机上

每个Instance使用gp_dump生成的gp_dump_1 文件来恢复用户数据

每个Instance生成一个日志文件,名字为:gp_restore_status_1

c) 恢复数据库

创建需要被恢复的数据库。例如:$ createdb testdw

在Master主机,运行gp_restore命令(–gp-k指定备份操作时间戳标识符,-d指定恢复的数据库)

$ gp_restore –gp-k=20131231001327 –d testdw
使用gpdbrestore恢复

1) gpdbrestore命令是对gp_restore命令的包装,提供更灵活的选项

2) 使用gpcrondump备份生成的备份文件来进行恢复

3) 恢复testdw数据

a) 创建需要被恢复的数据库。例如:

$ createdb testdw

b) 在Master主机上执行gpdbrestore命令(-R指定备份文件所在的主机名和路径)

$ gpdbrestore –b 20131231

c) 从归档主机恢复(-R指定备份文件所在的主机名和路径)

$ gpdbrestore –R archive_host:/gpdb/backups/archive/201312311
恢复到配置不同的GP系统

注:可适用于并行备份的数据恢复到Segment节点数不同的GP系统集群环境

参考文档链接:https://gp-docs-cn.github.io/docs/admin_guide/managing/restore-diff-system.html

1) 使用并行备份文件通过GP Master做非并行装载

2) Segment备份文件内容包含了COPY命令,数据是分割平面格式

3) 恢复步骤
1、确保要恢复到其中的数据库已经在系统中创建。
例如:
$ createdb database_name

2、装载Master转储文件来恢复数据库对象。例如:
$ psql database_name -f /gpdb/backups/gp_dump_-1_1_20160714

3、装载每一个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
...
装载后续数据文件来恢复索引、触发器、主键约束等数据库对象。

4、$ psql database_name -f /gpdb/backups/gp_dump_0_5_20160714_post_data

5、基于来自原始数据库的值更新数据库序列。

可以使用系统工具gunzip和egrep从原始的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

抱歉!评论已关闭.