Как реализовать бэкап сайта/бд посредством PHP?

Сайт содержится локально на компьютере. Необходимо делать бэкап данных каждый день, а также бэкап всех файлов каждую неделю. Возможно ли написать скрипт на PHP, который будет автоматически реализовывать данный функционал.
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 7
Stalker_RED
@Stalker_RED
Возможно, хотя непонятно зачем это делать на PHP.

Достаточно одной команды архиватору - вот эту папку заархивируй, добавь в название дату, и помести вон в ту папку. Или отправь по почте, например.
Ну и в планировщик задач это добавить.

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

Еще лучше, если у вас будет запасной сайт, на который можно переключиться за секунды. Но это уже история следующего уровня.
Ответ написан
Комментировать
А зачем делать так, чтобы резервная копия зависела от работы сайта?!

Проще через теневое копирование и специализированное ПО для резервного копирования по расписанию запускать задание.
Ответ написан
Комментировать
Adamos
@Adamos
Пых сам себя не запустит, все равно придется планировщик пристегивать.
А планировщику, в свою очередь, незачем прописывать исполнение команд пыха, есть более естественные инструменты.
Для локального компьютера, на самом деле, главная сложность в том, что он, в отличие от сервера, включен не постоянно, поэтому просто задав планировщику бэкап каждый день и каждую неделю, можно элементарно ничего не получить, потому что компьютер в это время не работал...

Просто локальный сервер - это обычно сервер разработки, его можно бэкапить, просто сделав себе соответствующие скрипты и запуская их после окончания работы вручную.
Постоянно же работающий сервер логичнее бэкапить снаружи - дотягиваясь до него с бэкап-сервера и забирая данные туда, куда основной вовсе доступа не имеет. Из банальных соображений безопасности.
Ответ написан
Комментировать
@rPman
Суточного бакапа тебе будет достаточно? Если в момент смерти сайта ты сможешь восстановить только 'вчерашнюю' копию, с потерей всех сегодняшних изменений и данных?

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

Чтобы решить эти проблемы используют снапшоты, на выбор - либо на уровне виртуальной машины (если она используется либо у провайдера), либо разделов (например если используется lvm), либо файловой системы (если используется btrfs/zfs/ntfs, с оговорками).

Перед резервным копированием делают снапшот файловой системы, замораживая ее состояние, делают копирование, после чего снапшот удаляют/отключают. Самые быстрые снапшоты на основе файловой системы и у виртуальной машины (правда некоторые делают это вместе с оперативной памятью, что медленнее).

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

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

Ну и конечно есть механизмы онлайн резервирования целой виртуальной машины, когда за резервирование системы в целом отвечает вииртуализация (заранее построенный отказоустойчивый распределенный кластер), возможно создание такой системы, что в момент сбоя даже не перестанет работать приложение, оно прозрачно и оперативно переедет на другую ноду в крастере.
Ответ написан
Комментировать
php666
@php666
PHP-макака
посмотри на программы https://freefilesync.org/
Ответ написан
Комментировать
@warus
приготовить дамп базы данных mysql
sudo mysqldump имябазыданных >> кудасохранить.sql
упаковать сайт в архив
tar -czvf archive.tar.gz /var/www/
можно подробнее, какая у вас система, куда копировать набросать четыре строчки для *.bat или bash и chrona не проблема
Ответ написан
@thisuserhatephp
Офлайн - losers Онлайн - lusers
Я так сделал
/**
 * конфиг бэкапа
 */
function db_dump_config() {
    return [
        //общяя папка с бэкапами
        'get_backup_dir'            => $_SERVER['DOCUMENT_ROOT'] . '/backup/',
        
        // папка для бэкапа базы данных
        'get_db_backup_dir'         => $_SERVER['DOCUMENT_ROOT'] . '/backup/db/',
        
        // автоматическое название бэкапа
        'get_db_auto_name'          => 'db'.date('-(d.m.Y)'),
        
        // путь до исполняемого файла для бэкапа
        'get_mysql_dump_path'       => dirname($_SERVER['DOCUMENT_ROOT']) . '/mysql/bin/mysqldump'
    ];
}


/**
 * делаем бэкап базы данных
 * берем данные из конфига
 */
function make_db_dump() {
    $dump_db_config = db_dump_config();

    if(is_db_backup_exists($dump_db_config['get_db_auto_name'], $dump_db_config['get_db_backup_dir']) == false) {
        ls_db_dump($dump_db_config['get_backup_dir'], $dump_db_config['get_db_backup_dir'], $dump_db_config['get_mysql_dump_path'], $dump_db_config['get_db_auto_name']);
    }
}


/**
 * @param string $backup_dir путь до общей папки с бэкапами
 * @param string $db_backup_dir путь до папки с бэкапами для базы данных
 * @param string $dump_exe_path путь до исполняемого файла бэкапа
 * @param strign $dump_name название файла бэкапа 
 */
function ls_db_dump($backup_dir, $db_backup_dir, $dump_exe_path, $dump_name) {
    if(check_and_create_db_dir($backup_dir) && check_and_create_db_dir($db_backup_dir)) {
        
        $save_to = $db_backup_dir . $dump_name . '.sql';
        
        if(exec("$dump_exe_path --user=".DBUSER." --password=".DBPASS." --host=".DBHOST." ".DBNAME." --result-file={$save_to} 2>&1", $output)) {
            return true;
        }
    }

    return false;
}


spoiler
вместо DBPASS, DBHOST, DBNAME пишите свои данные
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