Postgres表似乎被部分删除

时间:2016-03-01 21:15:23

标签: postgresql ddl pgadmin

今天我的Postgres数据库出了问题,我很难理解可能发生的事情。我正在寻找关于如何发生明显的“部分掉线”状态的技术细节。我的印象是丢桌子是原子的。

系统:我在RHEL 6.5上安装了Postgres 9.4,我使用Windows 7中的pgAdmin III GUI访问。我还有一台非db RHEL 6.5机器,我可以使用psql。< / p>

设置:我尝试使用GUI一次删除一些小表(每个约1k行)(通过多选表,右键单击,删除)和pgAdmin崩溃。除了两个表之外的所有表都已成功删除。

问题:当我尝试获取未删除的两个表中的任何一个表的表信息时,pgAdmin挂起并且无法恢复。当我从pgAdmin运行'drop table'或'select'查询时,我得到一个错误,表明该表不存在(对于任一个表)。当我从psql运行\ dt时会出现这些表,我可以在information_schema.columns表中看到有关表的详细信息。 pg_stat_activity表中没有数据库活动。

解决方案:我在psql的其中一个表上运行'drop table'并得到“ERROR:table”my_table_name“不存在”。获取错误花了大约30秒,对于这个大小的表,如果实际丢弃表,我希望“drop table”查询在几秒钟内返回。这让我觉得除了试图放弃桌子之外它还在进行某种清理。从\ dt和information_schema,该表似乎已被删除。现在,当我在另一个表上删除了要删除的表统计数据时,pgAdmin不会挂起。

似乎这些表被“部分删除”,这似乎是符合ACID标准的数据库无法做到的。我预计它与开放交易有关,但似乎并非如此。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我的猜测是pgAdmin尝试的丢弃是在一个事务中,当pgAdmin崩溃时,这会使事务在Postgres后端打开。操作系统可能需要一段时间才能注意到连接不再有效并关闭套接字,这是Postgres关闭该后端的提示。关闭打开的事务将使该事务回滚。

你没有在\ dt中看到这种效果的原因是对目录的查询仍然将表视为存在,因为事务尚未提交。

DROP TABLE命令永远占用,因为打开的事务仍然保持对表的独占锁定。一旦事务终止,锁定被释放,第二次丢弃就可以继续。