pg修改数据库表结构不成功如何解决?

在尝试修改PostgreSQL数据库表结构时遇到问题,alter table命令长时间未完成且不报错。分析得知,这是因为pg在修改表时获取了排他锁,如果有其他查询操作未完成,会导致表锁定。通过检查数据库连接状态,发现一个查询运行一个月仍未结束,通过PID杀死该连接后,成功执行了alter table命令。
摘要由CSDN通过智能技术生成

起因

​ 某天发布版本的时候需要修改表的某些字段,数据库用的是postgresql,执行alter table命令长时间没有返回执行成功,好像卡住了一样,也不报错,良久,还不成功,于是结束执行这个命令。

问题分析

​ 在网上查找了一些资料,大概意思就是说当要修改表结构时,pg会申请一个排他锁“ACCESS EXCLUSIVE”,把整个表锁起来,而此时如果这张表还有一些其他的操作正在进行,比如查询等,则pg会等待这些操作完成之后,才能进行修改表结构的操作,而一旦其他操作一直没有完成的话,我们这个修改表结构的操作也就完成不了,于是就出现了上面的现象。

解决办法

​ 查看数据库的每一个连接的状态,执行的是什么sql,执行的时间等。

SELECT * FROM pg_stat_activity WHERE datname='数据库名字';

​ 执行上面的sql,发现有一个查询执行了一个月都还没结束,按道理来说再慢的查询应该也返回结果了吧,顿时心中千万只cnm飘过。。。

​ 话不多说,找到那个连接的pid字段,直接用下面的sql把这个连接杀死。

select pg_terminate_backend(pid);

​ 杀死之后再重新执行alter table,几秒钟之后,黑窗口返回执行成功,大喜。

补充

​ postgresql八种表锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值