我和我的同事正在尝试实施一种机制,以便从嵌入式设备上的损坏文件中恢复。
这可能在某些情况下发生,例如用户在文件写入过程中取下电池。
Orz,但现在我们只有一个想法:
这有点愚蠢,好像备份文件也坏了,我们刚刚死了。
你对此有什么建议或好文章吗?
提前致谢。
答案 0 :(得分:1)
阅读数据库日志和数据库日志文件。
数据库(如Oracle)具有非常强大的文件写入功能。实际上不要使用Oracle。使用他们的设计模式。设计模式就是这样的。您可以在不实际使用实际产品的情况下借用这些想法。
您的交易(即插入)将获取要更新的块。通常这是在内存缓存中,如果没有,则从磁盘读取到内存缓存。
“前映像”(或回滚段)复制是您要编写的块。
您可以更改缓存副本,编写日记帐分录以及排队DB写入。
您提交更改,这会使缓存更改对其他事务可见。
在某些时候,DB编写器将完成DB文件更改。
日志是一个简单的循环队列文件 - 记录只是一个变化的历史,它们的结构很少。它可以在多个设备上复制。
DB文件是更复杂的结构。他们有一个“交易号” - 一个简单的整体交易顺序计数。这是在块中编码(两种不同的方式)以及写入控制文件。
一个好的DBA可以确保控制文件在设备之间进行复制。
当Oracle启动时,它会检查控制文件以找出哪一个可能是正确的。其他人可能已损坏。 Oracle检查数据库文件以查看哪个与控制文件匹配。它检查日志以查看是否需要应用事务以使文件达到正确的交易号。
当然,如果在编写所有日志副本时崩溃,那么该事务将会丢失 - 关于这一点并没有多大帮助。但是,如果在写入日记帐分录后崩溃,它可能会毫无问题地完全恢复。
如果丢失媒体并恢复备份,则可能会将日志文件应用于恢复的备份文件并使其保持最新状态。否则,必须重播旧的日志文件以使其更新。
答案 1 :(得分:0)
取决于操作系统等等,但在大多数情况下,您可以执行的操作是复制到临时文件名,最后一步是将文件重命名为正确的名称。
这意味着(WOOPS)潜在机会的窗口S **** p被限制在重命名发生的间隔。
如果操作系统支持一个漂亮的目录结构并且您智能地布局文件,您可以通过将新文件复制到临时目录并重命名目录来进一步优化这一点,以便WOOPS成为“重命名目标以保存”和“将temp重命名为目标”。
如果操作系统支持软链接目录,那么你可以“ln -s target temp”。在大多数操作系统中,替换软链接将是一个“原子”操作,在没有任何混乱的中途状态的情况下工作或不工作。
所有这些选项都取决于是否有足够的存储空间来在文件系统上保留完整的新旧副本。