0

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

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

对此有任何见解吗?

4

1 回答 1

1

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

--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 并在之后进行备份

希望这可以帮助。

于 2018-09-06T18:59:40.213 回答