5

我们最近丢失了一个数据库,我想从 de Production.log 中恢复数据。

每个请求都记录如下:

处理 ChamadosController#create (for XXX.XXX.XXX.40 at 2008-07-30 11:07:30) [POST] 会话 ID: 74c865cefa0fdd96b4e4422497b828f9 参数: {"commit"=>"Gravar", "action"=>" create", "funcionario"=>"6" ...(所有其他参数都在这里)。

但是在会议中发布了一些要在数据库上发布的内容。在请求中,我有会话 ID,并且我还有来自服务器的所有会话文件。

无论如何我可以从这个会话 ID 打开会话文件并获取它的内容吗?

4

3 回答 3

4

最好将会话文件加载到哈希中 - 使用会话 ID 作为键 - 然后按时间顺序浏览所有日志文件,解析每个会话的相关信息,并修改您的数据库它。

  • 我猜你是从旧的数据库备份开始的?确保在单独的 Rails 环境中执行此操作——例如,不要在生产环境中执行此操作;创建并使用单独的“恢复”环境/数据库。

  • 考虑之后可以在数据库上运行的一些健全性检查,以确保记录的状态是有意义的

往前走:

  • 确保您在以后进行定期备份(例如,如果您使用 MySQL,则使用 mysqldump)。

  • 确保为主/从复制设置您的数据库

希望这有帮助,祝你好运!

于 2011-10-19T02:51:16.473 回答
2

您是否尝试过使用Marshal#load?我不确定您是如何生成这些会话文件的,但 Rails 很可能只使用 Marshal。

于 2008-09-03T13:12:54.673 回答
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 编码发送的。

祝你好运!

于 2011-10-24T06:42:15.503 回答