【问题标题】:Postgres catalog is missing缺少 Postgres 目录
【发布时间】:2013-08-18 06:48:13
【问题描述】:

我的朋友复制了“data”目录来格式化他的客户电脑并恢复 postgres 数据库,但现在数据库显示很多关于目录丢失的错误。

表格只加载列,但不加载数据,也没有视图。

您有什么想法可以在这种情况下解决这个问题吗? 我们已经尝试过这个链接:http://grokbase.com/t/postgresql/pgsql-hackers/051ebftr4m/fatal-catalog-is-missing-1-attribute-s-for-relid-16396http://www.justskins.com/forums/error-catalog-is-missing-208043.html

谢谢, 问候

莱安德罗

【问题讨论】:

  • 如果您在 PostgreSQL 停止时对“数据”目录进行了完整备份,则在目录中没有表空间或链接,并且您在两者上都有相同版本的二进制文件,那么这应该可以工作。如果有人要提供帮助(或更好的朋友),您将需要提供一些实际细节。最低限度的详细信息:操作系统、PostgreSQL 版本 + 安装方法、安装方法、如何进行备份、如何进行还原、启动时日志显示的内容。
  • 准确请来自源和目标机器的 PostgreSQL 版本,以及日志副本,而不仅仅是对错误的模糊描述。
  • 这里有一些人由于不存在备份计划或服务器崩溃而不得不从 datadir 恢复数据库。 1.recover-postgresql-databases-from-raw-physical-files和2save-postgres-database-from-broken-ubuntu-10-04-server

标签: database postgresql restore


【解决方案1】:

您的朋友可能应该阅读过手册:backup and restoreupgrading between releases

只有在以下情况下才能将数据目录复制到另一台机器:

  • 源机器上的 PostgreSQL 在复制 datadir 之前已关闭;
  • 整个数据目录被复制,包括pg_xlogbasepg_clog,任何表空间目录;等等
  • 目标机器在与源机器相同的操作系统和架构上具有相同的 PostgreSQL 主要版本;例如,32 位 Windows 上的 PostgreSQL 9.1。

违反任何这些规则,如果服务器完全启动,它将以损坏/不可读的数据启动。

【讨论】:

  • 我得到了一些细节 SO: Windows XP SP3 Postgres: 8.2 (ACSII) 消息错误是这样的:catalog is missing x attribute(s) for relid xxxxxxx 复制前机器没有关闭文件。我们复制了整个 datadir,包括日志目录。感谢您的帮助!
  • @Leandro 好的,非常过时的 PostgreSQL(8.2,真的吗?!)。至于副本,当然机器并没有关闭,但是在复制数据目录之前数据库服务器是否停止了?否则,某些文件可能无法复制或被复制损坏。由于 Windows 不允许您复制打开的文件,因此很有可能跳过某些文件,在这种情况下,您将遇到严重且非常难以恢复的损坏问题。我强烈建议从上次备份中恢复。恢复数据库可能需要大量时间和专业知识来手动重新创建目录。
  • @Leandro 如果架构是从可能有助于恢复的脚本创建的,假设脚本实际上反映了正在运行的数据库的当前架构。即使这样,您的目标仍是达到可以COPY 将各个表中的数据转换为 CSV 然后重新创建数据库的程度。
【解决方案2】:

看起来像是在使用不同的 PostgreSQL 版本。 PostgreSQL 数据目录中的数据非常敏感,如果没有更深入的知识,您无法将其复制到不同的计算机。请改用 pg_dump。如果您不知道自己擅长什么,请不要接触 PostgreSQL 数据目录。

【讨论】:

    【解决方案3】:

    您需要从备份中恢复,或者,如果缺少备份,则 检查损坏表的regclass

    然后您需要恢复 pg_attribute 中丢失的记录(例如创建 simm 表并复制

    以 q 为 ( 选择 attname, atttypid, attstattarget, attlen, attnum, attndims, attcacheoff, atttypmod, attbyval, attstorage,attalign, attnotnull, atthasdef, attisdropped, attislocal, attinhcount, attcollat​​ion, attacl, attoptions, attfdwoptions 从 pg_attribute attrelid::regclass= your_table::regclass) ) INSERT INTO pg_catalog.pg_attribute select [id from your pgclass missing instead new attrelid], * from q

    然后检查 atttypid 是否存在并对 pg_class 和 pg_attribute 执行真空操作。所以,你的问题必须解决。对不起我的英语

    【讨论】:

    • 您好,您能否向我们提供一些您已经尝试过的代码示例以及您遇到的问题。只有这样我们才能提供帮助
    • 查看同一用户的其他回答:dba.stackexchange.com/questions/53671/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多