0

我和我的同事正在尝试实施一种机制来从嵌入式设备上的损坏文件中恢复。

这可能发生在某些情况下,例如用户在文件写入期间取下电池。

Orz,但现在我们只有一个想法:

  • 创建重复的备份文件,如果危险文件 i/o 未正确完成,则将它们复制回来。

这有点愚蠢,好像备份文件也坏了,我们死定了。

您对此有什么建议或好文章吗?

提前致谢。

4

2 回答 2

1

阅读数据库日志和数据库日志文件。

数据库(如 Oracle)具有非常、非常强大的文件写入功能。不要实际使用 Oracle。使用他们的设计模式。设计模式是这样的。您可以在不实际使用实际产品的情况下借用这些想法。

  1. 您的交易(即插入)将获取要更新的块。通常这是在内存缓存中,如果没有,则从磁盘读取到内存缓存。

  2. “前映像”(或回滚段)副本由您将要写入的块组成。

  3. 您更改缓存副本、写入日志条目并排队进行数据库写入。

  4. 您提交更改,这会使缓存更改对其他事务可见。

  5. 在某个时候,数据库编写器将完成数据库文件更改。

日志是一个简单的循环队列文件——记录只是变化的历史,几乎没有结构。它可以在多个设备上复制。

DB 文件是更复杂的结构。他们有一个“交易编号”——对整体交易的简单顺序计数。这在块中编码(两种不同的方式)以及写入控制文件。

一个好的 DBA 可以确保控制文件可以跨设备复制。

当 Oracle 启动时,它会检查控制文件以找出哪个可能是正确的。其他可能已损坏。Oracle 检查数据库文件以查看哪些与控制文件匹配。它检查日志以查看是否需要应用事务以使文件达到正确的事务编号。

当然,如果它在写入所有日志副本时崩溃,该事务将会丢失——对此无能为力。但是,如果它在写入日志条目后崩溃,它可能会完全恢复而没有问题。

如果您丢失了媒体并恢复了备份,则日志文件有可能应用于恢复的备份文件并使其保持最新状态。否则,必须重播旧的日志文件以使其保持最新状态。

于 2009-05-11T10:20:11.717 回答
0

取决于哪个操作系统等,但在大多数情况下,您可以做的是复制到一个临时文件名,并作为最后一步将文件重命名为正确的名称。

这意味着潜在 S****p 的 (WOOPS) 机会窗口仅限于重命名发生的时间间隔。

如果操作系统支持良好的目录结构并且您可以智能地布置文件,您可以通过将新文件复制到临时目录并重命名目录来进一步细化这一点,因此 WOOPS 成为“重命名目标以保存”和“重命名临时”之间的间隔达到目标”。

如果操作系统支持软链接目录,这会变得更好,然后您可以“ln -s target temp”。在大多数操作系统上,替换软链接将是一个“原子”操作,它可以在没有任何混乱的中途状态的情况下工作或不工作。

所有这些选项都取决于是否有足够的存储空间来在文件系统上保留完整的新旧副本。

于 2009-05-11T10:23:38.903 回答