本次准备复现一下之前遇到的一个错误,因为硬盘的故障导致的primary实例上的pg_class表内容缺失,会造成在master主机查询报错。
在自己的测试机创建新的数据库和表,并将psql命令进入的默认数据库改为新创建的。
如果不指定的话执行psql命令就会报错
建表
查看指定模式下有多少张表
如果不确定表的模式名也可以这样,schema就是模式名。
复现错误,删除primary实例上pg_class表中的内容。
获取表的oid,比如a,b两表。oid字段如果不指定的话是不会出现的。
登录任意peimary节点
标准语句
PGOPTIONS="-c gp_session_role=utility" psql -h ip -p 端口 -d 模式名
例如本次我想登录gp1主机上的gpseg0实例
在gp_segment_configuration表中也能查到端口
删除之前先备份使用copy to命令,可以看到备份的是两行数据。
备份的文件是在登录的指定主机上 我登录的是gp1主机备份的文件就在gp1主机的家目录下
需要注意的是如果没有指定oid字段,就需要加上参数指定OIDS
删除gpseg0主机pg_class表中关于a,b两表的内容,此时在gp1主机上的pg_class表是没有a,b表的内容了,但是在master表是有的。并且此时被删除的表无法在master主机上删除。
master主机
gp1主机
无法删除
其中set allow_system_table_mods=DML;是允许对元数据进行修改,假如不设置的话就会提示没有权限。
以上的操作是为了复现当时的错误,正常情况下遇到这样的报错需要使用gpcheckcat命令来检验数据库目录表的不一致性。
有两个选择一个是在线检查,一个是全量检查 可以根据本身业务的需求选择使用。默认的输出目录是家目录下的gpAdminLogs目录
在线检查:
nohup $GPHOME/bin/lib/gpcheckcat -O -A -p 5432 2>&1 > gpcheckcat.date +%F_%s.log &
全量检查:注意全量检查需要加master的端口
nohup $GPHOME/bin/lib/gpcheckcat -A -p5432 2>&1 > gpcheckcat.date +%F_%s.log &
可以看到刚才删除的表名和oid和segid
接下来就是修复鉴于gp1主机上只有一个primary,所以尝试使用gp2主机primary的pg_class
登录gp2主机
将a,b两表的内容copy到家目录
将文件从gp2传输到gp1
登录gp1主机使用copy命令使用gp2主机的文件恢复并查询
master主机查询
标签:主机,greenplum,gp1,报错,pg,master,class From: https://www.cnblogs.com/xurui96/p/17086381.html