微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Postgres 在现有表上添加列需要很长时间

如何解决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 举报,一经查实,本站将立刻删除。