Rails - восстановление базы данных из Production.log - PullRequest
5 голосов
/ 03 сентября 2008

Мы недавно потеряли базу данных, и я хочу восстановить данные из de Production.log.

Каждый запрос регистрируется так:

Обработка ChamadosController # create (для XXX.XXX.XXX.40 в 2008-07-30 11:07:30) [POST] ID сеанса: 74c865cefa0fdd96b4e4422497b828f9 Параметры: {"commit" => "Gravar", "action" => "create", "funcionario" => "6" ... (все остальные параметры указаны здесь).

Но некоторые вещи для публикации в базе данных были в сессии. В запросе у меня есть идентификатор сеанса, а также все файлы сеансов с сервера.

Можно ли как-нибудь из этого идентификатора сеанса открыть файл сеанса и получить его содержимое?

Ответы [ 3 ]

4 голосов
/ 19 октября 2011

Вероятно, лучше всего загрузить файл сеанса в хеш, используя идентификатор сеанса в качестве ключа, а затем просмотреть все файлы журнала в хронологическом порядке, проанализировать соответствующую информацию для каждого сеанса и изменить ваша база данных с ним.

  • Я полагаю, вы начинаете со старой резервной копии базы данных? Обязательно сделайте это в отдельной среде Rails - например, не делай этого в производстве; создать и использовать отдельную среду «восстановления» / БД.

  • подумайте о некоторых проверках работоспособности, которые вы можете запустить в базе данных впоследствии, чтобы убедиться, что состояние записей имеет смысл

Вперед:

  • убедитесь, что вы выполняете регулярное резервное копирование в будущем (например, с помощью mysqldump, если вы используете MySQL).

  • не забудьте настроить базу данных для репликации master / slave

надеюсь, это поможет - удачи!

2 голосов
/ 24 октября 2011

У клиента точно такая же проблема была несколько недель назад. Я придумал следующее решение:

  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, будет потеряно. Кроме того, обновления объектов будут отправлять всю информацию, она может отличаться в вашем случае. Я также мог бы воссоздать загрузку изображений, так как изображения были отправлены в кодировке base64 в файле production.log.

удачи!

2 голосов
/ 03 сентября 2008

Вы пробовали использовать Marshal # load ? Я не уверен, как вы генерируете эти файлы сессий, но вполне возможно, что Rails просто использует Marshal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...