2008-09-03 56 views
4

我們最近丟失了一個數據庫,我想從Production.log中恢復數據。Rails - 從Production.log中恢復數據庫

每個請求被記錄這樣的:

處理ChamadosController#創建(對於XXX.XXX.XXX.40在2008-07-30十一時07分30秒)[POST] 會話ID:74c865cefa0fdd96b4e4422497b828f9 參數:{「commit」=>「Gravar」,「action」=>「create」,「funcionario」=>「6」...(所有其他參數都在這裏)。

但是在數據庫中發佈的一些內容在會話中。在請求中我有會話ID,並且我也有來自服務器的所有會話文件。

無論如何,我可以從這個會話ID中打開會話文件並獲取它的內容嗎?

+1

你在github上想出任何代碼,或者你有工作解決方案嗎?謝謝! – z3cko 2011-10-12 22:06:27

回答

2

您是否嘗試過使用Marshal#load?我不確定你是如何生成這些會話文件的,但很可能Rails只是使用Marshal。

3

可能最好將會話文件加載到散列中 - 使用session-id作爲鍵 - 然後按時間順序遍歷所有日誌文件,並解析出每個會話的相關信息,然後用它修改你的數據庫。

  • 我想你是從一箇舊的數據庫備份開始的?確保在單獨的Rails環境中執行此操作 - 例如不要在生產中這樣做;創建並使用單獨的「恢復」環境/數據庫。

  • 思考一些理智的檢查,你可以對數據庫之後運行,以確保記錄的狀態有道理

展望未來:

  • 確保您定期執行備份(例如,如果使用MySQL,則使用mysqldump)。

  • 請務必設置您的數據庫主/從複製

希望這有助於 - 祝你好運!

2

一位客戶幾周前剛好遇到同樣的問題。我想出了以下解決方案:

  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編碼的。

祝你好運!