Rails - 从Production.log恢复数据库

时间:2008-09-03 11:45:33

标签: ruby-on-rails session

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

每个请求都记录如下:

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

前进:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

几个星期前客户确实遇到了同样的问题。我提出了以下解决方案:

  1. 播放您拥有的最新备份(在我们的情况下,它是一年 旧)
  2. 编写一个小解析器,将临时数据库中的所有请求从生产中移出(我为此选择了mongodb):我使用了rake任务和“eval”来创建哈希值。
  3. 按以下顺序播放数据
    1. 在第一次创建对象时播放,如果它尚不存在。
    2. 找到最后一次更新(按日期)并播放。
  4. 这是扫描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编码发送的。

    祝你好运!