Автоматическое резервное копирование базы данных

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

 

Как использовать

Самый лучший способ - скопировать код и разместить его в папке с названием ‘database_backups’ как показано ниже на своем веб сервере. Затем при любом вызове файла backup.php будет создавать резервную копию и сохранять ее в туже папку. Останется только скачать копию в другое место для надежного хранения и использования в случае необходимости.

Резервное         копирование базы данных

Используем CRON

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

wget -O /dev/null http://ваш_сайт.com/database_backup/backup.php

 

Код скрипта

<?php
backup_database_tables('ХОСТ','ИМЯ_ПОЛЬЗОВАТЕЛЯ','ПАРОЛЬ','БАЗА_ДАННЫХ', '*');
 
// Функция резервного копирования базы данных
function backup_database_tables($host,$user,$pass,$name,$tables)
{
 
    $link = mysql_connect($host,$user,$pass);
    mysql_select_db($name,$link);
 
    //Получаем все таблицы
    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);
    }
 
    //Цикл по всем таблицам и формирование данных
    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";
    }
 
    //Сохраняем файл
    $handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
    fwrite($handle,$return);
    fclose($handle);
}
?>

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: papermashup.com/creating-automatic-mysql-database-backups/
Перевел: Сергей Фастунов
Урок создан: 22 Февраля 2012
Просмотров: 33648
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 27 Февраля 2012 11:22
    Sirge
    Да, хорошо получается, только в конце надо сообщить, что резервная копия базы данных создана, поэтому по крайней мере надо добавить
    echo "<center><b>Резервная копия базы данных создана</b></center>";
    • 28 Февраля 2012 00:27
      denis_odinets
      так скрипт кроном запускается, кто эту надпись станет читать? :-) сам сервер что ли.
  • 27 Февраля 2012 11:31
    sadchenko
    Отличный скрипт. Спасибо большое!))
  • 27 Февраля 2012 11:52
    aldem67
    Считаете нормально всю базу аккумулировать в переменную? а если БД более 50мб, 100мб?
    • 12 Августа 2012 23:11
      lazyproger
      100мб это еще нормально) бывает и больше, но даже 100мб говнохост уже не будет хорошо себя чувствовать.
  • 27 Февраля 2012 12:00
    rubyx
    мне повезло с хостом:) не надо туда вкладывать лишнее мне...
  • 28 Февраля 2012 13:40
    NEXUS
    Исправьте на 32 строке на: $return.= 'DROP TABLE IF EXISTS '.$table.';'; Т.к. если таблицы $table не существует, будет ошибка при импорте.
    • 29 Февраля 2012 09:16
      mft39anton
      Да, действительно, классный скрипт, кроном я не стал пускать, а просто дабавил в админку, чтобы делать это ручками. Единственный момент, было бы неплохо, чтобы бэкап сразу делался бы на компьтер.
  • 29 Февраля 2012 09:18
    Guslik
    В закладки возьму но, хост у меня раз в неделю, БД копию делает.
  • 29 Февраля 2012 22:01
    Arman91
    NEXUS ty davay ne umni4y...
  • 1 Марта 2012 00:26
    inpost
    Ещё одна статья для мини-баз. Памяти то хватит мои 20-гб БД импортировать? Ой, а почему у других всё работает? :) Те же dumper отлично выполняет всё это! :) А запустить думпер кроном с параметрами не позволяет что?
  • 1 Марта 2012 02:36
    banzaj
    Посмотрите же на комментарии у автора mysqldump -u root -ppassword –databases mydatabase -c –tables agx_psms_sales | gzip > /$(date +%Y-%m-%d).sql.gz Вот и весь backup.
  • 6 Марта 2012 00:15
    anton9010
    а почему бы не пользоваться MySQLdump?
  • 9 Марта 2012 14:56
    Alexej28
    Ребят зачем изобретать велосипед? http://sypex.net/ru/products/dumper/compare/ тут уже всё изобретено давно, дампер тянет БД огромных размеров без проблем, сам на днях только БД больше 1 Гига сохранил и перезалил. А также дампер работает через тот же крон, что является темой этой статьи. Ранее была статья про этот дампер уже здесь, думаю лучше его предлагать http://ruseller.com/adds.php?rub_id=12&id=1662
  • 14 Марта 2012 19:47
    tlustenko
    не совсем понятно - "таблица crontab" - где создавать? что прописывать? какие поля? и т.д. не достаточно объяснено. эту строчку wget -O /dev/null..... - куда вставлять? чёто сайт sypex не работает. и где можно скачать sypex с поддержкой CRON? А то все те что есть - бета версии, а бета не поддерживают CRON ( и где в скрипте прописать частоту сохранения базы - раз день или раз в неделю и в какое время?
    • 19 Марта 2012 21:41
      Alexej28
      wget -O /dev/null http://ваш_сайт.com/database_backup/backup.php
      или
      curl -s http://ваш_сайт.com/database_backup/backup.php > /dev/null
      это нужно вставлять в планировщик задач(cron), если конечно твой провайдер предоставляет данную услугу. О планировщике задач полно информации как и что делать в интернете, гугл в помощь. По поводу sypex последняя бесплатная версия поддерживает cron, для этого нужно в самом дампере сохранить задачу и потом в планировщике задач вставить ссылку на данную задачу в такой форме
      /usr/bin/php /полный путь к папке дампера на сервере/sxd/index.php -j=forum
      forum это как раз БД которая должна будет сохранена, а вернее задача которая была сохранена в дампере. Соответсвенно задачи лучше называть именно так как называется БД которую будете сохранять, что-бы не запутаться.
  • 19 Апреля 2012 10:47
    djaaga
    Попробовал ваш скрипт! Он работает. Сделал себе копию бызы данных и потом её запустил ради эксперимента. На сайте одни вопросики. Наверно с кодировкой проблемы? То ли скрипт недоделанный, то ли я что-то сделал не так. Что нужно изменить?
    • 6 Июня 2012 01:45
      vomore
      У меня еще прикольнее. Местами вопросы, местами короткие титлы в тегах по-русски норм, а длинные тексты, как будто их и небыло, но теги начальные сохранились??? Ах, да есть еще и просто пустота, там где были тексты.
    • 6 Июня 2012 02:33
      vomore
      Проблемма решена от обратного. Подобрана кодировка w1251. Хотя раньше дампы на пхпмайадмин без кракозябр вставали, тольео utf8
  • 12 Мая 2012 10:30
    steppe
    У меня почему то такая ошибка возникает: Warning: fopen(db-backup-1336804161-359fbd93e791b3490e46ce4faa6fe1cc.sql) [function.fopen]: failed to open stream: Permission denied in /var/www/steppe/data/www/мой_домен/database_backups/backup.php on line 55 Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/steppe/data/www/мой_домен/database_backups/backup.php on line 56 Warning: fclose(): supplied argument is not a valid stream resource in /var/www/steppe/data/www/мой_домен/database_backups/backup.php on line 57 Что делать?
  • 25 Октября 2013 04:21
    Gooden
    Отлично работает!
  • 14 Ноября 2016 05:49
    olga1qazaq1
    Привет. У меня дурацкие вопросы, но я не смогла сама. Как сделать, чтобы файл сохранялся в определенную папку, а не в корневую директорию и один раз в неделю ? Пока у меня идет сохранение каждый час... Я прям очень буду благодарна за ответ )))
^ Наверх ^