0

私と同僚は、組み込み機器の壊れたファイルから回復するメカニズムを実装しようとしています。

これは、ファイル書き込み中にユーザーがバッテリーを外した場合など、特定の状況で発生する可能性があります。

Orz ですが、今は 1 つのアイデアしかありません。

  • 重複したバックアップ ファイルを作成し、危険なファイルの I/O が正常に終了しない場合は、それらをコピーして戻します。

バックアップファイルも壊れているかのように、これはちょっとばかげています。

これに関する提案や良い記事はありますか?

前もって感謝します。

4

2 に答える 2

1

データベース ロギングとデータベース ジャーナル ファイルについて調べます。

データベース (Oracle など) は、非常に堅牢なファイル書き込み機能を備えています。実際には Oracle を使用しないでください。彼らのデザインパターンを使用してください。デザインパターンはこんな感じ。これらのアイデアは、実際に製品を使用しなくても借りることができます。

  1. トランザクション (挿入) は、更新するブロックを取得します。通常、これはメモリ キャッシュにあります。そうでない場合は、ディスクからメモリ キャッシュに読み込まれます。

  2. 「前のイメージ」(またはロールバック セグメント) のコピーは、これから書き込もうとしているブロックから作成されます。

  3. キャッシュ コピーを変更し、ジャーナル エントリを書き込み、DB 書き込みをキューに入れます。

  4. 変更をコミットすると、キャッシュの変更が他のトランザクションから見えるようになります。

  5. ある時点で、DB ライターは DB ファイルの変更を確定します。

ジャーナルは、単純な循環キュー ファイルです。レコードは、構造がほとんどない単なる変更の履歴です。複数のデバイスで複製できます。

DB ファイルはより複雑な構造です。それらには「トランザクション番号」があります。これは、トランザクション全体の単純な連続カウントです。これはブロックにエンコードされ (2 つの異なる方法で)、制御ファイルに書き込まれます。

優れた DBA は、制御ファイルがデバイス間で複製されることを保証します。

Oracle は、起動時に制御ファイルをチェックして、正しいと思われるファイルを見つけます。その他は破損している可能性があります。Oracle は DB ファイルをチェックして、制御ファイルと一致するものを確認します。ジャーナルをチェックして、ファイルを正しいトランザクション番号にするためにトランザクションを適用する必要があるかどうかを確認します。

もちろん、すべてのジャーナル コピーを書き込んでいるときにクラッシュした場合、そのトランザクションは失われます。それについてできることはあまりありません。ただし、ジャーナル エントリが書き込まれた後にクラッシュした場合は、問題なく正常に回復する可能性があります。

メディアを紛失し、バックアップを復元した場合、復元されたバックアップ ファイルにジャーナル ファイルを適用して最新の状態にできる可能性があります。そうしないと、古いジャーナル ファイルを再生して最新の状態にする必要があります。

于 2009-05-11T10:20:11.717 に答える
0

OS などによって異なりますが、ほとんどの場合、できることは一時ファイル名にコピーし、最後の最後の手順としてファイルの名前を正しい名前に変更することです。

これは、潜在的な S****p の機会の (WOOPS) ウィンドウが、名前変更が行われる間隔に限定されることを意味します。

OS が優れたディレクトリ構造をサポートし、ファイルをインテリジェントにレイアウトする場合、新しいファイルを一時ディレクトリにコピーし、ディレクトリの名前を変更して、WOOPS が「保存するターゲットの名前を変更」と「一時の名前を変更」の間の間隔になるように、これをさらに調整できます。ターゲットに"。

OSがソフトリンクディレクトリをサポートしている場合、これはさらに良くなり、「ln -s target temp」を実行できます。ほとんどの OS では、ソフトリンクの置き換えは「アトミック」操作であり、面倒な途中状態がなくても機能するか機能しません。

これらのオプションはすべて、ファイル システム上に古いコピーと新しいコピーを完全に保持するのに十分なストレージがあるかどうかに依存します。

于 2009-05-11T10:23:38.903 に答える