PostgreSQL数据损坏报错ERROR: invalid memory alloc request size xxxxxxxxxxxxxxxx 处理方案

st 发布于 2023-05-07 1,569 次阅读


今天试图对一个老数据库运行pgdump时报错ERROR: invalid memory alloc request size xxxxxxxxxxxxxxxx,搜索下来似乎是数据损坏或硬盘坏块导致的。

部分数据损坏似乎是没法避免的了,这里我的目标就是尽量保留正常的数据,用pgdump完成备份,然后在新数据库中恢复。

首先尝试了在postgresql.conf中加入zero_damaged_pages = on,并运行VACUUM FULL,错误依旧一致。

根据错误信息中pg_dump: Dumping the contents of table "xxxxxxxxxxxxx" failed: PQgetResult() failed.找到有问题的table,通过select * from xxxxxxxxxxxxx limit 100;语句,改变limit来定位数据损坏的行。

找到有问题的行后,运行select ctid from xxxxxxxxxxxxx limit 100;在最后找到对应的ctid。然后用delete from xxxxxxxxxxxxx where ctid = '(100, 100)';删除报错的行。

删除对应的行之后pgdump命令成功运行。

Sup
最后更新于 2023-05-07