专栏首页Snova最佳实践系列Snova运维篇(三):GP数据库备份和恢复
原创

Snova运维篇(三):GP数据库备份和恢复

本节主要从gp数据备份和恢复角度深入学习gp数据库。定期执行备份能确保在数据损坏或者系统失效发生时能恢复数据或者重建Greenplum数据库系统。用户还可以使用备份从一个Greenplum数据库系统迁移数据到另一个。

目录:

  1. 全量备份gpcrondump工具
  2. 增量备份
  3. 直接IO
  4. 有名管道数据传输
  5. 数据恢复

基本概念:

mkfifo

命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。


1. 全量备份 gpcrondump工具

Master的备份文件包含用于创建数据库模式的SQL命令。Segment的数据转储文件包含将数据装载到表中的SQL语句。

[gpadmin@gp-master ~]$ gpcrondump -x komablog
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Starting gpcrondump with args: -x komablog
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:----------------------------------------------------
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Master Greenplum Instance dump parameters
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:----------------------------------------------------
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Dump type                            = Full database
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Database to be dumped                = komablog
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Master port                          = 5432
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Master data directory                = /data/master/gpseg-1
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Run post dump program                = Off
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Rollback dumps                       = Off
20191225:14:58:56:022194 gpcrondump:gp-master:gpadmin-[INFO]:-Dump file compression                = On

默认备份目录在数据目录下:

[gpadmin@gp-master db_dumps]$ pwd
/data/master/gpseg-1/db_dumps
[gpadmin@gp-master db_dumps]$ ls
20191225
[gpadmin@gp-master db_dumps]$ ll 20191225/
total 32
-rw------- 1 gpadmin gpadmin  114 Dec 25 14:59 gp_cdatabase_-1_1_20191225145856
-rw------- 1 gpadmin gpadmin 1180 Dec 25 14:59 gp_dump_-1_1_20191225145856.gz
-rw------- 1 gpadmin gpadmin  366 Dec 25 14:59 gp_dump_-1_1_20191225145856_post_data.gz
-rw-rw-r-- 1 gpadmin gpadmin    1 Dec 25 14:59 gp_dump_20191225145856_ao_state_file
-rw-rw-r-- 1 gpadmin gpadmin    1 Dec 25 14:59 gp_dump_20191225145856_co_state_file
-rw-rw-r-- 1 gpadmin gpadmin    1 Dec 25 14:59 gp_dump_20191225145856_last_operation
-rw-rw-r-- 1 gpadmin gpadmin 1022 Dec 25 14:59 gp_dump_20191225145856.rpt
-rw------- 1 gpadmin gpadmin 2541 Dec 25 14:59 gp_dump_status_-1_1_20191225145856

gpcrondump常用选项:

-t schema.tablename – 指定一个要包括在备份中的表。可以多次使用-t选项。

--table-file=filename – 指定一个文件,其中含有要包括在备份中的表的列表。

-T schema.tablename – 指定一个要从备份中排除的表。可以多次使用-T选项。

--exclude-table-file=filename – 指定一个文件,其中含有要从备份中排除的表的列表。

-s schema_name – 在备份中包括所有以指定方案名限定的表。可以多次使用-s选项。

--schema-file=filename – 指定一个文件,其中含有要包括在备份中的方案列表。

-S schema_name – 在备份中排除指定方案名限定的表。可以多次使用-S选项。

--exclude-schema-file=filename – 指定一个文件,其中含有要从备份中排除的方案列表。

2. 增量备份

改变Greenplum数据库的Segment配置会让增量备份无效。在更改了Segment配置后必须先创建和一个完全备份,才能接着创建增量备份。

操作实例:

  • 首先创建全量备份并自定义备份目录
gpcrondump -x mytest -u /backupdir     
  • increntmnet增量
gpcrondump -x mytest -u /backupdir --incremental
gpdbrestore -t 20170114051246 -u /backupdir

3.直接IO

