greenplum数据库中mirror的作用就是作为primary的备份存在。那么恢复down掉的mirror或primary时,是否可以直接复制文件从primary或mirror到对应的mirror或primary来启动数据库,而不采用gprecoverseg呢?答案是肯定的。下面将讨论其中需要涉及的相关文件以及会出现的问题。
1,最简单的情况-某个mirror在down掉后,数据库没有出现数据修改操作的情况,此时进行恢复。
此时,该mirror和对应的primary记录数据的文件base是一样的。
pg_xlog是PostgreSQL的事务日志,包含几个二进制文件,每个文件固定大小为64MB,并不断重复使用,记录关于最近事务的数据。
greenplum在启动时正是通过对比primary和mirror的pg_xlog来判断它们是否处于同步状态,那么可以通过复制down掉的mirror对应的primary上的pg_xlog到该mirror上来"骗"过数据库启动时,master对他们的对比检查。另外还需要修改gp_segment_configuration中这一对实例的状态到正常,否则master还是会判断该mirror就是down掉了。
操作示例说明:--现在content=0的mirror是'd'。
testDB=# select * from gp_segment_configuration;               
 dbid | content | role | preferred_role | mode | status | port  | hostname | address | replication_port | san_mounts
------+---------+------+----------------+------+--------+-------+----------+---------+------------------+------------
    1 |      -1 | p    | p              | s    | u      |  5432 | mdw      | mdw     |                  |
    3 |       1 | p    | p              | s    | u      | 40000 | sdw2     | sdw2    |            41000 |
    5 |       1 | m    | m              | s    | u      | 50000 | sdw1     | sdw1    |            51000 |
    2 |       0 | p    | p              | c    | u      | 40000 | sdw1     | sdw1    |            41000 |
    4 |       0 | m    | m              | s    | d      | 50000 | sdw2     | sdw2    |            51000 |
--停掉数据库。
[gpadmin@mdw ~]$ gpstop -a
--将content=0的primary上的pg_xlog传输到目标节点机上。
[gpadmin@sdw1 gpseg0]$ scp -r pg_xlog/ gpadmin@sdw2:/data1/mirror
000000010000000200000014                                                       100%   64MB  64.0MB/s   00:01   
000000010000000200000015                                                       100%   64MB  64.0MB/s   00:01   
000000010000000200000016                                                       100%   64MB  32.0MB/s   00:02   
000000010000000200000017                                                       100%   64MB  64.0MB/s   00:01   
000000010000000200000018                                                       100%   64MB  64.0MB/s   00:01   
000000010000000200000019                                                       100%   64MB  64.0MB/s   00:01   
00000001000000020000001A                                                       100%   64MB  64.0MB/s   00:01   
00000001000000020000001B                                                       100%   64MB  64.0MB/s   00:01   
00000001000000020000001C                                                       100%   64MB  32.0MB/s   00:02   
00000001000000020000001D                                                       100%   64MB  64.0MB/s   00:00  
--用传输过来的pg_xlog覆盖该mirror上的pg_xlog。
[gpadmin@sdw2 mirror]$ cp -r pg_xlog/ gpseg0/
[gpadmin@sdw2 mirror]$ rm -rf pg_xlog/ 
--修改gp_segment_configuration中这一对实例的状态到正常。
[gpadmin@mdw ~]$ gpstart -m
[gpadmin@mdw ~]$ PGOPTIONS="-cgp_session_role=utility" psql
psql (8.2.15)
Type "help" for help.
testDB=# set allow_system_table_mods='dml';
testDB=#  update gp_segment_configuration set mode='s' where dbid=2;                                     
UPDATE 1
testDB=# update gp_segment_configuration set status='u' where dbid=4;
UPDATE 1
testDB=# select * from gp_segment_configuration ;
 dbid | content | role | preferred_role | mode | status | port  | hostname | address | replication_port | san_mounts
------+---------+------+----------------+------+--------+-------+----------+---------+------------------+------------
    1 |      -1 | p    | p              | s    | u      |  5432 | mdw      | mdw     |                  |
    3 |       1 | p    | p              | s    | u      | 40000 | sdw2     | sdw2    |            41000 |
    5 |       1 | m    | m              | s    | u      | 50000 | sdw1     | sdw1    |            51000 |
    2 |       0 | p    | p              | s    | u      | 40000 | sdw1     | sdw1    |            41000 |
    4 |       0 | m    | m              | s    | u      | 50000 | sdw2     | sdw2    |            51000 |
