如何解决Postgres 在现有表上添加列需要很长时间
我有一个包含 50 万个元素的表格。现在我想添加一个新列
(type boolean
,nullable = false) 没有默认值。
执行此操作的查询一直在运行。
我在 Windows 2012 服务器上使用 Postgresql 12.1,由 Visual C++ build 1914 编译,64 位
在 pgAdmin 中,我可以看到查询被 PID 0 阻止。但是当我执行此查询时,我看不到 pid = 0 的查询
SELECT *
FROM pg_stat_activity
有人可以帮我吗?为什么查询被阻止,我该如何解决这个问题以向我的表中添加一个新列。
更新尝试:
SELECT *
FROM pg_prepared_xacts
更新
它在回滚所有准备好的事务后工作。
ROLLBACK PREPARED 'gid goes here';
解决方法
您有过时的准备交易。我这么说就像“你得了麻疹”一样,因为它是数据库的疾病。
此类准备好的事务会一直持有锁并阻止自动清理进程,因此如果您不采取行动,它们将使您的数据库瘫痪。此外,此类事务是持久化的,因此即使重新启动数据库也不会消除它们。
删除它们
ROLLBACK PREPARED 'gid goes here'; /* use the transaction names shown in the view */
如果您使用准备好的事务,则需要一个分布式事务管理器。这是一个软件,它跟踪所有准备好的事务及其状态并保留这些信息,这样任何分布式事务都不会变得陈旧。即使发生崩溃,分布式事务管理器也会解决所有相关数据库中的不确定事务。
如果没有,请不要使用准备好的交易。你现在知道为什么了。在这种情况下,最好将 max_prepared_transactions
设置为 0。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。