Войти Регистрация

MySQL backup: автоматический бэкап MySQL на PHP


mysql backups - бэкап базы данных

Организовываем автоматические бэкапы базы данных MySQL.

 

Каждая база данных должна быть подстрахована резервным копированием или бэкапом (backup). Если вы все еще делаете это вручную, то можете радоваться, потому что есть простое решение автоматического бэкапа на PHP. С помощью данного скрипта вы можете передавать конкретные таблицы для резервного копирования или сделать резервное копирование всей базы данных.

 

Как реализовать mysql backups?

Лучше всего скопировать код предоставленного скрипта и поместить его в папку «database_backups», как показано на скриншоте ниже. Затем при вызове файла backup.php, он будет создавать резервную копию базы данных на вашем сервере. Я бы рекомендовал периодически копировать все файлы бэкапов себе на компьютер или другое хранилище, что бы перестраховаться на случай потери хостинга.

Пример реализации резервного копирования БД

Автоматизация mysql backups с помощью CRON

CRON является проверенным планировщиком заданий, который позволяет запускать скрипты в определенное время. Например, можно делать бэкапы базы данных ночью, когда падает трафик. Вы можете легко настроить CRON, если его поддерживает ваш хостинг. Для этого вам необходимо выполнить следующую команду, в которой нужно просто изменить ссылку на ваш файл создающий бэкапы.

wget -O /dev/null http://your-site.com/database_backup/backup.php

PHP код файла

<?php
backup_database_tables('HOST','USERNAME','PASSWORD','DATABASE', '*');

// backup the db function
function backup_database_tables($host,$user,$pass,$name,$tables)
{

	$link = mysql_connect($host,$user,$pass);
	mysql_select_db($name,$link);

	//get all of the tables
	if($tables == '*')
	{
		$tables = array();
		$result = mysql_query('SHOW TABLES');
		while($row = mysql_fetch_row($result))
		{
			$tables[] = $row[0];
		}
	}
	else
	{
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}

	//cycle through each table and format the data
	foreach($tables as $table)
	{
		$result = mysql_query('SELECT * FROM '.$table);
		$num_fields = mysql_num_fields($result);

		$return.= 'DROP TABLE '.$table.';';
		$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
		$return.= "\n\n".$row2[1].";\n\n";

		for ($i = 0; $i < $num_fields; $i++)
		{
			while($row = mysql_fetch_row($result))
			{
				$return.= 'INSERT INTO '.$table.' VALUES(';
				for($j=0; $j<$num_fields; $j++)
				{
					$row[$j] = addslashes($row[$j]);
					$row[$j] = ereg_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ");\n";
			}
		}
		$return.="\n\n\n";
	}

	//save the file
	$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
	fwrite($handle,$return);
	fclose($handle);
}
?>

Мы рассмотрели простой пример реализации автоматического бэкапа базы данных mysql. Да, способ дубовый, но он приемлем для маленьких сайтов. Если у вас большой проект, то использование php очень медленное в сравнении с использованием mysqldump. Убедительная просьба к тем, кто знает как организовать резервное копирование лучше, напишите в комментариях. 


Источник материала ...

Дальше: MySQLdump: скачать, работа с mysqldump, примеры


Дискуссия по теме    15 Комментариев
Добавить комментарий
Максим 01.02.2015 в 14:44
Здравствуйте! Данный скрипт создает бэкап БД со всеми таблицами ?
Тарас 02.02.2015 в 01:07
Да. В таком виде как подан на сайте, будет делать бэкап всех таблиц. Или можно передать определенные таблицы скрипту в виде массива (смотрите последний аргумент функции).
Илья 27.06.2013 в 18:31
Спасибо, конечно сделал пару доработок, и теперь каждый день создает новую папку и кидает все дампы моих баз в эту папку сжатыми gzip
Tim 16.03.2013 в 07:28
Начал изучать тему. Мне кажется с этого скрипта бд не удасться восстановить. 1. нет опции NO_AUTO_VALUE_ON_ZERO, что приведет к ошибке восстановления, если использовались записи со значением 0 в AUTO_INCREMENT 2. CREATE TABLE IF NOT EXISTS - иначе скрипт не выполняется на рабочей БД. 3. И главное, все constraint внешних ключей должны быть вынесены из определения таблиц и перенесены после всех INSERT в виде ALTER TABLE TBLNAME ADD CONSTRAINT, иначе не удасться сделать INSERT, где есть ссылки на другие таблицы, а там нет соответствующих значений. В итоге скрипт очень хороший, но результатом пользоваться почти невозможно (по крайней мере в автоматическом режиме).
Пётр 03.02.2013 в 21:12
Почему не указал ссылку на источник? http://papermashup.com/creating-automatic-mysql-database-backups/
Тарас 03.02.2013 в 22:34
Указана в ссылке "Источник материала" выше...
Евгений 22.01.2013 в 21:00
ТАРАС, огромное Вам спасибо, работает, те таблицы которые нужно копирует)))) спасибо!!!
Евгений 21.01.2013 в 21:24
А если только определенные таблицы нужно скопировать, что нужно ввести здесь //get all of the tables if($tables == 'SC_categories') так не работает.
Тарас 22.01.2013 в 01:35
По идеи нужно просто поправить эту строку: backup_database_tables('HOST','USERNAME','PASSWORD','DATABASE', 'TABLE1, TABLE2, TABLE3');
Игорь 18.08.2012 в 23:59
Все гениальное просто) Благодарю!
Вася 14.07.2012 в 14:43
А как насчет этого - ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=... ? И еще надо так - DROP TABLE IF EXISTS а не просто DROP TABLE
Тарас 14.07.2012 в 15:27
Каждому свое... поправьте. Расширять скрипты можно до бесконечности )))
Вася 03.04.2012 в 19:47
Здравствуйте пробую этот вариант на localhost возникает проблема Warning: fopen(Z:\home\localhost\www\gp\database_backups\db-backup-2012-04-04 01:04:46-523cb449a0d9ba3fb0ebb912ccf9e027.sql) [function.fopen]: failed to open stream: Invalid argument in Z:\home\localhost\www\gp\database_backups\backup.php on line 62 из-за чего это может быть?
Валерий 11.01.2012 в 04:45
Запустил функцию, сообщило: Notice: Undefined variable: return in W:\html\monitor-base.tv\www\database_backups\backup.php on line 28. При этом дамп создала, кстати. Ну чтож. На всякий случай, в начале тела функции backup_database_tables добавил $return = ''; - ошибок больше не генерирует.
Сергей 07.12.2011 в 11:41
Пару функций addslashes/ereg_replace надо заменить на mysql_escape_string или лучше mysql_real_escape_string. А так скрипт хороший. ;)
Добавить комментарий
Просмотров: 20501