(5 rows)
[gpadmin@mdw ~]$ gpstop -m
[gpadmin@mdw ~]$ gpstart -a
20150907:23:19:24:013031 gpstart:mdw:gpadmin-[INFO]:-Starting gpstart with args: -a
20150907:23:19:24:013031 gpstart:mdw:gpadmin-[INFO]:-Gathering information and validating the environment...
20150907:23:19:24:013031 gpstart:mdw:gpadmin-[INFO]:-Greenplum Binary Version: 'postgres (Greenplum Database) 4.3.5.1 build 1'
20150907:23:19:24:013031 gpstart:mdw:gpadmin-[INFO]:-Greenplum Catalog Version: '201310150'
20150907:23:19:24:013031 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance in admin mode
20150907:23:19:25:013031 gpstart:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information
20150907:23:19:25:013031 gpstart:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...
20150907:23:19:25:013031 gpstart:mdw:gpadmin-[INFO]:-Setting new master era
20150907:23:19:25:013031 gpstart:mdw:gpadmin-[INFO]:-Master Started...
20150907:23:19:25:013031 gpstart:mdw:gpadmin-[INFO]:-Shutting down master
20150907:23:19:27:013031 gpstart:mdw:gpadmin-[INFO]:-Commencing parallel primary and mirror segment instance startup, please wait...
.......
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-Process results...
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-   Successful segment starts                                            = 4
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-   Failed segment starts                                                = 0
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-   Skipped segment starts (segments are marked down in configuration)   = 0
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-Successfully started 4 of 4 segment instances
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-----------------------------------------------------
20150907:23:19:34:013031 gpstart:mdw:gpadmin-[INFO]:-Starting Master instance mdw directory /data/master/gpseg-1
20150907:23:19:35:013031 gpstart:mdw:gpadmin-[INFO]:-Command pg_ctl reports Master mdw instance active
20150907:23:19:35:013031 gpstart:mdw:gpadmin-[INFO]:-No standby master configured.  skipping...
20150907:23:19:35:013031 gpstart:mdw:gpadmin-[INFO]:-Database successfully started
--说明直接复制primary的文件pg_xlog至mirror,而不用gprecoverseg来恢复的方法是可行。
2, 某个mirror在down掉后,数据库出现了数据修改操作的情况,此时进行恢复。
如果此时还想用复制文件的方法进行恢复,就需要复制记录数据的base文件夹中的内容,如果不清楚具体那些文件不一样,可以复制覆盖整个base文件夹。
这里我主要想说明,数据库出现了数据修改操作,而没有复制base中的相应文件,只是复制pg_xlog来恢复启动数据库后引起的错误后果。
如果在content=0的mirror down掉后,创建了一个表syn_test,并插入了数据。
testDB=# create table syn_test(id int,name varchar(10)) distributed by (id);
CREATE TABLE
testDB=# insert into syn_test values(1,'ab'),(2,'dc'),(3,'dfs'),(4,'sfs');
INSERT 0 4
--该表的oid为890432,可以content=0的primary的base下找到刚建立的该文件,但在content=0的mirror的base下是没有该文件的。
testDB=# select oid,relname from pg_class where relname='syn_test';
  oid   | relname
--------+---------
 890432 | syn_test
(1 row)此时数据库出现了数据修改操作,但按上面第一节的方法,仅复制pg_xlog,并修改gp_segment_configuration来启动数据库。
此时增删改查都是正常的。
testDB=# select * from syn_test;
 id | name
----+------
  1 | ab
  3 | dfs
  2 | dc
  4 | sfs
(4 rows)
testDB=# insert into syn_test values (5,'asfd'),(6,'fjdslj');
INSERT 0 2
testDB=# delete from syn_test where id in (5,6);
DELETE 2
testDB=#  alter table syn_test alter name type char(10);
ALTER TABLE但kill掉content=0的primary, 让content=0的mirror担当primary的角色时,任何操作都会出错。
testDB=# select * from syn_test;
ERROR:  relation with OID 890432 does not exist  (seg0 slice1 sdw2:50000 pid=10501)--说明改表在该mirror中根本就不存在。
--在进行此种非正常操作时需谨慎判断数据的变化。
3,建立一个全新的gpseg0文件夹。还有个问题就是将primary的整个gpseg0复制到对应的mirror的文件位置,建立一个全新的gpseg0文件夹,是否可行呢?
其实,直接复制文件夹也是可以的,但需要修改文件夹中记录关于实例信息的两个文件gp_dbid 和postmaster.opts,另外修改gp_segment_configuration中这一对实例的状态到正常还是必须的。
下面的对比可以看出primary和mirror中这两个文件的不同之处。
primary的gp_dbid
[gpadmin@sdw1 gpseg0]$ cat gp_dbid
# Greenplum Database identifier for this master/segment.
# Do not change the contents of this file.
dbid = 2
mirror的gp_dbid
[gpadmin@sdw2 gpseg0]$ cat gp_dbid
# Greenplum Database identifier for this master/segment.
# Do not change the contents of this file.
dbid = 4
primary的postmaster.opts
[gpadmin@sdw1 gpseg0]$ cat postmaster.opts
/usr/local/greenplum-db-4.3.5.1/bin/postgres "-D" "/data1/primary/gpseg0" "-p" "40000" "-b" "2" "-z" "2" "--silent-mode=true" "-i" "-M" "quiescent" "-C" "0"
mirror的postmaster.opts,需修改3 处
[gpadmin@sdw2 gpseg0]$ cat postmaster.opts
/usr/local/greenplum-db-4.3.5.1/bin/postgres "-D" "/data1/mirror/gpseg0" "-p" "50000" "-b" "4" "-z" "2" "--silent-mode=true" "-i" "-M" "quiescent" "-C" "0"
这里主要是理解pg_xlog的作用,为恢复数据库打开新的思路。

