如何在不阻塞语句的情况下修改表以添加列?
下面的语句在执行时永远卡住了。
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/