Добро пожаловать на портал вебмастеров WebmastersBY
Веб-программирование

Создаем автоматический бэкап базы данных MySQL

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

Создаем автоматический бэкап базы данных MySQL

С помощью этого скрипта Вы можете передавать конкретные таблицы для резервного копирования или создавать резервную копию всей базы данных.

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

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

Создаем автоматически бэкап базы данных MySQL

Использование CRON

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

Только измените ссылку, указывающую на файл backup.php на вашем сервере.

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

PHP-код

А это непосредственно сам код файла backup.php. Вам необходимо передать функции backup_database_tables пять обязательных параметров: HOST (чаще всего это localhost), USERNAME (имя пользователя базы данных), PASSWORD (пароль для этого пользователя), DATABASE (имя базы данных для которой необходимо сделать резервную копию), в пятом параметре перечисляете таблицы для которых нужен бэкап, если нужно сделать копию всех таблиц, то указываете '*'.

<?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);

    // Получаем таблицы
    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);
}

Как видите всё довольно просто. Я надеюсь этот скрипт позволит уберечь ваши данные от потери.

Комментарии 1
  • Аватар
    1.А

    Спасибо

    • 03.05.2025 23:20

Новый комментарий

Имя:
Для редактирования комментария осталось 10 минут