DROP COLUMN是否在postgreSQL数据库上阻塞

时间:2014-09-22 17:07:41

标签: postgresql

我在postgreSQL数据库中有以下列

column | character varying(10) | not null default 'default'::character varying

我想放弃它,但是数据库是巨大的,如果它在很长一段时间内阻止更新,我将被公开鞭打,并可能被抽取和四分之一。我发现了一个来自braintree的博客,here,这表明这是一个安全的操作,但它有点模糊。

2 个答案:

答案 0 :(得分:3)

  

确实删除了列阻止PostgreSQL数据库

答案是否定的,因为它不会阻止数据库

但是,任何DDL语句都要求更改表上的独占锁。这意味着没有其他事务可以访问。因此表格被阻止了#34;而不是数据库。

然而,删除列的时间实际上非常短,因为列没有从表中删除,但只是标记为不再存在。

并且不要忘记commit DDL语句(如果您已关闭自动提交),否则表将被阻止,直到您提交更改为止。

答案 1 :(得分:3)

ALTER TABLE命令需要获取表上的ACCESS EXCLUSIVE锁,这将阻止尝试访问该表的所有内容,包括SELECT s,并且顾名思义,需要等待现有的操作完成,因此它可以是独占的。

因此,如果您的表格非常繁忙,它可能无法获得实际获取独占锁定的机会,并且只会阻止功能上的永久锁定。

这还取决于此列是否具有大量索引和依赖项。如果存在依赖关系(即外键或视图),则需要将CASCADE添加到DROP COLUMN,这将增加需要完成的工作,以及时间量它需要持有独家锁。

所以,它没有风险。但是,在尝试之后你应该相当快地知道它是否可能会长时间阻塞。如果您可以尝试并安全地花费一两分钟可能阻止该表,那么值得一试 - 尝试下降并查看。如果它在相对较短的时间内没有完成,则中止命令,您可能需要至少安排一些正在敲击桌面的应用程序的停机时间。 (您可以查看服务器活动和锁定活动,以试图猜测该表格的主要内容。)