Понадобился на днях скрипт, делающий слепок базы данных сайта, и отправляющий его по почте. Готовые рабочие варианты искать было некогда :-)
Системные требования:
- linux
- php
- mysql с установленной утилитой mysqldump
- sendmail, доступный из php
- gzip (можно и без него, тогда убрать из файла строки «| gzip» и «.gz»)
В целях минимизации, сторонние библиотеки для работы с почтой и вложениями решил не использовать, всё сурово.
Сначала сделаем бекап, и сожмём его
$dump = `mysqldump --add-locks -u <username> -p<password> <database> | gzip`;
(замените <username>, <password>, и <database> на свои)
Обратные кавычки « в php — синоним функции shell_exec()
Теперь, сформируем заголовок письма с вложением
$header = 'From: Server Robot <robot@server.ru>\r\n'.
.'MIME-Version: 1.0\r\n'.
'Content-type: multipart/mixed; boundary=sqldump0001";
И само сообщение, включающее в себя строку «This is a database backup» и файл.
Сжатый gzip-ом дамп кодируется функцией base64 и разбивается на строки одинаковой длины.
Стандарты e-mail не позволяют отправлять файлы больше 25 Мб., поэтому, если база очень большая, этот скрипт надо дописывать.
В моём же случае сжатый архив не превышал 50 килобайт.
$message = "--sqldump0001\r\n".
."Content-Type: text/plain; charset=ISO-8859-1\r\n\r\n".
."This is a database backup\r\n\r\n".
."--sqldump0001\r\n".
."Content-Type: application/octet-stream; name=\"dreamrace.sql\"\r\n".
."Content-Disposition:attachment; filename=\"dreamrace.sql\"\r\n".
."Content-Transfer-Encoding:base64\r\n\r\n";
$message.= chunk_split(base64_encode($dump));
и, наконец, отправим всё по почте:
mail("<your_email>", "Server Database Backup", $message, $header );
Готовый скрипт(скачать целиком его можно тут: http://shattl.org/files/mysqlbackup.zip ) помещается в папку /etc/cron.daily и выставляются права на запуск.
Всё готово!