Резервное копирование базы данных WordPress — важнейшая часть поддержки сайта, особенно если вы хотите избежать потери данных и быстро восстановиться после сбоев или взломов. В этой статье рассмотрим, как организовать автоматическое создание резервных копий базы данных WordPress без использования сторонних плагинов, используя только встроенные возможности PHP, WP-Cron и MySQL.
Почему стоит создавать резервные копии базы данных вручную без плагинов
Плагины резервного копирования удобны, но зачастую они добавляют нагрузку на сервер, могут конфликтовать с другими плагинами, требуют настройки и занимают лишнее место. Если вы хотите полностью контролировать процесс, уметь быстро модифицировать логику и избавиться от лишних зависимостей, ручное решение — лучший вариант.
Кроме того, такой подход полезен для разработчиков и тех, кто хочет понять, как работают процессы резервного копирования на уровне кода.
Основные этапы автоматического резервного копирования базы данных
- Создание дампа базы данных — экспорт в .sql файл
- Сохранение файла в защищенной папке на сервере
- Очистка старых резервных копий с целью экономии дискового пространства
- Настройка автоматического запуска через WP-Cron
- Отправка уведомления администратору (опционально)
Далее разберем каждый этап на примере кода.
Экспорт базы данных в файл .sql с помощью PHP и mysqldump
Самый надежный способ — использовать команду mysqldump, которая входит в пакет MySQL и предназначена для экспорта базы данных. Для этого необходимо, чтобы на сервере была возможность выполнять shell-команды из PHP.
Создадим функцию wpbook_backup_create_db_dump(), которая сформирует дамп и сохранит его в папку wp-content/backups с именем, включающим дату.
function wpbook_backup_create_db_dump() {
global $wpdb;
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
}
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$db_host = DB_HOST;
$date = date('Y-m-d_H-i-s');
$filename = "backup_{$date}.sql";
$filepath = $backup_dir . '/' . $filename;
// Формируем команду mysqldump
$command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$filepath}";
// Выполняем команду
system($command, $output);
// Проверяем, что файл создан
if (file_exists($filepath)) {
return $filepath;
} else {
return false;
}
}
Обратите внимание:
- Пароль передается в команде — убедитесь, что права доступа к файлам и к серверу настроены корректно.
- Если на вашем хостинге нет доступа к shell-командам, придется использовать альтернативные методы, например, экспорт через PHP (см. ниже).
Альтернативный метод: экспорт базы данных через PHP и WPDB
Если командная строка недоступна, можно получить дамп SQL вручную, перебирая таблицы и формируя запросы. Этот способ менее эффективен, но иногда единственный доступный.
function wpbook_backup_create_db_dump_php() {
global $wpdb;
$backup_dir = WP_CONTENT_DIR . '/backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
}
$date = date('Y-m-d_H-i-s');
$filename = "backup_{$date}.sql";
$filepath = $backup_dir . '/' . $filename;
$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
$sql_dump = '';
foreach ($tables as $table) {
$table_name = $table[0];
$create_table = $wpdb->get_row("SHOW CREATE TABLE {$table_name}", ARRAY_N);
$sql_dump .= "\n\n" . $create_table[1] . ";\n\n";
$rows = $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A);
foreach ($rows as $row) {
$values = array_map(function($value) use ($wpdb) {
if (is_null($value)) {
return 'NULL';
}
return "'" . esc_sql($value) . "'";
}, array_values($row));
$sql_dump .= "INSERT INTO {$table_name} VALUES (" . implode(', ', $values) . ");\n";
}
}
file_put_contents($filepath, $sql_dump);
if (file_exists($filepath)) {
return $filepath;
} else {
return false;
}
}
Этот метод создаст файл с полным дампом базы, но при больших базах может работать медленно.
Автоматизация запуска резервного копирования через WP-Cron
Для регулярного создания бэкапов нужно настроить периодический запуск задачи через WP-Cron. Добавим хук в файл функций темы или своего плагина.
function wpbook_backup_schedule_cron() {
if (!wp_next_scheduled('wpbook_backup_event')) {
wp_schedule_event(time(), 'daily', 'wpbook_backup_event'); // запуск каждый день
}
}
add_action('wp', 'wpbook_backup_schedule_cron');
function wpbook_backup_cron_function() {
$file = wpbook_backup_create_db_dump();
if ($file) {
// Можно отправить уведомление администратору
wp_mail(get_option('admin_email'), 'Резервная копия базы данных создана', "Файл резервной копии создан: {$file}");
}
}
add_action('wpbook_backup_event', 'wpbook_backup_cron_function');
Эта настройка запустит функцию создания дампа базы данных ежедневно и отправит письмо на почту администратора с информацией о файле.
Удаление старых резервных копий для экономии места
Чтобы не захламлять сервер постоянным накоплением файлов, реализуем автоматическую очистку резервных копий старше 7 дней.
function wpbook_backup_cleanup_old_files() {
$backup_dir = WP_CONTENT_DIR . '/backups';
$files = glob($backup_dir . '/backup_*.sql');
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
$filetime = filemtime($file);
if (($now - $filetime) > 7 * DAY_IN_SECONDS) {
unlink($file);
}
}
}
}
add_action('wpbook_backup_event', 'wpbook_backup_cleanup_old_files');
Эта функция будет запускаться одновременно с созданием бэкапа и удалять старые файлы.
Безопасность и рекомендации
При создании бэкапов вручную важно учитывать защиту данных:
- Папка с бэкапами должна быть недоступна напрямую из браузера (закрыть через .htaccess или разместить за пределами корня сайта)
- Ограничьте права доступа к файлам и папкам резервных копий
- Регулярно проверяйте работоспособность бэкапов, восстанавливая тестовую копию
- Если используете команду
mysqldump, убедитесь в безопасности передачи пароля
Дополнительные инструменты для резервного копирования на WPBook.ru
Если вы хотите использовать готовые решения с расширенными возможностями, обратите внимание на плагин Clearfy Pro. Он поможет не только с резервным копированием, но и оптимизацией сайта в целом.
Также для хранения резервных копий с уведомлениями и интеграцией с облачными сервисами можно рассмотреть WPRemark.