我需要在一个200万行的Postgres表上执行两个迁移操作,并需要确保每次运行的停机时间最小,即少于5秒。
这些迁移是:
1)向现有的bigint列添加默认值0,并从null更改为非空
2)重命名一个列
注意:我发现很多帖子都说在大表上添加一个具有默认值的新列会导致锁定,但没有关于向现有列添加默认值的说明。
这些操作会锁定表吗?
这些迁移是:
1)向现有的bigint列添加默认值0,并从null更改为非空
2)重命名一个列
注意:我发现很多帖子都说在大表上添加一个具有默认值的新列会导致锁定,但没有关于向现有列添加默认值的说明。
这些操作会锁定表吗?
文档详细描述了哪种ALTER TABLE
变体会使用哪种锁。
SET DEFAULT
、SET NOT NULL
和RENAME COLUMN
都需要使用ACCESS EXCLUSIVE
锁。
这很不方便,但通常只有在ALTER TABLE
语句执行时间较长时才会出现问题。 SET DEFAULT
和RENAME COLUMN
都很快,但SET NOT NULL
将必须扫描表以确定条件是否满足。
ALTER TABLE
将不得不排队等待并发锁请求,并阻塞在它之后的所有语句,直到它获得锁并完成为止。如果您只有短事务,那应该不是什么大问题,但对于长事务来说就不同了。 - Laurenz Albe