直接I/O允许用户绕过缓存,这样应用会直接写到存储设备。这种方式可以节约CPU消耗并且消除一次数据拷贝操作。

操作系统级别的IO优化。

  • 打开直接IO
[gpadmin@gp-master ~]$ gpconfig -c gp_backup_directIO -v on

查看是否被启用

gpconfig -s gp_backup_directIO
  • 修改IO数据块大小

查看当前数据块大小:

[gpadmin@gp-master ~]$  gpconfig -s gp_backup_directIO_read_chunk_mb
Values on all segments are consistent
GUC          : gp_backup_directIO_read_chunk_mb
Master  value: 20
Segment value: 20

修改数据块为10MB:

$ gpconfig -c gp_backup_directIO_read_chunk_mb -v 10

4.使用命名管道

如果Segment主机没有足够的本地磁盘空间来备份到文件,用户可以使用命名管道备份到非本地存储,例如在网络上另一台主机上的存储或者一种备份装置。

实例演示:

  • 为komablog生成备份文件列表
[gpadmin@gp-master ~]$ gpcrondump -x komablog -K 20150519160000 --list-backup-files -u /data/testdir
20191226:10:23:58:014862 gpcrondump:gp-master:gpadmin-[INFO]:-Starting gpcrondump with args: -x komablog -K 20150519160000 --list-backup-files -u /data/testdir
20191226:10:23:59:014862 gpcrondump:gp-master:gpadmin-[INFO]:-Added the list of pipe names to the file: /data/testdir/db_dumps/20150519/gp_dump_20150519160000_pipes
20191226:10:23:59:014862 gpcrondump:gp-master:gpadmin-[INFO]:-Added the list of file names to the file: /data/testdir/db_dumps/20150519/gp_dump_20150519160000_regular_files
20191226:10:23:59:014862 gpcrondump:gp-master:gpadmin-[INFO]:-Successfully listed the names of backup files and pipes
  • 列出backup中的目录文件
