Postgresql 索引的Postgres pg_转储缓存查找失败
我正在尝试使用以下命令创建postgres数据库的备份(忽略详细信息): 一段时间后,我收到一个错误(格式化)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
然后我验证了
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