我重新启动PostgreSQL后,所有表都是空的(零行)

时间:2015-04-26 01:07:01

标签: database macos postgresql

使用Mac OS X 10.10(Yosemite)和Homebrew(0.9.5),我安装了PostgreSQL 9.4.1。基本上所有当前版本的发布时间......

我已经成功导入了一个残酷的大型数据库(56M记录 - 导入15个小时),并编写了一个应用程序以便在本地使用它。我发现了一个应用程序pgAdmin3,它允许我使用GUI执行各种管理任务。一切都很好。

每次重新启动计算机时,一旦由于来自USB火线音频接口的内核恐慌,一旦发生电源故障,两次来自用户启动的重启 - 每次重启后,数据库都是空的。数据库用户/角色仍然存在,表和关系存在,但是,所有表都是空的。 0记录。没有。 pgAdmin3甚至表明该表具有分配的空间,用于数百万条记录,具有“未定义”计数。刷新计数,显示0条记录。浏览数据显示0条记录。我的Mac应用程序(使用libpq)成功连接到数据库,并从其任何/所有SELECT语句获得0结果。是否有必要提到每次重新导入数据库需要15个小时? (修辞问题)

赞赏任何建议。

Mac OS X 10.0.2(约塞米蒂) 自制语0.9.5 在x86_64-apple-darwin14.1.0上的PostgreSQL 9.4.1,由Apple LLVM 6.0版(clang-600.0.56)编译(基于LLVM 3.5svn),64位

2 个答案:

答案 0 :(得分:2)

您描述的行为与您的表格UNLOGGED一致。

未记录的表位于普通表和临时表之间。它就像一张普通的表:

  • 可以从多个会话中使用
  • 会话退出时不会清除
  • 它存储在主表空间中,而不是临时表空间

但它就像一个临时表:

  • 它不是安全的。当PostgreSQL关闭并重新启动时,UNLOGGED表的内容将被保留,但前提是它干净地关闭。在不干净的关闭时,UNLOGGED表可能会被截断,因此它们仍然存在但包含零行。

  • 写入它不会在pg_xlog

  • 中生成预写日志记录
  • 无法通过流式传输或基于日志的复制将其复制到其他节点

  • 写入未记录的表会导致大约一半的磁盘I / O作为常规表

请参阅the manual

猜测一下,你的表被定义为UNLOGGED,当你的Mac关闭时你并没有干净地关闭PostgreSQL。因此,它会截断未记录的表,因为它无法确定它们是否处于一致状态。

干净地关闭PostgreSQL(例如pg_ctl -m fast -w stop,或启动配置,让sue这样做)。或者不要使用未记录的表。或者在重新启动时愿意重新加载数据。

由于您想知道未记录的表的用途:

  • 它们非常适合数据加载和转换,您希望加载一堆数据,然后提取并转换它以加载到其他表中。

  • 报告表

  • 可以重新启动整个系统的任何工作队列和任务队列,因此您无需制作正在进行的任务列表等崩溃安全

答案 1 :(得分:0)

Craig Ringer关于UNLOGGED表的建议很棒,另外要检查的是你已经提交了加载数据的任何操作。