今天试图对一个老数据库运行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命令成功运行。
Comments NOTHING