【问题标题】:Rails - recovering database from Production.logRails - 从 Production.log 恢复数据库
【发布时间】:2011-10-24 14:42:15
【问题描述】:

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

每个请求都记录如下:

Processing 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 中打开会话文件并获取它的内容吗?

【问题讨论】:

  • 你有没有在 github 上想出任何代码或者你有一个可行的解决方案?谢谢!
  • 你使用什么数据库?你有旧的备份吗?您丢失了多少数据?

标签: ruby-on-rails session


【解决方案1】:

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

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

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

展望未来:

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

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

希望这会有所帮助——祝你好运!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      几周前,一位客户遇到了同样的问题。我想出了以下解决方案:

      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 编码发送的。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 2013-02-24
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多