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