postgresql - 如何在不阻塞 Postgresql 语句的情况下更改表添加列?
问题描述
如何更改表以添加列而不阻塞 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
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命令。
推荐阅读
- python - 将 html 转换为 xml Python chilkat
- r - 如果交换也存在于 R 中的数据框中,则删除行
- windows - 无法在 MySQL 8 中使用 DBeaver 7 创建新列、约束、索引
- java - 如何将 JSON 转换为 Java 对象?
- python - 将 RSA 解密从 PyCrypto 迁移到 PyCryptodome
- python - 似乎无法将我从另一个文件导入的图形打印到 pdf 中
- angular - 如何选择要导入的图像以使用 `cropper.js` 插件进行操作?
- asp.net - 来自 ASP.Net (VB.Net) 贝宝的 CURL
- javascript - 如何将分治策略应用于最大和子数组问题(JavaScript)
- python - 用于获取电子邮件地址并在谷歌中搜索的 Python 代码