首页 > 解决方案 > 如何在不阻塞 Postgresql 语句的情况下更改表添加列?

问题描述

如何更改表以添加列而不阻塞 Postgresql 中的语句?

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

ALTER TABLE test_table ADD COLUMN test_column integer;

我尝试杀死所有长时间运行的查询,但没有帮助。该表正被后端积极使用。后端主要在表上触发 <10 毫秒的查询。

标签: postgresql

解决方案


运行以下脚本:

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

alter.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/


推荐阅读