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

2019-12-26 11:41:09 浏览数 (1)

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

目录:

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

基本概念:

mkfifo

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


1. 全量备份 gpcrondump工具

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

代码语言:javascript复制
[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

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

代码语言:javascript复制
[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配置后必须先创建和一个完全备份,才能接着创建增量备份。

操作实例:

  • 首先创建全量备份并自定义备份目录
代码语言:javascript复制
gpcrondump -x mytest -u /backupdir     
  • increntmnet增量
代码语言:javascript复制
gpcrondump -x mytest -u /backupdir --incremental
代码语言:javascript复制
gpdbrestore -t 20170114051246 -u /backupdir

3.直接IO

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

操作系统级别的IO优化。

  • 打开直接IO
代码语言:javascript复制
[gpadmin@gp-master ~]$ gpconfig -c gp_backup_directIO -v on

查看是否被启用

代码语言:javascript复制
gpconfig -s gp_backup_directIO
  • 修改IO数据块大小

查看当前数据块大小:

代码语言:javascript复制
[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:

代码语言:javascript复制
$ gpconfig -c gp_backup_directIO_read_chunk_mb -v 10

4.使用命名管道

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

实例演示:

  • 为komablog生成备份文件列表
代码语言:javascript复制
[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中的目录文件
代码语言:javascript复制
[gpadmin@gp-master data]$ tree testdir/
testdir/
`-- db_dumps
    `-- 20150519
        |-- gp_dump_20150519160000_pipes
        `-- gp_dump_20150519160000_regular_files

2 directories, 2 files
  • 查看pipes文件的内容
代码语言:javascript复制
[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上创建指定的命名管道。还未命名管道设置一个读取器。
代码语言:javascript复制
[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
  • 接收备份文件
代码语言:javascript复制
nc gp-node1 21000 > gp_dump_0_2_20150519160000.gz
  • 运行gpcrondump开始备份:
代码语言:javascript复制
gpcrondump -x komablog -K 20150519160000  -u /testdir
  • 从命名管道恢复备份数据
代码语言:javascript复制
gpdbrestore -x komablog -t 20150519160000 -u /testdir

5.恢复数据

工具gpdbrestore

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

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

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

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

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

1>确保远程主机可访问

代码语言:javascript复制
$ ping archive_host

2>确保gpadmin账户可用

代码语言:javascript复制
$ ssh gpadmin@archive_host

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

代码语言:javascript复制
$ ping mdw

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

代码语言:javascript复制
$ createdb database_name

5>master上运行恢复命令

代码语言:javascript复制
$ 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等等)

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

未完待续;

0 人点赞