Хостинг-провайдерами часто надається послуга сховища для backup. Але коли справа доходить до практичного використання цього сховища, виявляється, що отримати туди доступ можна лише по протоколу FTP. Інший варіант: Ви хочете зберігати копію бази даних вашого сайту на незалежного майданчика, щоб убезпечити себе від випадку знищення даних в дата-центрі Вашого осногого хостингу. Можна замовити віртуальний хостинг початкового рівня, на який традиційно завантажуються файли за допомогою FTP. У цій статті розповідається, яким чином можна автоматично вивантажувати архів зі свіжої базою MySQL на сервер FTP та при цьому контролювати число таких архівів.
З міркувань безпеки краще всього завести окремий MySQL-екаунт з мінімальними правами. Щоб мати змогу користуватися mysqldump необхідні права: SELECT (вибірка даних) і LOCK TABLES (блокування таблиць). Під адміністративним Еккаунтом в командному рядку mysql
[Root @ myserver] # mysql -u root -p -h localhost
створимо такого користувача:
GRANT SELECT, LOCK TABLES ON mydatabase. * TO backuper @ localhost IDENTIFIED BY "PASSWORD";
FLUSH PRIVILEGES;
Ми надали такий доступ до всіх таблиць Вашої бази даних mydatabase новому користувачеві з логіном backuper і паролем PASSWORD. Хост бази даних вказано за замовчуванням, коли він розташований на тому ж сервері, що і машина, з якої ми будемо здійснювати доступ, - localhost. На віртуальному хостингу, швидше за все, це буде окремий хост. Друга команда необхідна для негайного вступу змін в силу, інакше сервер MySQL не буде нас пускати під новим користувачем.
Тепер створимо скрипт db_dump
[Root @ myserver] # cat> / root / db_dump
для вивантаження та архівування бази даних, такого змісту:
rm -f /root/db_dump.zip
mysqldump mydatabase -u backuper -pPASSWORD -r /root/db_dump.sql
zip /root/db_dump.zip /root/db_dump.sql
rm -f /root/db_dump.sql
(По закінченню введення натисніть Ctrl + D).
Цей скрипт підчищає попередній архів, який ми зберігаємо в папці / root /; викликає утиліту mysqldump для дампа всіх таблиць бази mydatabase під створеним нами користувачем backuper з паролем PASSWORD в файл /root/db_dump.sql; запаковує базу /root/db_dump.sql в архів /root/db_dump.zip; видаляє вихідний дамп.
Для того, щоб скрипт міг виконуватися, поставимо йому атрибут виконання:
[Root @ myserver] # chmod a + x / root / db_dump
Тепер перейдемо до найцікавішої частини - скрипту для завантаження і контролю архівів на FTP-сервері. Для цього ми будемо використовувати PHP з модулем ftp. Щоб дізнатися, чи цей модуль, потрібно виконати команду:
[Root @ myserver] # php -m | grep ftp
Якщо відобразилася рядок "ftp", все в порядку. В іншому випадку модуль необхідно підключити в файлі налаштувань PHP - /etc/php.ini.
Тепер створимо сам скрипт, який будемо називати db_to_ftp:
#! / Usr / bin / php
$ Host = "FTPHOST";
$ Login = "FTPUSER";
$ Password = "FTPPASSWORD";
$ Max_files_to_store = 24 * 7; // 7 days
if ($ fc = ftp_connect ($ host))
if (ftp_login ($ fc, $ login, $ password))
$ Curtime = time ();
$ Current_name = date ( "Y-m-d-H", $ curtime). "H.zip";
ftp_put ($ fc, "db /".$ current_name," /root/db_dump.zip ", FTP_BINARY);
foreach ($ archives as $ archive_id => $ archive_name)
if (preg_match ( "# ^ db / ([0-9]) - ([0-9]) - ([0-9]) - ([0-9]) H.zip $ # i", $ archive_name , $ matches))
$ Archives_list [] = array (
"Timestamp" => strtotime ($ matches [3]. ".". $ Matches [2]. ".". $ Matches [1]. "". $ Matches [4]. ": 00:00"),
"Filename" => $ archive_name
);
>
>
function time_sort ($ a, $ b)
return $ a [ "timestamp"]<$b["timestamp"];
>
// files to delete
$ Archives_list_to_delete = array_slice ($ archives_list, $ max_files_to_store);
foreach ($ archives_list_to_delete as $ file_id => $ file_item)
ftp_delete ($ fc, $ file_item [ "filename"]);
print "DELETED:". $ file_item [ "filename"]. "";
>
>
else
print "ERROR: can not login to $ host.";
>
ftp_close ($ fc);
>
else
print "ERROR: can not connect to FTP.";
>
?>
На сервері FTP необхідно створити папку db, де і будуть розміщуватися наші архіви. Всі необхідні настройки винесені в початок файлу. У змінній $ max_files_to_store зберігається максимальне число архівів на сервері. Поточне значення відповідає тижня повсякчасного резервування бази. А ми розберемо, що ж робить скрипт:
Як і годиться, встановлюємо права на цей скрипт:
[Root @ myserver] # chmod a + x / root / db_to_ftp
Тепер нам необхідно, щоб обидва скрипта виконувалися послідовно, наприклад, кожну годину. Для цього скористаємося планувальником завдань crond, внесемо в його розклад
[Root @ myserver] # crontab -e
0 * * * * / root / db_dump; / Root / db_to_ftp
Натискаємо Escape, вводимо ": wq" і бачимо повідомлення про успішне додаванні завдання в розклад.
Тепер в 0 хвилин кожної години з нашого MySQL-сервера вивантажуватиметься база даних, архівувати і відправлятися на FTP-сервер, а архіви, старше тижні будуть автоматично видалятися.
Update. На практиці виявлено, що на деяких серверах необхідно переходити в пасивний режим, тому необхідно виконати команду:
ftp_pasv ($ fc, true); Використовуйте її, якщо на сервері з резервних копій стали з'являтися порожні архіви. Швидше за все, серверу не вдається їх вивантажити.