[gpadmin@gp-master data]$ tree testdir/
testdir/
`-- db_dumps
    `-- 20150519
        |-- gp_dump_20150519160000_pipes
        `-- gp_dump_20150519160000_regular_files

2 directories, 2 files
  • 查看pipes文件的内容
[gpadmin@gp-master 20150519]$ cat gp_dump_20150519160000_pipes
gp-node1:/data/testdir/db_dumps/20150519/gp_dump_0_2_20150519160000.gz
gp-node2:/data/testdir/db_dumps/20150519/gp_dump_1_3_20150519160000.gz
gp-master:/data/testdir/db_dumps/20150519/gp_dump_-1_1_20150519160000.gz
gp-master:/data/testdir/db_dumps/20150519/gp_dump_-1_1_20150519160000_post_data.gz
  • 在Greenplum数据库的Segment上创建指定的命名管道。还未命名管道设置一个读取器。
[gpadmin@gp-master 20150519]$ gpssh -h gp-node1
=> mkfifo /backups/db_dumps/20150519/gp_dump_0_2_20150519160000.gz
[gp-node1] mkfifo: cannot create fifo ‘/backups/db_dumps/20150519/gp_dump_0_2_20150519160000.gz’: No such file or directory
=> mkfifo /data/testdir/db_dumps/20150519/gp_dump_0_2_20150519160000.gz
[gp-node1] mkfifo: cannot create fifo ‘/data/testdir/db_dumps/20150519/gp_dump_0_2_20150519160000.gz’: File exists
=> mkfifo /data/testdir/db_dumps/20150519/gp_dump_0_2_20150519160000.gz
[gp-node1]
=> cat /data/testdir/db_dumps/20150519/gp_dump_0_2_20150519160000.g|nc -l 21000
  • 接收备份文件
nc gp-node1 21000 > gp_dump_0_2_20150519160000.gz
  • 运行gpcrondump开始备份:
gpcrondump -x komablog -K 20150519160000  -u /testdir
  • 从命名管道恢复备份数据
gpdbrestore -x komablog -t 20150519160000 -u /testdir

5.恢复数据

工具gpdbrestore

-t timestamp – 恢复带有指定时间戳的备份。

-b YYYYYMMDD – 恢复Segment数据目录的db_dumps子目录中指定日期的转储文件。

-s database_name – 恢复指定数据库在Segment数据目录中能找到的最后一组转储文件。

-R hostname:path – 恢复位于一台远程主机上指定目录中的备份集。

  • 指定时间戳回复
$ gpdbrestore -t 20151013195916 --list-backup
  • 恢复数据到新的数据库
$ gpdbrestore -s grants --redirect grants_snapshot
  • 从远程主机备份数据恢复

1>确保远程主机可访问

$ ping archive_host

2>确保gpadmin账户可用

$ ssh gpadmin@archive_host

3>确保可以回ping的master主机

$ ping mdw

4>确保需要恢复的数据库已建好

$ createdb database_name

5>master上运行恢复命令

$ gpdbrestore -R archive_host:/gpdb/backups/archive/20120714 -e dbname

-e 忽略已经被创建的数据库

不同系统配置数据库的恢复

  • 确保数据库已经有完整的备份

包括Master的转储文件(gp_dump_-1_1_timestamp、gp_dump_-1_1_timestamp_post_data)以及每个Segment实例一个的转储文件(例如gp_dump_0_2_timestamp、gp_dump_1_3_timestamp、gp_dump_2_4_timestamp等等)

  • 确保要恢复的数据库已创建
$ createdb database_name
  • 装载Master转储文件来恢复数据库对象
$ psql database_name -f /gpdb/backups/gp_dump_-1_1_20160714
  • 装载每一个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_2016071
  • 装载后续数据文件来恢复索引、触发器、主键约束等数据库对象
$ psql database_name -f /gpdb/backups/gp_dump_0_5_20160714_post_data
  • 更新数据库序列
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
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
psql test_restore -f schema_path_and_seq_next_val

未完待续;

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • Snova基础篇(三):Greenplum集群初始化问题及调试

    gpinitsystem 的日志文件。默认路径为 ~/gpAdmin/gpinitsystem_***

    snova-最佳实践
  • Snova运维篇(九):gp数据库中数据的基本操作-1

    一个表空间可以让多个数据库使用;而一个数据库可以使用多个表空间。属于"多对多"的关系。

    snova-最佳实践
  • Snova运维篇(七):GP数据迁移和监控

    gptransfer会为每个源Segment设置一个命名管道和一个gpfdist进程。这是用于最优数据传输率的配置并且被称为Fast模式。

    snova-最佳实践
  • 【硅谷牛仔】Instagram CEO--凯文·希斯特罗姆--从销售到科技独角兽公司CEO

    Instagram 曾经创造了一个传奇,这个创立只有22个月时间,同时仅有14名员工应用被Facebook斥资10亿美元收购,创始人也迅速以4亿美元身价进入美国...

    春哥大魔王
  • 链课堂02 | 企业应用开发为何选择Fabric?

    SeanCheney
  • centos7.3更换python版本-

    此时需要修改usr/libexec/urlgrabber-ext-down和/usr/bin/yum两个文件

    py3study
  • RTMP推流组件EasyRTMP-iOS版本真机运行报Unable to install “EasyRTMP“错误问题解决

    EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过TSINGSEE青犀视频多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲...

    EasyNVR
  • 编程小白 | 每日一练(178)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • 巨无霸们的数据架构大比拼:Facebook Amazon NetFlix Airbnb的海量数据如何记录分析

    大数据文摘
  • Java实现ZooKeeper的zNode监控

    上一篇文章已经完成了ZooKeeper的基本搭建和使用的介绍,现在开始用代码说话。参考 https://zookeeper.apache.org/doc/cur...

    程序猿讲故事

扫码关注云+社区

领取腾讯云代金券