原文:https://blog.csdn.net/aabc012/article/details/48280983

采用非常规方法(非gprecoverseg) 恢复greenplum数据库的更多相关文章

  1. SQL 恢复master数据库方法,没有log文件的数据库文件恢复方法

    SQL Server恢复master数据库方法 第一步:复制model.mdf.mastlog.ldf.model.mdf.modellog.ldf.msdbdata.mdf.msdblog.ldf文 ...

  2. 用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

    用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及 ...

  3. 命令行下从bak文件恢复sqlserver数据库方法

    命令行下从bak文件恢复sqlserver数据库方法 注:本文所示访问从SqlServer 2000 - 2014版都是通用的 参考:http://blog.sina.com.cn/s/blog_5c ...

  4. [原创]Greenplum数据库集群实践

    GreenPlum实践 ============================================== 目录: 一.安装环境准备 二.GP数据库安装 三.集群添加standby节点 四. ...

  5. MPP - GreenPlum数据库安装以及简单使用

    一.集群介绍 共3台主机,ip 为193.168.0.93   193.168.0.94  193.168.0.95 集群对应master和segment如下,193.168.0.93为master节 ...

  6. ADO.NET 连接方式和非链接方式访问数据库

    一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...

  7. PostgreSQL和GreenPlum数据库的区别

    PostgreSQL   PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为POSTGRES,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS).Po ...

  8. 【转载】greenplum数据库引擎探究

    Greenplum做为新一代的数据库引擎,有着良好的发展与应用前景.强大的工作效率,低成本的硬件平台对数据仓库与商业智能建设有很大的吸引力.要清楚的了解其特点最好从架构着手. 架构分析  Greenp ...

  9. mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................

    mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...

随机推荐

  1. golang之文件结尾错误(EOF)

    函数经常会返回多种错误,这对终端用户来说可能会很有趣,但对程序而言,这使得情况变得复杂.很多时候,程序必须根据错误类型,作出不同的响应.让我们考虑这样一个例子:从文件中读取n个字节.如果n等于文件的长 ...

  2. web框架解析

    一.白手起家 要想模拟出web请求响应的流程,先想想平时我们是怎么上网浏览网页的?首先打开浏览器,然后在地址栏中输入我们想要访问的页面,紧接着按下回车键Enter,最后跳转至目标页面(当然我们也会出现 ...

  3. docker 实践七:docker-machine

    本篇是关于 docker 三剑客中的 docker machine. 注:环境为 CentOS7,docker 19.03. docker-machine 是 docker 官方三剑客项目之一,它是一 ...

  4. Python开发【第二章】:数据类型

    基本数据类型 一.整型 如: 18.73.84 整型具备如下功能: class int(object): """ int(x=0) -> int or long i ...

  5. 使用UltraISO制作Centos7 U盘启动盘遇到的坑

    下载.安装UltraISO软件 安装好以后,打开软件 击菜单栏的"文件"选项,再点击"打开"按钮,选择要刻录的系统镜像 点击菜单栏的"启动" ...

  6. Spring/Spring Boot整合Weblogic JMS实战

    本文主要介绍weblogic jms的配置,包括JMS 服务器和JMS 模块(连接工厂.队列.远程 SAF 上下文.SAF 导入目的地.SAF 错误处理)的配置:并在Spring/Spring Boo ...

  7. 命令“regsvr32 /s /n /i:user "XXXXXX"”已退出,代码为 3

    问题:命令“regsvr32 /s /n /i:user "F:\XXXXXXXXXXXXXXXXX\Release\One.ocx"”已退出,代码为 3 解决方法: The is ...

  8. 基于socket.io客户端与服务端的相互通讯

    socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先 ...

  9. 解决JAVA连接Sybase数据库查询数据乱码的问题

    连接字符串加上charset=eucgb&jconnect_version=0例如:jdbc:sybase:Tds:server:port/database?charset=eucgb& ...

  10. stm32 引脚映射 和 ADC

    老是弄不明白ADC的输入到底在哪,看了stm32F103Ve的datasheet,将引脚和通道的映射关系贴在下面: 好了,写到这,我已经看了中文手册一上午了,可是啥都没看懂,下午接着看,写代码不重要, ...