postgresql - 同时删除索引 PostgreSQL 9.1

标签 postgresql

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/

相关文章:

postgresql - 为什么我有一个 PostgreSQL 服务器执行 Hash Join 而另一个服务器执行 Nested Loop Semi Join?

c - 使用libpq库从PostgreSQL的查询结果中获取(integer[])数组值

postgresql - 将 CSV 文件数据导入 PostgreSQL 表自动化

postgresql - Postgres 全文搜索按位置排序

postgresql - 意外删除了 postgres 默认 super 用户权限 - 我可以使用 pgAdmin 取回它吗?

postgresql - PostgreSQL 中的时间序列 - 列表更改

linux - "` 处或附近的 Postgresql 还原错误“

ruby-on-rails - Postgres 连接泄漏 - 事务空闲(中止)

postgresql - 如何回滚所有打开的 PostgreSQL 事务

ruby-on-rails - Multi-Tenancy rails 应用程序 : what are the pros and cons of different techniques?