如何解决Greenplum中用pg_dump备份数据结构时的分布策略缺失等三个问题

Greenplum的元数据错误也会影响到数据备份过程,在使用pg_dump进行数据结构备份时,会由于分布策略的缺失导致备份失败,本文介绍此错误的解决办法。

现象

使用pg_dump命令备份整个Greenplum数据库的数据结构时:

pg_dump -f /data/dailybak/dw-nodata-$(date +%Y%m%d%H%M%S) -v -F c -p 5432  -h masterhostname -C -d databasename -s

报出如下错误后,备份进程终止:

pg_dump: query to obtain distribution policy of table "table1" returned no data

分析

出现此错误后,从pg_class元数据表中找到此relation的oid:

psql databasename -c "select oid,* from pg_class where relname=‘table1‘;"

假定输出的oid为1234,relnamespace为5678,如果有多条,就逐条处理,从gp_distribution_policy中查找localoid为此oid的记录:

psql databasename -c "select oid,* from gp_distribution_policy where localoid=1234;"

此查询应返回0条记录,从pg_namespace中找到此表所属namespace名称:

psql databasename -c "select * from pg_namespace where oid=5678;"

假定nspname为ns1,至此,证明ns1.table1没有分布策略,因此备份失败

解决

基本思路是为ns1.table1设置分布策略:

  • root登陆master host
  • 切换到Greenplum的管理员用户,比如gpadmin:
su - gpadmin
  • 使用psql连接数据库:
psql databasename
  • 设置随机分布策略
alter table ns1.table1 set distributed randomly;

或者设置指定列为分布依据

databasename=# alter table ns1.table1 set distributed by (column1);

如果此修改报错:

ERROR:  SET DISTRIBUTED BY not supported on non-distributed tables

则放弃下一步重分布,drop掉ns1.table1重建吧

  • 重分布
databasename=# alter table ns1.table1 set with(reorganize=true);
  • 重建完或重分布完,查看修改结果:
databasename=# \d ns1.table1

应返回表的基本信息

databasename=# select oid,* from pg_class where relname=‘table1‘;

如重建过,假定返回的oid为12345,否则就是1234

databasename=# select oid,* from gp_distribution_policy where localoid=12345;

应返回这个表的分布策略

  • pg_dump是个讨厌的家伙,它一遇到错误就停止,解决了它才会继续向下,如果再遇到错误再停止,为了避免此类型的错误继续出现,可使用如下命令查询ns1中没有分布键值的表,此输出中可能包含视图,挑选需要处理的用户表按照上面的步骤进行处理:
databasename=# select relname from pg_class where relnamespace=5678 and oid not in (select localoid from gp_distribution_policy);

其他

附送两个pg_dump的其他问题:

  • 提示pg_class.oid是不存在的字段,如果遇上了,去查一下错误信息中只是的namespace里是不是有叫pg_class的用户自定义表,如果有,重命名或drop它吧,为什么要建也system catalog一样名字的表呢。。。三天啊,整整三天。。。
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  column c.oid does not exist
LINE 1: ...spname=‘dataservice‘ AND c.relnamespace=n.oid AND c.oid = p....
                                                             ^
pg_dump: The command was: SELECT attrnums from pg_namespace as n, pg_class as c, gp_distribution_policy as p WHERE c.relname = ‘table1‘ AND n.nspname=‘ns1‘ AND c.relnamespace=n.oid AND c.oid = p.localoid
pg_dump: *** aborted because of error
  • 在使用-o参数进行pg_dump时,提示某些表不存在,但是这些表在任何节点的pg_class中都不存在,也无法drop,办法是把丫创建出来
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  relation "ns1.table1" does not exist
pg_dump: The command was: LOCK TABLE ns1.table1IN ACCESS SHARE MODE
pg_dump: *** aborted because of error
时间: 2024-10-14 23:17:36

如何解决Greenplum中用pg_dump备份数据结构时的分布策略缺失等三个问题的相关文章

linux上备份Oracle时EXP-00091的错误解决方法

unix/linux上备份Oracle时EXP-00091的错误解决方法 unix/linux上备份数据时的错误解决方法 EXP-00091: Exporting questionable statistics.解决方法 今日EXP数据发现如下错误: EXP-00091: Exporting questionable statistics. . . exporting table                     TAXVOU3129    2904185 rows exported EX

如何解决Greenplum中无法通过标准命令修复的元数据错误

Greenplum的可靠性还是没法和传统商业数据库相比,它跑着跑着就会把自己的元数据给跑乱,有些是可以通过命令修复的,有些则只能直接去增删改system catalog.本文结合一个具体错误,介绍如何操作system catalog解决元数据错误. 现象 使用gpcheckcat -p 5432 databasename检查数据库时,将报出类似如下的输出: Relation oid: 12345678 Relation name: None.None Name of test which fou

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

解决Android应用安装快完毕时提示签名冲突

最近开发了一个Android手机应用,自己用Eclipse调试安装没问题,使用其他人调试生成的bin下的apk就会出现问题,安装到最后提示"安装签名冲突"错误,想了一下估计是没有给apk统一签名导致,以下说一下如何解决这个问题. 生成keystore文件 命令:keytool -genkey -v -keystore "c:\android\release\relase.keystore" -alias androidbook –storepass paxxword

解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChanged 信号,把连接cellChanged信号的语句放置在一连串的setItem(在表格插入一行后调用的)之后就可以了. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题

如果你的操作系统是Win7 64位,在运行Skyline6.5提供的ITE3DWindowEx控件实现多球对比时,启动程序调试运行时,却自动运行了TerraExplorer软件, 这时候你会发现form上或者html页面上,那个三维地图控件变成了“白板”, 你可以试着这样去解决这个问题: 1.运行注册表:cmd  regedit: 2.找到这一项:HKEY_CURRENT_USER\SOFTWARE\Skyline\TerraExplorer Globals: 3.在这里新建一个DWORD 32

用友新建帐套“设置备份计划”时提示“已经有用户使用【备份计划管理】,不能调整”

USE UFSystem SEELCT   * from ua_tasklog where cStation='登录的机器名' and cSub_Id='dp' DELETE from ua_tasklog where cStation='登录的机器名' and cSub_Id='dp' 用友新建帐套"设置备份计划"时提示"已经有用户使用[备份计划管理],不能调整"

解决在Fragment中启动Activity时传递请求码的问题

解决在Fragment中启动Activity时传递请求码的问题: 首先需要指出的是Fragment有startActivityForResult方法,而Activity中也有startActivityForResult方法:两者的区别是: Fragment中的startActivityForResult方法: FragmentActivity中的startActivityForResult方法: 从官方的解释中可以看出Fragment中的startActivityForResult方法是调用的是

利用jQuery 解决URL请求参数有中文时出现乱码的问题

利用jQuery 解决URL请求参数有中文时出现乱码的问题 在开发的时候经常会碰到URL中请求参数含有中文的情况,这时如果在前台不作处理,直接在后台利用request.getParameter()拿对应的参数值就会出现中文乱码. 这时可以先利用jQuery对对应中文进行encodeURI(),例子如下: 前台对应代码 <!--省畋无关代码--> <input type="button" id="submitA" value="重发短信&q