Автоматическое резервное копирование MySQL

  • 7 310
  • Нет комментариев
MySQL на фоне неба

Сегодня мне понадобилось настроить автоматический бэкап базы данных с одного хостинга на другой. Я рассмотрел несколько вариантов создания резервных копий баз данных и остановился на самом простом — с помощью утилиты 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

Для работы нам понадобится совсем немного:

  1. Два сервера
  2. Cron
  3. Доступ к серверу по ssh
  4. Утилита mysldump на сервере
  5. 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’у выполнять наш скрипт каждый день в час ночи.
Вот и всё! Теперь ваша база данных будет ежедневно копироваться на сервер-хранилище.

А что дальше?

Ковальски варианты

Вы можете дополнить и улучшить данный скрипт, например, реализовать отправку письма администратору, или же добавить дополнительные параметры в исполняемую команду, главное — у вас есть основа, которую можно модифицировать. Пишите в комментариях свои идеи по резервному копированию!

Понравилась статья? Оцени её!
Комментарии (0)
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *