Сегодня мне понадобилось настроить автоматический бэкап базы данных с одного хостинга на другой. Я рассмотрел несколько вариантов создания резервных копий баз данных и остановился на самом простом — с помощью утилиты mysqldump. Сейчас я расскажу как это сделал.
В чём идея резервного копирования с одного сервера на другой?
Идея очень простая — если накроется один сервер, то с другого базу данных можно восстановить. Это лучше, нежели хранить все резервные копии на одном сервере.
Ок, и как мы это сделаем?
А теперь пару слов о том, как будет проходить процесс резервного копирования. Допустим у нас есть сервер «А», на котором находится база данных, бекапы которой мы хотим создавать. И есть сервер «Б», на который мы эти бекапы будем сохранять. Чтобы сделать дамп БД достаточно выполнить следующую команду в командной строке на сервере:
mysqldump -u <ПОЛЬЗОВАТЕЛЬ> -p<ПАРОЛЬ> --extended-insert=false <БАЗА> > site-$(date +%Y-%m-%d).sqlА чтобы подключиться к базе данных на другом сервере, достаточно добавить параметр -h, например вот так:
mysqldump -h 92.53.114.27 -u <ПОЛЬЗОВАТЕЛЬ> -p<ПАРОЛЬ> --extended-insert=false <БАЗА> > site-$(date +%Y-%m-%d).sqlНу и чтобы всё это работало автоматически, надо создать задание в cron и написать небольшой скрипт на php, который будет поддерживать в директории дампов определённое количество файлов (зачем нам сотни дампов?).
Приступаем к настройке автоматического резервного копирования бд MySQL
Для работы нам понадобится совсем немного:
- Два сервера
- Cron
- Доступ к серверу по ssh
- Утилита mysldump на сервере
- 20 минут свободного времени 🙂
Устанавливаем скрипт на сервер
Запишите код ниже в файл database_backup.php и сохраните его на сервере, который будет хранилищем дампов, в любой папке, пусть это будет папка /var/database_backups. Затем создайте папку, в которой будут храниться ваши дампы, пусть это будет следующая папка /var/database_backups/sitename.
$config = [
// ip адрес сервера, с которого будем копировать базу
'ip' => '11.11.111.11',
// Путь до папки в которой будут лежать дампы баз
'path' => '/var/database_backups/sitename',
// Шаблон имени файла дампа базы. Вместо <date> подставится дата в формате 2015-04-19
'filenamePattern' => 'dump_<date>.sql',
// Максимальное количество дампов, хранящихся на сервере
'maxFilesCount' => 3,
// Настройка подключения к БД
'db' => [
'name' => 'site',
'user' => 'root',
'password' => 'mysql',
],
];
$ip = !empty($config['ip']) ? "-h $config[ip]" : '';
$filename = str_replace('<date>', '$(date +%Y-%m-%d)', $config['filenamePattern']);
$command = "mysqldump $ip -u {$config['db']['user']} -p{$config['db']['password']} --extended-insert=false {$config['db']['name']} > {$config['path']}/$filename";
exec($command);
if (!empty($config['maxFilesCount'])) {
cleanDirectory($config['path'], $config['maxFilesCount']);
}
/**
* Clears the directory of the files, leaving no more than $maxFilesCount number of files
*
* @param string $dir
* @param string $maxFilesCount
*/
function cleanDirectory($dir, $maxFilesCount)
{
$filenames = [];
foreach(scandir($dir) as $file) {
$filename = "$dir/$file";
if (is_file($filename)) {
$filenames[] = $filename;
}
}
if (count($filenames) <= $maxFilesCount) {
return;
}
$freshFilenames = array_reverse($filenames);
array_splice($freshFilenames, $maxFilesCount);
$oldFilenames = array_diff($filenames, $freshFilenames);
foreach ($oldFilenames as $filename) {
unlink($filename);
}
}
Создаём задание в cron’е
Почти всё! Дело за малым — создать задание в кроне. Для этого на сервере-хранилище выполните следующий скрипт:
crontab -eУ вас должен открыться текстовый редактор в котором мы пропишем задание для cron:
0 1 * * * php /var/database_backups/database_backup.phpЭтой самой строчкой мы сказали cron’у выполнять наш скрипт каждый день в час ночи.
Вот и всё! Теперь ваша база данных будет ежедневно копироваться на сервер-хранилище.
А что дальше?
Вы можете дополнить и улучшить данный скрипт, например, реализовать отправку письма администратору, или же добавить дополнительные параметры в исполняемую команду, главное — у вас есть основа, которую можно модифицировать. Пишите в комментариях свои идеи по резервному копированию!

Если сервер с которого делается бекап будет в дауне, то прежние бекапы затираются. (проверено).
Как этого избежать?