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

Greenplum的可靠性还是没法和传统商业数据库相比,它跑着跑着就会把自己的元数据给跑乱,有些是可以通过命令修复的,有些则只能直接去增删改system catalog。本文结合一个具体错误,介绍如何操作system catalog解决元数据错误。

现象

使用gpcheckcat -p 5432 databasename检查数据库时,将报出类似如下的输出:

Relation oid: 12345678
Relation name: None.None

    Name of test which found this issue: foreign_key_pg_class
        No pg_class entry for gp_distribution_policy {‘localoid‘:12345678 } on master (mdw:5432)

在master host的OS里,用Greenplum的管理员用户,比如gpadmin,执行:

psql -d databasename -c ‘select * from gp_distribution_policy where localoid=12345678;‘

见得到类似如下输出:

localoid | attrnums
----------+----------
  12345678 | {1}
(1 row)

分析

这个错误表示在master node中记录分布策略的gp_distribution_policy元数据表中,存在一行记录表示Relation(oid=12345678)的分布策略(按column 1分布),而在记录所有数据库对象的pg_class元数据表中根本就没有oid=12345678的relation,因此,也无从获取到relation的名字(错误信息中只好显示为None.None)。在这种情况下,没有任何数据库命令能drop掉这个oid=12345678的relation。只好直接去操作system catalog。

解决

基本思路当然就是将gp_distribution_policy的这条记录删除,但是Greenplum是不允许直接操作system catalog的:

databasename=# delete from gp_distribution_policy where localoid=12345678;
ERROR:  permission denied: "gp_distribution_policy" is a system catalog

要操作system catalog,数据库必须已maintenance mode启动,psql要使用utility mode连接到数据库上,具体操作步骤如下,这些操作需要在维护窗口做,因为涉及到数据库停机:

  • root登陆master host
  • 切换到Greenplum的管理员用户,比如gpadmin:
su - gpadmin
  • 停止数据库:
gpstop -M fast
  • 将数据库启动到维护模式:
gpstart -m
  • 使用utility模式连接数据库:
PGOPTIONS=‘-c gp_session_role=utility‘ psql databasename
  • 在psql中设置system catalog可以编辑:
databasename=# set allow_system_table_mods=DML;
  • 在psql中删除gp_distribution_policy中的记录:
databasename=# delete from gp_distribution_policy where localoid=12345678;
  • 退出psql:
databasename=# \q
  • 停止数据库维护模式:
gpstop -m
  • 启动数据库生产模式:
gpstart
时间: 2024-10-10 12:30:20

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

解决RedHat中ifconfig命令不能使用的问题

在RedHat中, 打开终端, 运行 "ifconfig" 命令, 如果给出的提示是 "command not found", 那里我们可以按下面的方法来解决: 1. 输入 ifconfig 命令的绝对路径, ifconfig在是/sbin这个目录下面, 所以在终端输入下列命令就可以运行此命令: /sbin/ifconfig 2. 我们还可以修改 profile文件, 将 /sbin目录添加到 PATH 里, 这样不论在个目录里, 都不用输入绝对路径就可以运行这个此

解决Ubuntu中vi命令的编辑模式下不能正常使用键盘问题

在Ubuntu中,进入vi命令的编辑模式,发现按方向键不能移动光标,会输出ABCD,以及退格键也不能正常删除字符.这是由于Ubuntu预装的是vim-tiny,而我们需要使用vim-full,解决方法很简单,只需要以下两步: 步骤一,输入下述命令以卸载vim-tiny: sudo apt-get remove vim-common 1 1 步骤二,输入下述命令以安装vim-full: sudo apt-get install vim

如何解决Greenplum的gpcheckcat关于persistent的错误

Greenplum的gpcheckcat是用来检查system catalog的一致性的命令,其中有专门针对磁盘文件的检查($GPHOME/bin/lib/gpcheckcat -R persistent -p 5432 databasename),主要是对于system catalog里关于磁盘文件的记录与实际磁盘文件的情况的一致性检查.本文结合一个实际错误介绍如何解决这类元数据错误. 现象 gpcheckcat的日志文件(比如/home/gpadmin/gpAdminLogs/gpcheck

[转]linux中强大的screen命令

[转]linux中强大的screen命令 http://pythonorg.diandian.com/post/2012-01-05/40027464147 今天用SCREEN用点生了,有几个功能不知道怎么用,上网搜了一下,有位哥们写的挺细的,向这哥们致敬,我这里就转走了,备查用.因为还有好几个有用实用好用的功能文章都没有描述到.我将在转载的最后给预补充.以下转载开始 转载地址:http://hi.baidu.com/nkhzj/blog/item/9de2cdfdddf0db42d7887d4

如何解决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_d

promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的通知机制. 异步:当事情处理完成后被请求者会发信息通知请求者该事情处理完成.在这期间被请求者可以选择是继续等待命令请求完成还是去做其他事等待被请求者返回. 同步:当事情处理完成后被请求者不会告知请求者,等到请求者发来询问是才会告知 阻塞:非阻塞 指的是请求者 阻塞:针对请求者来说的,委托其他人处理一

使用RNN解决NLP中序列标注问题的通用优化思路

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 序列标注问题应该说是自然语言处理中最常见的问题,而且很可能是最而没有之一.在深度学习没有广泛渗透到各个应用领域之前,传统的最常用的解决序列标注问题的方案是最大熵.CRF等模型,尤其是CRF,基本是最主流的方法.随着深度学习的不断探索和发展,很可能RNN模型会取代CRF的传统霸主地位,会成为解决序列标注问题的标配解决方案. 本文主要抽象出利用RNN解决序列标注问题的通用优化思路.这个RNN优化思路应该

浅谈利用同步机制解决Java中的线程安全问题

我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等着前面千百万人挑选购买,最后心仪的商品下架或者售空......假如饿了吗是单线程程序,那么一个用户得等前面全国千万个用户点完之后才能进行点餐,那饿了吗就该倒闭了不是吗?以上两个简单的例子,就说明一个程序能进行多线程并发访问的重要性,今天就让我们去了解一下Java中多线程并发访问这个方向吧. **第一

解决 CentOS7 安装完成后ifconfig命令不能用

今天用VMWare安装了CentOS7,选择了最小安装包模式,安装完毕之后想查看一下本机的ip地址,发现报错 # ifconfig -bash: ifconfig: command not found 谷歌了一下,整理了一下解决思路 查看ifconfig命令是否存在 查看 /sbin/ifconfig是否存在 如果ifconfig命令存在,查看环境变量设置 #echo $PATH 如果环境变量中没有包含ifconfig命令的路径 临时修改环境变量:在shell中输入 $export PATH =