如何做alter表添加列不阻塞语句在Postgresql?



如何在不阻塞语句的情况下修改表以添加列?

下面的语句在执行时永远卡住了。

ALTER TABLE test_table ADD COLUMN test_column integer;

我尝试杀死所有长时间运行的查询,但它没有帮助。此表由后端积极使用。后端通常在表上执行10毫秒的查询。

运行以下脚本:

while true
do
date
export PGPASSWORD='YOUR_DB_PASSWORD';
psql -h DB_HOST_NAME -U USER_NAME DB_NAME -qX -v ON_ERROR_STOP=1 -f alter.sql && break
done

改变。SQL是这样的

begin;
-- Try to acquire a lock on the table without blocking.
lock table only test in ACCESS EXCLUSIVE MODE NOWAIT;
-- Change timeout to higher unlimited so that migration can be complete.
set statement_timeout = 0;
ALTER TABLE test ADD COLUMN column_to_add INTEGER;     
commit;

基本上,这段代码不断尝试获取锁而不阻塞任何查询,一旦获得锁就运行alter命令。

灵感:https://www.depesz.com/2019/09/26/how-to-run-short-alter-table-without-long-locking-concurrent-queries/

最新更新