В том виде, в котором вы привыкли
Приветствую. Эпоха ведения бекапов и создания периодических резервных копий всего проекта как таковая больше не нужна. Вы всегда можете получить проект в состоянии на любую единицу времени, не обязательно в пределах последнего месяца, как это делают хостинги, а за всё время существования проекта. Даже на шаред хостингах без какого-либо специального ПО.
Однажды в одном проекте прошли малозаметные но важные данные. По истечению месяца, когда проблема всплыла - бекапов уже не было. Ситуация была плачевная.
Способ вести бекапы самостоятельно вручную может быть хорошим решением, если вам вдруг понадобятся данные длительностью больше месяца назад и в случае если проект не гиперогромен, когда вести множество копий было бы накладно по деньгам.
Получение бекапов каждый день на начало дня существенно снижает риски, но сбой может произойти ближе к концу дня и терять весь день не всегда хотелось бы, плюс изменения бывают необратимыми, когда важен именно этот день и его отсутствие не может быть втиснуто после новых изменений. Особенно для случаев, когда новые данные рождаются используя хеш старых данных, как например в блокчейнах.
Всё что вам нужно - правильным образом организовать рабочий режим и использовать правильные инструменты
Теперь по пунктам. Вот что вам нужно сделать:
По поводу логических файлов - здесь самое простое. Используйте системы контроля версий git/svn и тем самым можете вернуться к логике на любой момент времени.
Пользовательские файлы - сразу заливайте на сторонний сервер бекапа. Не удаляйте и не заменяйте их, используйте uuid() для генерации. Оставляйте файл на сервере, как это делают вконтакте и просто указывайте новую ссылку на файл в нужных местах. Либо создавайте проксю на стороне логики для выдачи нужного файла нужной версии.
Базы данных - здесь самое интересное. Даже если вы используете фреймворк с поддержкой миграций - у вас будут проводиться именно структурные изменения. Сами же данные восстановить вы не сможете. Здесь в качестве фиксации каждого изменений подойдёт запись запросов в виде ленты.
База данных Oracle пишет ленту сама и позволяет проводить такие механизмы автоматически.
В случае mysql - на лету такой механизм не предусмотрен.
Настройте события для адаптера для работы с базой данных, чтобы каждый запрос на изменение данных логировался и перед каждым из них логировалась команда (для Mysql)
set @@session.timestamp=<?=time()?>;
и сразу после этой команды пишите запрос на изменение данных (update / insert / merge / alter / delete / truncate / drop)
Таким образом все изменения данных, в том числе вычисляемые - будут проходить относительно той метки времени, когда на сервере в реальности был выполнен запрос без необходимости проводить какие-либо вычисления в самом запросе. Переменная уничтожается по окончании сессии, поэтому нет смысла восстанавливать её обратно (если вы используете отдельный сервер). Для восстановления вам понадобится создать отдельную базу, чтобы не затрагивать изменения в текущей базе. Файлы ленты после создания нового полного бекапа - можете смело архивировать для экономии места.
Периодически создавайте полный слепок базы, чтобы если вдруг что-то понадобилось восстановить - не проводить тонны вычислительных операций, а использовать ближайший полный бекап. Величина срока может зависеть от величины базы и частоты восстановлений.
Как недостаток - теперь все изменения данных, которые вы проводили через базу напрямую - необходимо будет проводить через адаптер на стороне сервера
Теперь вы защищены от каждого изменения в любой момент времени в том числе за секунду до аварии.
Исключениями для этого всего являются файлы конфигурации, кеши в случае если они не входят в систему контроля версий. Подразумевается что конфигурация будет храниться в ситеме контроля версий, а кеши могут быть вычисляемыми и не несут в себе полезной невосстанавливаемой информации, в противном случае вам также нужно вести её в системе контроля версий
Таким образом мы минимизируем количество места на сервере бекапа, и увеличиваем качество бекапов с возможностью восстановления вплоть до любой метки времени
Удачи в сохранности ваших данных.