Pull to refresh

Элементарные PHP скрипты для резервного копирования данных

Reading time 2 min
Views 10K
В ответ недавнему топику о бэкапах на Bash. Топик полезный, без сомнений, однако я хочу продемонстрировать более гибкий способ…
Основной недостаток приведенного способа в топике выше — ненадобность. Ну честно, кому надо бэкапить файлы и базу одновременно? Т.е. бэкапить каждый день и файлы и базу — глупо, но и делать раз в месяц это глупо. Поэтому мой пример я разбил на 2 части. Отдельно делаем бэкап базы ежедневно и отдельно делаем бэкап файлов раз в неделю.
Соответственно, нам понадобится php на сервере. Что в наше время уже не роскошь, а банальщина.
Итак, для себя я решил, что локально бэкапы хранятся в /usr/backup/
Создаем php скрипт /usr/backup/backup_db:

#!/usr/local/bin/php
<?
$exс=array('information_schema', 'mysql');
$db_pass='password';
$db_user='root';

system('mkdir -p /usr/backup/mysql/'.date('d.m.Y').'/');
$db=mysql_connect("localhost", $db_user, $db_pass);
$sql=mysql_query("SHOW DATABASES");
while($a=mysql_fetch_assoc($sql)){
    $base=$a['Database'];
    if(!in_array($base, $exс)){
        exec('/usr/local/bin/mysqldump -u'.$db_user.' -p'.$db_pass.' --opt '.$base.' | /usr/bin/gzip > /usr/backup/mysql/'.date('d.m.Y').'/'.$base.'.gz');
    }
}

Как видим, все просто и примитивно. Отмечу, что $exс — массив с исключениями. Сюда добавляем базы, которые не хотим бэкапить каждый день. Остальные базы, что видет пользователь $db_user, мы бэкапим, причем каждую отдельно и кладем их в директорию /usr/backup/mysql/дата/база.gz
Это намного удобней, чем создавать под каждый проект отдельный файл бэкапов. Например, у меня 2 сервера и на каждом 10+ проектов. Не так и много, но кол-во постоянно обновляется. Кто-то ушел, кто-то пришел, появился новый сервер итп. Мне достаточно скопировать один файл и бэкапы всех проектов собираются автоматом. Это удобно.
Соответственно добавляем в крон строку (для FreeBSD. Для Linux, насколько помню, другая. Пожалуйста, поправте, линуксойды):
0 5 * * * root /usr/backup/backup_db
Которая говорит о том, что каждый день в 05:00 собираем новый бэкап базы и гзипем его.

Ну и не забываем про код и картинки… /usr/backup/backup_www…
У кого как, у меня все проекты лежат в /usr/local/www/…

#!/usr/local/bin/php
<?
$exс=array('test.ru');
$dir='/usr/local/www/';

system('mkdir -p /usr/backup/www/'.date('d.m.Y').'/');
$d=opendir($dir);
while(($file=readdir($d))!==false){
    if($file!='.' && $file!='..' && is_dir($dir.'/'.$file) && !in_array($file, $exс)){
        exec('tar cpzvf /usr/backup/www/'.date('d.m.Y').'/'.$file.'.tar.gz --exclude=*.log* --exclude=*.svn* '.$dir.$file);
     }
}

Как видим, скрипт бэкапт все, кроме log файлов и svn файлов. Насчет svn может быть я и не прав, но пока проблем с этим небыло. Так же массив $exс является исключениями.
Для данного скрипта в крон пишем несколько другое правило:
0 5 * * 6 root /usr/backup/backup_www
таким образом бэкапим скрипты и статику в 5 утра в выходной.
Я использую данные скрипты не только на своих серверах, но и на клиентских. Правда, на клиентских дополняю их еще и копированием архивов на третьи сервера для пущего страху. На некоторых серверах отдельные таблицы в нужных базах бэкаплю каждый час итп. PHP дает гибкость, которой так не хватает в bash`е.

p.s. после добавления данных в крон не забываем его ребутить. И не забываем ставить chmod +x для backup_db и backup_www
p.p.s. любые дополнения и критика приветствуются.
Tags:
Hubs:
-8
Comments 19
Comments Comments 19

Articles