postrgeSQL 数据库上的 DROP COLUMN 是否会阻塞

Ben*_*ser 2 postgresql

我在 postgreSQL 数据库中有以下列

column | character varying(10) | not null default 'default'::character varying
Run Code Online (Sandbox Code Playgroud)

我想放弃它,但数据库很大,如果它长时间阻止更新,我将被公开鞭打,并可能被分尸。我在这里找到了 Braintree 的博客,该博客表明这是一个安全的操作,但有点含糊。

kha*_*son 6

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

因此,如果您的表非常繁忙,它可能没有机会实际获取排他锁,而只会永远阻塞。

还取决于该列是否有很多索引和依赖项。如果存在依赖项(即外键或视图),则需要添加CASCADEDROP COLUMN,这将增加需要完成的工作以及需要保持排他锁的时间。

所以,这并非没有风险。不过,尝试后你应该很快就能知道它是否会阻塞很长时间。如果您可以尝试并安全地花一两分钟可能会阻塞该表,那么值得一试 - 尝试删除并查看。如果它没有在相对较短的时间内完成,请中止该命令,您可能需要至少为正在破坏桌子的应用程序安排一些停机时间。(您可以查看服务器活动和锁定活动,尝试推测是什么在影响该表。)