将向现有列添加默认值或重命名列锁定 Postgres 表



我需要在 200 万行的 Postgres 表上执行两次迁移,并且需要确保每次运行时的停机时间最短,即少于 5 秒。

迁移包括:

1( 添加默认值 0,并将 null 更改为非空,以现有 bigint 列

2(重命名列

注意:我发现很多帖子说将具有默认值的新列添加到大表会导致锁定,而不是向现有列添加默认值。

这些会锁定桌子吗?

文档详细

描述了ALTER TABLE的哪个变体将采用哪个锁。

SET DEFAULTSET NOT NULLRENAME COLUMNACCESS EXCLUSIVE锁。

这很不方便,但通常只有在ALTER TABLE语句需要很长时间时才不好。SET DEFAULTRENAME COLUMN都很快,但SET NOT NULL必须扫描表以确定是否满足条件。

众所周知,默认值仅适用于后续的 INSERT 命令;它们不会导致表中已有的行更改。这意味着将默认值设置为现有列时,表上不会有锁

请参阅 https://www.postgresql.org/docs/9.1/static/sql-altertable.html 的设置/删除默认值部分

您还可以参考本文以了解大容量 PostgreSQL 的安全操作。

最新更新