2008-09-03 12 views
4

最近、データベースが失われ、Production.logからデータを回復したいと考えています。Rails - Production.logからデータベースを回復する

すべての要求は、次のように記録されます。

処理ChamadosController#作成[POST] セッションID(用XXX.XXX.XXX.40 2008-07-30 11時07分30秒で):74c865cefa0fdd96b4e4422497b828f9 パラメータ:{"コミット" => "グラバー"、 "アクション" => "作成"、 "funcionario" => "6" ...(他のパラメータはすべてここにあります)

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

このセッションIDからセッションファイルを開き、コンテンツを取得できますか?

+1

githubのコードを思いついたのですか、あるいは解決策がありましたか?ありがとう! – z3cko

+0

どのデータベースを使用していますか?古いバックアップがありますか?どのくらいのデータを失ったのですか? – Tilo

答えて

2

Marshal#loadを試しましたか?私はあなたがそれらのセッションファイルをどのように生成しているのかは分かりませんが、Railsはマーシャリングだけを使用している可能性が非常に高いです。

3

session-idをキーとしてセッションファイルをハッシュにロードし、すべてのログファイルを時系列順に調べ、各セッションの関連情報を解析し、データベースを変更してください。

  • 私は古いデータベースのバックアップを開始していると思いますか?別のRails環境でこれを行うようにしてください。プロダクションでこれをしないでください。別の "回復"環境/ DBを作成して使用してください。

  • は、レコードの状態が今後感

を作ることを確認するために、あなたはその後、データベース上で実行することができ、いくつかの健全性チェックを考える:

  • ますことを確認してください定期的なバックアップを行います(MySQLを使用する場合はmysqldumpを使用します)。

  • は、マスタ/スレーブレプリケーション

のためにあなたのデータベースを設定してください。この期待に役立ちます - 幸運を!

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でエンコードされて送信されたので、画像アップロードを再作成することもできました。

幸運!

関連する問題