同时删除索引PostgreSQL 9.1

时间:2014-11-28 21:38:03

标签: postgresql

DROP INDEX CONCURRENTLY首次出现在PSQL 9.2中,但我的服务器运行9.1。不幸的是,这个操作会锁定我的应用程序一段不可预测的时间,这在制作时非常可悲。

有没有办法同时删除索引?

1 个答案:

答案 0 :(得分:0)

不,没有简单的解决方法 - 否则在{9.2}中添加DROP INDEX CONCURRENTLY的可能性相对较小。

但是,你可以杀死所有会话以强制drop迅速发生。

您要避免的是等待部分获取的独占锁定的丢弃,该锁定会阻止其他事务继续进行,但在等待其他事务完成并释放其共享锁定时,也不会让它继续进行。确保发生这种情况的最佳方法是终止所有并发会话。

所以,在一次会议中:

DROP INDEX my_index;

在另一个会话中,作为超级用户,使用以下未经测试的查询终止所有其他会话,您需要在使用前进行适当调整并进行测试:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE procpid <> (
    SELECT pid 
    FROM pg_stat_activity 
    WHERE query = 'DROP INDEX my_index;')
  AND
    procpid <> pg_backend_pid();

您编写良好且经过良好测试的应用程序将立即重新连接并重试其查询而不会打扰用户或感到不安,因为它知道瞬态错误是必须应对的,因此它在重试循环中运行其所有数据库访问。如果编写得不好,那么您将发现大量错误的用户可见消息。如果它真的写得不好,那么你必须重新开始它才能重新开始,但很难看到相当破坏的应用程序。

这是一种严厉的做法。通过加入pg_locks并且只终止实际锁定您感兴趣的关系或您希望修改的索引的会话,您可以对此更加软化。您喜欢编写该查询,因为我对解决旧数据库版本限制的兴趣有限。