gpt4 book ai didi

postgresql - Postgres 表似乎部分丢失

转载 作者:行者123 更新时间:2023-11-29 13:53:56 24 4
gpt4 key购买 nike

今天我的 Postgres 数据库出现问题,我很难合理化可能发生的事情。我正在寻找有关如何发生明显的“部分丢弃”状态的技术细节。我的印象是删除表是原子的。

系统:我在 RHEL 6.5 上安装了 Postgres 9.4,我使用 Windows 7 中的 pgAdmin III GUI 访问它。我还有一台非数据库 RHEL 6.5 机器,我可以从中使用 psql。

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

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

解决方案:我在 psql 中的一个表上运行了“drop table”并得到了“错误:表“my_table_name”不存在”。得到错误大约需要 30 秒,对于这种大小的表,如果它实际上是在删除表,我希望“删除表”查询能够在几秒钟内返回。这让我觉得除了试图删除表之外,它还在做某种清理工作。从\dt 和 information_schema 来看,该表似乎已被删除。现在,当我在另一个要删除的表上获取表统计信息时,pgAdmin 不会挂起。

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

最佳答案

我的猜测是 pgAdmin 尝试的删除是在事务内部,当 pgAdmin 崩溃时,事务将在 Postgres 后端保持打开状态。操作系统可能需要很长时间才能注意到连接不再有效并关闭套接字,这是 Postgres 关闭该后端的提示。关闭一个打开的事务将回滚该事务。

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

DROP TABLE 命令耗时很长,因为打开的事务仍然对表持有独占锁。一旦事务终止,锁就会被释放,第二个 drop 就可以继续了。

关于postgresql - Postgres 表似乎部分丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35733663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com