前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Snova运维篇(三):GP数据库备份和恢复

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

原创
作者头像
snova-最佳实践
发布于 2019-12-26 03:41:09
发布于 2019-12-26 03:41:09
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

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

目录:

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

基本概念:

mkfifo

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


1. 全量备份 gpcrondump工具

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

代码语言:javascript
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
gpcrondump -x mytest -u /backupdir     
  • increntmnet增量
代码语言:javascript
代码运行次数:0
运行
复制
gpcrondump -x mytest -u /backupdir --incremental
代码语言:javascript
代码运行次数:0
运行
复制
gpdbrestore -t 20170114051246 -u /backupdir

3.直接IO

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

操作系统级别的IO优化。

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

查看是否被启用

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

查看当前数据块大小:

代码语言:javascript
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
$ gpconfig -c gp_backup_directIO_read_chunk_mb -v 10

4.使用命名管道

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

实例演示:

  • 为komablog生成备份文件列表
代码语言:javascript
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
[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
代码运行次数:0
运行
复制
nc gp-node1 21000 > gp_dump_0_2_20150519160000.gz
  • 运行gpcrondump开始备份:
代码语言:javascript
代码运行次数:0
运行
复制
gpcrondump -x komablog -K 20150519160000  -u /testdir
  • 从命名管道恢复备份数据
代码语言:javascript
代码运行次数:0
运行
复制
gpdbrestore -x komablog -t 20150519160000 -u /testdir

5.恢复数据

工具gpdbrestore

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

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

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

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

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

1>确保远程主机可访问

代码语言:javascript
代码运行次数:0
运行
复制
$ ping archive_host

2>确保gpadmin账户可用

代码语言:javascript
代码运行次数:0
运行
复制
$ ssh gpadmin@archive_host

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

代码语言:javascript
代码运行次数:0
运行
复制
$ ping mdw

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

代码语言:javascript
代码运行次数:0
运行
复制
$ createdb database_name

5>master上运行恢复命令

代码语言:javascript
代码运行次数:0
运行
复制
$ 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
代码运行次数:0
运行
复制
$ createdb database_name
  • 装载Master转储文件来恢复数据库对象
代码语言:javascript
代码运行次数:0
运行
复制
$ psql database_name -f /gpdb/backups/gp_dump_-1_1_20160714
  • 装载每一个Segment转储文件来恢复数据
代码语言:javascript
代码运行次数:0
运行
复制
$ 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
代码运行次数:0
运行
复制
$ psql database_name -f /gpdb/backups/gp_dump_0_5_20160714_post_data
  • 更新数据库序列
代码语言:javascript
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
psql test_restore -f schema_path_and_seq_next_val

未完待续;

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

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

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

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

评论
作者已关闭评论
暂无评论
推荐阅读
MongoDB(10)- 查询嵌套文档
插入测试数据 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom:
小菠萝测试笔记
2021/06/09
2.1K0
MongoDB(10)- 查询嵌套文档
技术干货| MongoDB如何查询Null或不存在的字段?
点击下方公众号关注并分享,获取MongoDB最新资讯! 在MongoDB中不同的查询操作符对于null值处理方式不同。 本文提供了使用mongo shell中的db.collection.find() 方法查询null值的操作案例。案例中使用的inventory集合数据可以通过下面的语句产生。 db.inventory.insertMany([ { _id: 1, item: null }, { _id: 2 } ]) 等值匹配 当使用**{item:null}作为查询条件的时候,返回的是
MongoDB中文社区
2022/05/07
2.5K0
MongoDB(9)- 文档查询操作之 find() 的简单入门
MongoDB 支持查询条件操作符,下表为 MongoDB 与 RDBMS(关系型数据库,Mysql)常见的查询条件操作符的对比
小菠萝测试笔记
2021/06/09
9380
MongoDB(11)- 查询数组
如果希望找到的是包含 red、blank 两个元素的数组,可以使用 $all 操作符
小菠萝测试笔记
2021/06/09
2.5K0
技术干货| 一文读懂如何查询 MongoDB 文档
点击下方公众号关注并分享获取 MongoDB 最新资讯 一.查询文档 本段提供了使用 mongo shell中 db.collection.find() 方法查询的案例。案例中使用的 inventory 集合数据可以通过下面的语句产生。db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },   { item: "notebook", qty: 50, s
MongoDB中文社区
2022/07/07
4.1K0
MongoDB 多键索引
更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB执行计划获取(db.collection.explain())
Leshami
2018/08/13
1.7K0
MongoDB 多键索引
MongoDB(8)- 文档删除操作
deleteMany() 语法格式 db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } ) remove() 语法格式 语法一 db.collection.remove( <query>, <justOne> ) 语法二 db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document>, collation: <document> } ) 参数说明
小菠萝测试笔记
2021/06/09
7290
MongoDB(8)- 文档删除操作
MongoDB 学习笔记3 - 命令行操作示例
总结:MongoDB 可以每行数据的结构都不同,支持非结构化数据。 区别于 传统的严格结构化数据。
张云飞Vir
2021/07/23
3.5K0
MongoDB(12)- 查询嵌入文档的数组
查询 instock 数组中包含 { warehouse: "A", qty: 5 } 的所有文档
小菠萝测试笔记
2021/06/10
4.8K1
MongoDB基本概念
Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库,说到非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,关系数据库的所使用的SQL语句自从 IBM 发明出来以后,已经有 40 多年的历史了,但是时至今日,开发程序员一般不太喜欢这个东西,因为它的基本理念和程序员编程的想法不一致。后来所谓的 NoSQL 风,指的就是那些不用 SQL 作为查询语言的数据存储系统,而文档数据库 MongoDB 正是 NoSQL 的代表。看一下当下数据库的排名就会发现,目前排在Mongodb数据库前面的无一例外是老牌的关系型数据库,而在NoSQL序列中,Mongodb排名第一,且有上升的趋势。
Java廖志伟
2022/03/07
6.7K0
MongoDB基本概念
Mongodb日常操作命令
db.js_wx_setting_menu.storageSize();
DBA实战
2024/11/18
1190
Mongodb日常操作命令
MongoDB Document CRUD Operations
通过在find方法中传入Query Filter Documents,Query Filter Documents可以完成对特定记录的读取、更新和删除操作,格式如下:
shysh95
2024/06/14
2060
MongoDB Document CRUD Operations
Mongodb多键索引之数组文档
接上2篇文档关于多键索引内容,接着学习数组文档,主要实验来验证如何进行高效数据查询,通过对比方式来验证3种多键索引优缺点以及适合场景,具体链接如下:
徐靖
2020/08/25
3.3K0
mongodb的CRUD操作详解2-find
查询操作 比较运算符 英文 数学符号 $lt Lower Than < $lte Lower Than or Euqal <= $gt Greater Than > $gte Greater Than or Equal >= $ne Not Equal != 逻辑运算符 含义 $or 或运算 $in 元素 In 集合(数组) $nin 元素 not In 集合(数组) $not 取反 //查询集合内所有文档,pretty格式化查询结果 db.inventory.find( {} ) db.invento
字母哥博客
2020/09/23
5120
MongoDB干货篇之查询数据
文章目录 1. MongoDB干货篇之查询 1.1. 准备工作 1.2. find() 1.2.1. 实例: 1.3. 查询内嵌文档 1.3.1. 完全匹配查询 1.3.2. 键值对查询 1.4. 查询操作符 1.4.1. 实例 1.4.2. $ne 1.4.3. slice 1.4.4. $exists 1.4.5. $or 1.4.6. $and 1.4.7. $in 1.4.8. $nin 1.4.9. $not 1.5. 迭代游标的查询 MongoDB干货篇之查询 准备工作 在开始之前我们应该
爱撒谎的男孩
2019/12/31
1.3K0
[置顶] 数据库MongoDB查询语句--持续更新
链接:https://pan.baidu.com/s/1RjU1BXq2rXFG07Zaw5BHrQ 提取码:o1w5
JQ实验室
2022/01/11
3.9K0
MongoDB :第五章:MongoDB 插入更新删除查询文档
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。 插入文档
马克社区
2023/03/06
1.2K0
MongoDB(13)- 查询操作返回指定的字段
答案是不能的,如果想指定 <projection> 是包含字段,那所有字段值都得统一是 1,相反如果是不包含,也必须都是 0
小菠萝测试笔记
2021/06/10
6.7K0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
https://docs.mongodb.com/manual/tutorial/insert-documents/
郑子铭
2021/01/02
7240
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
mongodb高级应用
一、  高级查询 查询操作符 条件操作符:db.collection.find({“field”:{$gt/$lt/$gte/$lte/$eq/$ne:value}}); 匹配所有:db.collection.find({age:{$all:[6,8]}});//字段的数组中符合全部条件才行。 判断字段存在:db.colletion.find({field:{$exists:true}})//还可用于remove等。 Null值的处理:db.collection.find({field:{“$in”:nul
一夕如环
2018/04/03
1.3K0
相关推荐
MongoDB(10)- 查询嵌套文档
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档