起因
某天发布版本的时候需要修改表的某些字段,数据库用的是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八种表锁。