Postgresql 索引的Postgres pg_转储缓存查找失败

Postgresql 索引的Postgres pg_转储缓存查找失败,postgresql,runtime-error,Postgresql,Runtime Error,我正在尝试使用以下命令创建postgres数据库的备份(忽略详细信息): 一段时间后,我收到一个错误(格式化) 然后我验证了pg_index中的索引ID不存在。是否有办法修复此问题,或者忽略此错误并继续,以便我可以继续导出非PGU目录数据?您的数据库已损坏,您应该从备份中恢复 如果您不怕弄乱目录(首先进行物理备份!): 将配置参数allow_system_table_mods设置为on以便修改系统目录。然后 DELETE FROM pg_catalog.pg_index WHERE indexr

我正在尝试使用以下命令创建postgres数据库的备份(忽略详细信息):

一段时间后,我收到一个错误(格式化)


然后我验证了
pg_index
中的索引ID不存在。是否有办法修复此问题,或者忽略此错误并继续,以便我可以继续导出非PGU目录数据?

您的数据库已损坏,您应该从备份中恢复

如果您不怕弄乱目录(首先进行物理备份!):

将配置参数
allow_system_table_mods
设置为
on
以便修改系统目录。然后

DELETE FROM pg_catalog.pg_index WHERE indexrelid = 1184605879;
也许这会使您的数据库处于可以转储它的状态(减去该索引)


如果出现更多问题,您可能会使用
COPY
逐个提取表数据,然后查看可以修复的其他内容。

系统索引可能会损坏。我会尝试以下方法:

  • 停止数据库服务器
  • 以单用户模式启动数据库,忽略系统和用户定义的索引:

    postgres--single-D/path/to/data--ignore_-system_-indexcan=on--enable_-indexscan=off--enable_-bitmapscan=off

  • 重新索引整个数据库(包括目录):
    Reindex数据库
    ;

  • 重新启动数据库并再次尝试转储

  • 更多:

    我编写了一个快速脚本,将每个表分别转储到一个sql文件中,发现是一些临时登录信息导致缓存失败。我只是将该表从导出中排除,结果很好

    我不是最好的bash程序员,因此它肯定可以改进,但下面是我用来单独转储每个表以查找导致错误的表的脚本

    #!/bin/bash
    host=$1
    port=$2
    user=$3
    db=$4
    
    # Get all table names that you will be dumping individually
    query="SELECT tablename FROM pg_tables WHERE tableowner=$user;"
    tables=( $(psql -h $host -p $port -U $user $d -c $query) )
    mkdir db_dump
    
    dump_command="pg_dump -h $host -p $port -U $user"
    for table in $(tables[@]); do
        eval "$dump_command -t $table $db > db_dump/$table.sql"
    done
    

    我尝试了这个,但仍然得到一个不同索引值的错误。有其他系统使用此数据库,因此我将在确保没有其他系统自动重新连接到该数据库后与您联系。今天早上,我又对转储进行了几次重新测试(没有更改任何内容),每次测试结果都有不同的索引号。我认为可能存在一个不同的根本问题。我将尝试一个接一个地提取每个表,以查看哪个表导致了问题。听起来整个
    pgu索引
    syste目录已损坏。或者可能只有索引
    pg\u index\u indrelid\u index
    被破坏,重新索引
    pg\u index
    可以解决问题。
    DELETE FROM pg_catalog.pg_index WHERE indexrelid = 1184605879;
    
    #!/bin/bash
    host=$1
    port=$2
    user=$3
    db=$4
    
    # Get all table names that you will be dumping individually
    query="SELECT tablename FROM pg_tables WHERE tableowner=$user;"
    tables=( $(psql -h $host -p $port -U $user $d -c $query) )
    mkdir db_dump
    
    dump_command="pg_dump -h $host -p $port -U $user"
    for table in $(tables[@]); do
        eval "$dump_command -t $table $db > db_dump/$table.sql"
    done