我需要在200万行Postgres表上执行两次迁移,并且需要确保每次运行时停机时间最短,即少于5秒。
迁移是:
1)添加默认值0并从null更改为非null到现有 bigint列
2)重命名一列
注意:我发现很多帖子都说明在大表中添加一个带有默认值的新列会导致锁定,但不会向现有列添加默认值。
这些会锁定桌子吗?
答案 0 :(得分:2)
The documentation详尽地描述了ALTER TABLE
的哪个版本会采用哪种锁定。
SET DEFAULT
,SET NOT NULL
和RENAME COLUMN
都会锁定ACCESS EXCLUSIVE
。
这很不方便,但如果ALTER TABLE
语句需要很长时间,通常只会很糟糕。 SET DEFAULT
和RENAME COLUMN
都很快,但SET NOT NULL
必须扫描表格以确定是否符合条件。
答案 1 :(得分:1)
我们知道默认值仅适用于后续的INSERT命令;它们不会导致表中已有的行发生变化。这意味着在将默认值设置为现有列
时,表上将没有锁定参考https://www.postgresql.org/docs/9.1/static/sql-altertable.html的 SET / DROP DEFAULT 部分
您还可以参考this文章了解高容量PostgreSql的安全操作。