5

最近データベースを失いました。deProduction.logからデータを回復したいと思います。

すべてのリクエストは次のようにログに記録されます。

ChamadosController#createの処理(2008-07-30 11:07:30のXXX.XXX.XXX.40の場合)[POST]セッションID:74c865cefa0fdd96b4e4422497b828f9パラメーター:{"commit" => "Gravar"、 "action" => " create "、" funcionario "=>" 6 "...(他のすべてのパラメータはここにあります)。

しかし、データベースに投稿するものがいくつかセッションにありました。リクエストにはセッションIDがあり、サーバーからのすべてのセッションファイルもあります。

とにかく、このセッションIDから、セッションファイルを開いてその内容を取得することはできますか?

4

3 に答える 3

4

セッション ファイルをハッシュにロードし (セッション ID をキーとして使用)、すべてのログ ファイルを時系列で調べ、各セッションの関連情報を解析し、データベースを次のように変更するのがおそらく最善の方法です。それ。

  • 古いデータベースのバックアップから始めていると思いますか? これは必ず別の Rails 環境で行ってください。たとえば、本番環境では行わないでください。別の「リカバリ」環境/DB を作成して使用します。

  • レコードの状態が意味のあるものであることを確認するために、後でデータベースに対して実行できるサニティ チェックについて考えてください。

今後:

  • 今後は定期的にバックアップを行ってください (たとえば、MySQL を使用している場合は mysqldump を使用します)。

  • マスター/スレーブ複製用にデータベースを設定してください

これがお役に立てば幸いです -- 頑張ってください!

于 2011-10-19T02:51:16.473 に答える
2

Marshal#loadを試してみましたか? これらのセッション ファイルをどのように生成しているかはわかりませんが、Rails が単に Marshal を使用している可能性は十分にあります。

于 2008-09-03T13:12:54.673 に答える
2

クライアントは、数週間前にまったく同じ問題を抱えていました。私は次の解決策を思いつきました:

  1. 持っている最新のバックアップを再生します (この場合は 1 年前のものです)。
  2. すべてのリクエストをプロダクションから一時データベースに移動する小さなパーサーを作成します(そのためにmongodbを選択しました):rakeタスクと「eval」を使用してハッシュを作成しました。
  3. 次の順序でデータを再生します
    1. オブジェクトがまだ存在しない場合は、オブジェクトの最初の作成で再生します。
    2. 最後の更新を (日付で) 見つけて再生します。

production.log をスキャンするための正規表現は次のとおりです。

file = File.open("location_of_your_production.log", "rb")
contents = file.read
contents.scan(/(Started POST \"(.*?)\" for (.*?) at (.*?)\n.*?Parameters: \{(.*?)\}\n.*?Completed (.*?) in (.*?)ms)/m).each do |x|
  # now you can collect all the important data.
  # do the same for GET requests as well, if you need it.
end

私の場合、一時データベースによってログファイルの解析プロセスが高速化されたため、上記の手順を実行できました。もちろん、production.log 経由で送信されなかったものはすべて失われます。また、オブジェクトの更新により情報全体が送信されますが、場合によっては異なる場合があります。画像は production.log でエンコードされた base64 で送信されたので、画像のアップロードを再作成することもできました。

幸運を!

于 2011-10-24T06:42:15.503 に答える