PostgreSQL autovacuum防止环绕卡在损坏的表上

时间:2018-09-06 17:11:35

标签: postgresql corruption autovacuum

我正在运行一个无法安全终止的进程: autovacuum:VACUUM public.mytable(以防止回绕)

该表已被清除(除了一些条目,由于硬件问题导致表损坏,这些条目无法删除),并且不能删除,因为真空阻止了该条目。我必须运行kill -9才能停止此过程并重新启动数据库,但是您不能禁用此自动清理(以防止[事务]环绕),因此自动清理会重新出现并立即被此损坏的表所卡住。

对此有何见识?

1 个答案:

答案 0 :(得分:0)

首先,关闭数据库服务器,并将数据目录的物理副本复制到安全的地方。 然后,您可以截断损坏表的数据文件。例如:

--Get datafile path
db=# SELECT pg_relation_filepath('corrupted_table');
 pg_relation_filepath 
----------------------
 base/1234/56789
(1 row)
  1. 输入数据库目录(例如:data / base / 1234)
  2. 将文件重命名为56789_bkp
  3. 创建一个名为56789的空文件:touch 56789
  4. 启动数据库服务器
  5. 发布截断表以强制PostgreSQL覆盖数据文件:TRUNCATE TABLE corrupted_table;
  6. 您可能需要VACUUM,然后进行备份

希望这会有所帮助。