Backup database / Бэкап базы данных без плагинов на cPanel
Вступление
Появилась необходимость обычного бэкапа в zip, tar, gzip ну или в любом другом варианте сжатия. Никаких очисток, оптимизаций, перестроек, файловых бэкапов и улучшений мне не нужно было.
Нужен "чисты архив Базы Данных" 1-2 раза в сутки с удаленным дублированием в облако или сервер.
Плагины UpdraftPlus и WP Database Backup: первый не смог помочь из-за большого размера wp_postmeta, постоянно висел в ошибке, у второго сразу появлялась ошибка из-за недостатка времени и памяти. Колдовство с увеличением не помогло, а разбираться с логами и настройками уже надоело, так как 4 разных хостинга, с разными Версиями PHP, WordPress,Темами, Плагинами, Самописными скриптами и панелями управления.
Вариант Решения №1
Авторизация cPanel, + полный бэкап файлов через переменные из урл + cron и т.д. , знаний мало, и я не осилил.
Вариант Решения №2
То что нужно - Вариант максимально примитивный, не требует сверх знаний, думаю по инструкции справится и ребенок.
Решение максимально примитивно и в него не включено
- отслеживание количества бэкапов
- выставление количества бэкапов
- перезапись старых бэкапов новыми на текущем хостинге
- перезапись старых бэкапов новыми на облаке
- я не нашел примера подключения к google диск
1 Создание Бэкапа базы данных
(если вы Горец и уверены в хостинге, тогда можно сразу остановится на этом пункте)
Необходимо отправится в крон задания cPanel и создать там правило выполнения полного бэкапа по нужному расписанию (У меня 2 раза в день 00.00 и 12.00), а также выбрать метод сжатия или без него.
создаем папку под бэкапы - я создал в корне
создаем команду - 1 время, 2 команда и 3 подтверждение. Команда создается в одну строку.

вот пример готовой команды с замазанными моими данными
// если мы хотим в базу в чистом варианте /usr/bin/mysqldump -u "DB_user" -p'DB_password' DB_name > /home/cPanel_user_ID/backups/databace__$(date +\%Y-\%m-\%d-\%H\%M\%S).sql // если мы хотим в базу в сжатом варианте /usr/bin/mysqldump -u "DB_user" -p'DB_password' DB_name | gzip /home/cPanel_user_ID/backups/databace__$(date +\%Y-\%m-\%d-\%H\%M\%S).sql.gz // заменяем под себя переменные DB_user - логин пользователя базы данных DB_password - пароль пользователя базы данных. !Важно, на форумах пишут что между не должно быть пробелов-p' DB_name - имя базы данных cPanel_user_ID - можно посмотреть в главном меню или взять из url /home/тут ваш айди/ backups - папка где хранить бэкапы (я создал в корне)
2 Ключи к облаку - облако Яндекс диск.
Тут немного по сложнее. Я подключил яндекс диск. Пользовался этой инструкцией , но в итоге немного отошел от неё , вот порядок действий.
создание ключей для подключения к Яндекс диску* (далее ЯД) заполняем 4 пункта как на скрине
https://oauth.yandex.ru/client/new
Callback URI #1: - далее этот URL нам понадобится
https://oauth.yandex.ru/verification_code
В итоге "Сохраняем изменения" и нас перекидывает в новое поле

предыдушую вкладку оставляем открытой, открываем новую и формируем url для получения OAuth токен
https://oauth.yandex.ru/authorize?response_type=token&client_id=идентификатор приложения
идентификатор приложения - это строка ID из предыдущего скриншота. После того как я подставил ID и перешел по url, выскочило меню.

нажимаем разрешить и получаем OAuth токен

3 Формируем скрипт отправки Бэкапов и его запуск через крон
создал файл на хостинге в папке "/home/cPanel_user_ID/backups/" и назвал backup.php - простыми словами скрипт положил в папку для бэкапов.
добавил крон запуска своего скрипта 2 раза в сутки
php /home/cPanel_user_ID/backups/backup.php
наполняем скрипт по описанию - места которые нужно проконтролировать или поправить под себя обозначил [*]
<?php ini_set('max_execution_time', 360);
// получаем файлы [*]
$dir = '/home/cPanel_user_ID/backups';
// сканирование и сортировка по убыванию смотреть scandir()
$files2 = scandir($dir, 1);
// получаем последний созданный файли
$last_byname = $files2[0];
// получаем и определяем расширение [*]
// у меня 2 бэкапа в sql и gzip и по єтому ниже идет выборка только gzip
// $ext = substr(strrchr($last_byname, '.'), 1);
// if ($ext == "sql"){
// $last_byname = $files2[1];
// }
// Корректировка url файла (*)
$backup_file_gz = '/home/cPanel_user_ID/backups/' . $last_byname;
$file = $backup_file_gz;
// https://oauth.yandex.ru/
// https://oauth.yandex.ru/authorize?response_type=token&client_id=идентификатор%20приложения
// ключ доступа подставляем имено ваш персональный [*]
$token = '';
// Папка на Яндекс Диске, где будем хранить бэкапы (уже должна быть создана). [*]
$path = '/back_up/';
// Запрашиваем URL для загрузки. Я добавил параметр перезаписи '&overwrite=true' [*]
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($path . basename($file)).'&overwrite=true');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $token));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
$res = json_decode($res, true);
if (empty($res['error'])) {
// Если ошибки нет, то отправляем файл на полученный URL.
$fp = fopen($file, 'r');
$ch = curl_init($res['href']);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 201) {
// echo 'Файл успешно загружен.';
} else {
// echo $http_code ;
}
}
if ($res['error'] == "UnauthorizedError"){
// Отправка отчета на почту
$to = "simple@yandex.com"; // [*]
$subject = "Backup Error";
$message = "<b>Проблемы с backup:</b> ". $res['message'];
$message .= "<br/><b>Тип ошибки:</b> ". $res['error'];
$message .= "<br/><br/><b>Не вышло получить бэкап!" ;
$headers = "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Backup Admin <admin@simple.com>\r\n"; // [*]
mail ($to, $subject, $message, $headers);
} else {
// Отправка отчета на почту
$to = "simple@yandex.com"; // [*]
$subject = "Backup";
$message = "<b>Отправлен бэкап файл:</b> " . $last_byname;
$message .= "\n<br/><br/><b>Код ответа Яндекс Диска:</b> " . $http_code;
$message .= "\n<br/><br/>Инфо:\n<br/>";
$message .= "201 – файл был загружен без ошибок.\n<br/>
202 – файл принят сервером, но еще не обработан.\n<br/>
412 – при дозагрузке файла был передан неверный диапазон в заголовке Content-Range.\n<br/>
413 – размер файла превышает 10 ГБ.\n<br/>
500, 503 – ошибка сервера, попробуйте повторить загрузку.\n<br/>
507 – для загрузки файла не хватает места на Диске пользователя";
$headers = "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: Backup Admin <admin@simple.com>\r\n"; // [*]
mail ($to, $subject, $message, $headers);
}
4 Отправка на другой сервер
писать не стал, не пользуюсь пока что. Но все работает на 2-3х командах
ftp_connect(); ftp_login(); ftp_put();




