我们最近丢失了一个数据库,我想从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中打开会话文件并获取它的内容吗?
答案 0 :(得分:4)
最好将会话文件加载到哈希中 - 使用session-id作为密钥 - 然后按时间顺序浏览所有日志文件,并解析每个会话的相关信息,并修改你的数据库。
我猜你是从一个旧的数据库备份开始的?确保在单独的Rails环境中执行此操作 - 例如不要在生产中这样做;创建并使用单独的“恢复”环境/ DB。
考虑一下你之后可以在数据库上运行的一些健全性检查,以确保记录的状态有意义
前进:
确保您定期进行备份(例如,如果使用MySQL,则使用mysqldump)。
确保为主/从复制设置数据库
希望这会有所帮助 - 祝你好运!
答案 1 :(得分:2)
您是否尝试过使用Marshal#load?我不确定你是如何生成这些会话文件的,但Rails很可能只使用Marshal。
答案 2 :(得分: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编码发送的。
祝你好运!