DROP INDEX CONCURRENTLY
首次出现在 PSQL 9.2 中,但我的服务器运行的是 9.1。不幸的是,该操作将我的应用程序锁定了不可预测的时间,这在生产环境中执行时是一个非常可悲的事实。
有没有办法同时删除一个索引?
最佳答案
不,没有简单的解决方法 - 否则 DROP INDEX CONCURRENTLY
不太可能添加到 9.2 中。
但是,您可以终止所有 session 以强制drop
立即发生。
您要避免的是 drop 在等待其他事务完成并释放其共享锁时等待部分获取的独占锁,该锁会阻止其他事务继续进行,但也不让它继续进行。确保发生这种情况的最佳方法是终止所有并发 session 。
因此,在一个 session 中:
DROP INDEX my_index;
在另一个 session 中,作为 super 用户,使用以下未测试查询终止所有其他 session ,您需要适本地调整并在使用前进行测试:
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();
您编写良好且经过良好测试的应用程序将立即重新连接并重试其查询,而不会打扰用户或感到不安,因为它知道 transient 错误是它必须应对的事情,因此它会在重试循环中运行所有数据库访问.如果它写得不好,那么您会发现大量用户可见的错误消息。如果它真的写得不好,你必须在它恢复正常之前重新启动它,但很少看到如此糟糕的应用程序。
这是一种严厉的方法。通过加入 pg_locks
并仅终止实际锁定您感兴趣的关系或您希望修改的索引的 session ,您可以更温和地处理它。您会喜欢编写该查询,因为我对解决旧数据库版本的限制的兴趣有限。
关于postgresql - 同时删除索引 PostgreSQL 9.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27196236/