Сегодня мне понадобилось настроить автоматический бэкап базы данных с одного хостинга на другой. Я рассмотрел несколько вариантов создания резервных копий баз данных и остановился на самом простом — с помощью утилиты 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’у выполнять наш скрипт каждый день в час ночи.
Вот и всё! Теперь ваша база данных будет ежедневно копироваться на сервер-хранилище.
А что дальше?
Вы можете дополнить и улучшить данный скрипт, например, реализовать отправку письма администратору, или же добавить дополнительные параметры в исполняемую команду, главное — у вас есть основа, которую можно модифицировать. Пишите в комментариях свои идеи по резервному копированию!