我需要在 200 万行的 Postgres 表上执行两次迁移,并且需要确保每次运行时的停机时间最短,即少于 5 秒。
迁移包括:
1( 添加默认值 0,并将 null 更改为非空,以现有 bigint 列
2(重命名列
注意:我发现很多帖子说将具有默认值的新列添加到大表会导致锁定,而不是向现有列添加默认值。
这些会锁定桌子吗?
描述了ALTER TABLE
的哪个变体将采用哪个锁。
SET DEFAULT
、SET NOT NULL
和RENAME COLUMN
都ACCESS EXCLUSIVE
锁。
这很不方便,但通常只有在ALTER TABLE
语句需要很长时间时才不好。SET DEFAULT
和RENAME COLUMN
都很快,但SET NOT NULL
必须扫描表以确定是否满足条件。
众所周知,默认值仅适用于后续的 INSERT 命令;它们不会导致表中已有的行更改。这意味着将默认值设置为现有列时,表上不会有锁
请参阅 https://www.postgresql.org/docs/9.1/static/sql-altertable.html 的设置/删除默认值部分
您还可以参考本文以了解大容量 PostgreSQL 的安全操作。