Создание резервных копий файлов и баз данных

в 19:23, , рубрики: cron, php, Веб-разработка, Программирование, системное администрирование, метки: ,
Добрый день!

Каждый вебмастер, у которого на хостинге «висит» несколько рабочих сайтов, наверняка сталкивался с проблемой резервного копирования своих данных.

Т.е.ак, перед нами стоят несколько задач:

  • сделать бекап всех файлов на хостинге;
  • сделать бекап всех баз данных на хостинге;
  • полученные файлы заархивировать в один архив.


К тому же все вышесказанное нужно автоматизировать с периодичностью раз в сутки. Как быть, если подручными средствами являются лишь возможности PHP?

Для реализации данных задач необходимы:

  • начальные знания PHP;
  • одна элементарная команда MySQL (show databases;);
  • системные команды архивации(/bin/tar -cjf ...) и создания дампа MySQL (mysqldump -u...)
  • и… все!
Код реализации данной задачи ниже:

<?php
$servername = 'localhost'; // сервер базы данных
$username = 'username'; // пользователь
$password = 'password'; // пароль
$projects_path = '/home/username/public_html/projects'; // Путь к файлам, которые НУЖНО заархивировать
$backup_path = '/home/username/public_html/backup'; // Путь к директории, где мы будем хранить архивы
//--------------------------
// каждый созданный архив будет иметь имя, состоящее из текущей даты
$date = date("d-m-Y");

// получение массива баз данных (сама функция - ниже)
$db_names_array = get_db_names($servername,$username,$password);

// в этом цикле мы создаем бекапы всех баз данных, и переносим их в $projects_path
foreach ($db_names_array as &$db_name) {
exec("mysqldump -u ".$username." -p".$password." -h ".$servername." ".$db_name." > ".$projects_path."/dump-".$db_name."-".$date.".sql");
}

// создаем основной архив с файлам и бекапами баз данных
exec("/bin/tar -cjf ".escapeshellarg($backup_path."/backup-".$date.".tar.bz2")." ".escapeshellarg($projects_path));

// Это последнее действие. В этом цикле мы удаляем из $projects_path все бекапы баз данных (они ведь нам уже не нужны).
foreach ($db_names_array as &$db_name) {
exec("rm ".$projects_path."/dump-".$db_name."-".$date.".sql");
}

// --------------- Функция получения имен всех баз данных -----------------------
function get_db_names($servername,$username,$password){
$db = mysql_connect($servername,$username,$password) or die("Can't establish the db connection!");
$query = "show databases;";
$result = mysql_query($query);
mysql_close();

unset($db_array);
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)){
$db_array[] = $line["Database"];
}
return $db_array;
}

?>

Вот и все!

У кого получится воспользоваться вышеописанным кодом — буду рад увидеть комментарии!
Спасибо!

Автор: vladimirterehoff

Поделиться

* - обязательные к заполнению поля