2 postgresql corruption restore
Ubuntu 12.04 上的 Postgres 9.3
我们的服务器上有一些磁盘损坏,在执行fsck 后,数据库无法启动。为了让我们重新投入生产,我复制了 postgres 数据文件夹,清除了数据库并从最新的 pg_dump 中恢复。但是我很想从损坏的数据文件夹中的特定表中检索一些数据。
当我尝试使用损坏的数据文件夹启动 postgres 时,由于缺少 xlog 文件而无法启动。所以我使用了 pg_resetxlog 并且它给了我另一个错误:*missing pg_clog/0000*。我怀疑文件在 fsck 修复过程中丢失了,所以我从我正在运行的服务器复制了该文件,并且必须对 *pg_stat_tmp* 文件夹和 *pg_multixact/offsets/0000* 文件执行相同的操作。
现在 postgres 将开始使用损坏的数据文件夹,但是当我 psql 进入它时,所有表似乎都是空的(行数为 0)。一些表似乎完全丢失并抛出一个错误: 无法打开文件“base/16416661/16416776”:没有这样的文件或目录
我所追求的表似乎仍然存在,但它给我的行数为 0,即使 /base 目录中的文件本身是 1Gb 大。
我也试过做一个数据库的 pg_dump,它给了我一个空文件,以及那个特定表的转储,pg_dump 说它找不到(它说这个表不存在,即使 psql 可以看到它)
有没有人了解 /base 文件的内部结构,有什么方法可以从数据库或单个表中恢复数据?
谢谢!
当面临损坏时,在您执行任何其他操作之前,请获取损坏数据库的完整文件系统级副本。请参阅:http : //wiki.postgresql.org/wiki/Corruption。不这样做会破坏导致损坏原因的证据,这意味着如果您的修复工作失败并使事情变得更糟,您将无法撤消它们。不要先尝试任何维修。
假设您真的复制了整个数据目录,您似乎做出了正确的选择。但是,您似乎随后弄乱了副本。在你做任何其他事情之前,把损坏的数据目录复制到安全的地方,不要再碰它。这是你康复的希望。永远不要在这个副本上工作 - 复制它,并在副本上测试恢复尝试。
顺便说一句,我强烈建议您停止使用此服务器:
我们的服务器上有一些磁盘损坏
是不正常。在您知道为什么会发生这种情况之前,您不应使用该服务器。退休或将其搁置一旁,并获得一些值得信赖的硬件。
如果你不能做到这一点,使绝对肯定你每天至少逻辑备份,这样做并与WAL归档到辅助服务器流复制。将故障服务器视为可能随时消失或再次占用您的数据。
如果磁盘损坏与电源故障对应,则可能是由于不安全的回写缓存或系统忽略了磁盘刷新请求。这就是为什么我在服务器部署上进行即插即用测试,并且不购买便宜的 SSD。
这就是我告诉您需要从您定期制作和测试的那些备份中恢复的地方,最好是时间点恢复或流式复制设置。
不过,如果这是一个选项,您就不会在这里发帖。
一旦你有一个安全的 datadir 副本,请在 pgsql-general 邮件列表上发帖寻求帮助。
如果数据很重要且难以恢复,请准备好为数据恢复/修复专业知识付费。请参阅http://www.postgresql.org/support/professional_support/。(我在其中一家上市公司工作,只是为了公平披露)。
腐败案例往往有些独特,需要大量的来回处理,因此它们通常不适合 Stack Overflow。
至于 base/ ... 中文件的内部结构,您确实需要系统目录来有用地解释它们。表结构记录在PostgreSQL internals 中。
单个关系范围的结构基本上是一个标题,后面是一堆根据系统目录解释的列。如果您丢失了系统目录,您就没有可靠的方法来判断每列的类型和名称等。
您遇到的另一个问题是您丢失pg_clog
了记录打开、提交和回滚事务的事务提交日志 ( )。丢失数据后,您将需要对表进行脏读以恢复任何数据,因为您不再知道哪些元组是由后来回滚的事务添加的,哪些是删除的,哪些是更新的元组的旧版本, 等等。
……会很辛苦。
从理论上讲,您可能能够从堆表范围中读取元组。我不知道有任何工具可以做到这一点。您需要能够构建与表的磁盘结构相匹配的新系统目录,可能使用独立的 PostgreSQL 后端 ( postgres --single
)。
如果 PostgreSQL 有更好的恢复选项,我希望它,但坦率地说,我们更喜欢有良好的备份和使用流复制等来避免首先需要。修复数据库损坏总是不确定的,并导致不可信的、损坏的数据。所以一般来说——不要那样做。
如果您在运行之前仍然拥有数据目录的副本,这可能会有所帮助pg_resetxlog
。
前段时间我写了一点关于预防腐败的文章。在我的旧博客上看到这篇文章。
归档时间: |
|
查看次数: |
10514 次 |
最近记录: |