Наша взаимовыгодная связь https://banwar.org/
Нещодавно я зіткнувся з невеликою проблемою. Потрібно було організувати автоматичне створення резервних копій бази даних.
Завдання, звичайно, стандартна, а, з огляду на обсяг бази (менше 1 МБ), може бути вирішена без спеціального софту і обладнання.
Так що я вибрав найпростіший спосіб (здійснюється в три етапи):
1) створення дампа БД;
2) упаковка дампа в архів;
3) відправка архіву на eMail.
На сьогоднішній день, обсяги поштових скриньок дозволяють взагалі не видаляти ці архіви, і надійність рішення виходить досить високою, тому що дані зберігаються на різних серверах.
Тобто все, що потрібно зробити - написати скрипт і запускати його за допомогою cron.
Скрипт я вирішив зробити на PHP , І відразу ж зіткнувся з проблемою.
Для створення дампа бази найзручніше використовувати утиліту mysqldump, яка у мене на хостингу прекрасно работет з консолі, але не запускається з скрипта.
Причина виявилася дуже простий. В налаштуваннях PHP на сервері хостера були відключені функції: shell_exec (), exec () і т.п.
Тому довелося робити backup в два етапи.
1) Створення дампа БД
Для цього планувальник я просто додав команду:
mysqldump -uuser_name -hhost_name -puser_password db_name> /path_to_tmp/db_backup/mydbdump.sql
В результаті виконання цієї команди, створюється файл mydbdump.sql з дампом бази, який буде розміщений в папці / path_to_tmp / db_backup /. В параметрах команди, природно, потрібно вказати справжні імена бази, користувача, пароль і шлях до теки / tmp.
Примітка. Для папки / path_to_tmp / db_backup / повинні бути встановлені права на запис.
2) Упаковка дампа в архів і відправка по eMail
Ці операції виконуються одним скриптом.
<? Php / ** * Цю функцію я взяв на сайті * http://www.weberdev.com/get_example-4173.html * / function mail_attachment ($ filename, $ path, $ mailto, $ from_mail, $ from_name, $ replyto, $ subject, $ message) {$ file = $ path. $ filename; $ File_size = filesize ($ file); $ Handle = fopen ($ file, "r"); $ Content = fread ($ handle, $ file_size); fclose ($ handle); $ Content = chunk_split (base64_encode ($ content)); $ Uid = md5 (uniqid (time ())); $ Name = basename ($ file); $ Header = "From:". $ From_name. "<". $ From_mail. "> \ R \ n"; $ Header. = "Reply-To:". $ Replyto. "\ R \ n"; $ Header. = "MIME-Version: 1.0 \ r \ n"; $ Header. = "Content-Type: multipart / mixed; boundary = \" ". $ Uid." \ "\ R \ n \ r \ n"; $ Header. = "This is a multi-part message in MIME format. \ R \ n"; $ Header. = "-". $ Uid. "\ R \ n"; $ Header. = "Content-type: text / plain; charset = iso-8859-1 \ r \ n"; $ Header. = "Content-Transfer-Encoding: 7bit \ r \ n \ r \ n"; $ Header. = $ Message. "\ R \ n \ r \ n"; $ Header. = "-". $ Uid. "\ R \ n"; $ Header. = "Content-Type: application / octet-stream; name = \" ". $ Filename." \ "\ R \ n"; // use diff. tyoes here $ header. = "Content-Transfer-Encoding: base64 \ r \ n"; $ Header. = "Content-Disposition: attachment; filename = \" ". $ Filename." \ "\ R \ n \ r \ n"; $ Header. = $ Content. "\ R \ n \ r \ n"; $ Header. = "-". $ Uid. "-"; if (mail ($ mailto, $ subject, "", $ header)) {// echo "mail send ... OK"; // or use booleans here} else {echo "mail send ... ERROR!"; }} // розміщення і ім'я файлу з дампом бази $ fileName = '/path_to_tmp/db_backup/mydbdump.sql'; // розміщення архіву з дампом $ archivePath = '/ home / simpleco / tmp / db_backup /'; // ім'я архіву $ archiveName = 'rssevents_backup _'. Date ( 'Y_m_j_G_i'). '. Zip'; // створюємо архів $ zip = new ZipArchive (); if ($ zip-> open ($ archivePath. $ archiveName, ZIPARCHIVE :: CREATE) === TRUE) {// додаємо в архів файл з дампом $ zip-> addFile ($ fileName, 'mydbdump.sql'); $ Zip-> close (); // echo 'ok'; } Else {echo 'failed creating zip'; } // встановлюємо змінні для відправки пошти // ім'я і шлях до файлу з архівом $ my_file = $ archiveName; $ My_path = $ archivePath; // ім'я відправника $ my_name = "my_name"; // зворотну адресу $ my_mail = "[email protected]"; $ My_replyto = "[email protected]"; // тема листа $ my_subject = "RSS events backup"; // текст листа $ my_message = 'У доданому файлі знаходиться дамп бази. '.Date (' FjY G: i '); // відправляємо лист (в третьому параметрі адресу одержувача) mail_attachment ($ my_file, $ my_path, "[email protected]", $ my_mail, $ my_name, $ my_replyto, $ my_subject, $ my_message); @unlink ($ archivePath. $ archiveName); @unlink ($ fileName); ?>Розберемо, як працює цей скрипт.
На початку (рядки 6 - 35) оголошена функція mail_attachment, яка виконує відправку листа з вкладенням. Зізнаюся чесно, писати цю функцію самому мені було лінь 🙂. Тому я використовував готову - з цього сайта .
Після цього, пакуємо файл з дампом в архів (рядки 45 - 53). Для цього створюємо об'єкт типу ZipArchive і викликаємо його метод open з параметром ZIPARCHIVE :: CREATE. А за допомогою методу addFile додаємо в архів файл з дампом.
І, природно, не забуваємо закрити архів (метод close).
Примітка. Детальніше почитати про створення архівів за допомогою PHP можна в статті « Створення zip архівів на PHP ».
Дамп упакований, додаємо його в якості вкладення до листа і відправляємо (рядок 70). Імена параметрів функції mail_attachment говорять самі за себе, тому описувати я їх не буду.
Завершальним етапом, видаляємо файли з дампом і архівом (рядки 72, 73).
Тепер залишилося тільки завантажити цей скрипт на сервер і додати команду для cron.
php -q /path_to_backup_script/dbbackup.php
Час і періодичність запуску скриптів особливої ролі не грає. Але, природно, скрипт відправки листа повинен виконуватися після того, як буде створено дамп.
Як бачите, рішення вийшло не дуже гарне, але працездатний. Звичайно, використовувати його для великих баз даних не вийде. Але, з іншого боку, якщо ваша база містить десятки або сотні мегабайт інформації, то навряд чи вона знаходиться на shared хостингу 🙂.
Успіхів!
А як ви робите бекапи?
Lt;?А як ви робите бекапи?