19 марта, 2013

MySQL, Linux

Автоматический бэкап базы данных и сохраниение/отправка. И другие, пока страшные, словечки: shell, ssh, shell_exec, bash, mysqldump, mail, mailx, mutt, uuencode, base64, sendmail, curl, cron…

Доброго времени суток читатель! Ты нарвался на мою статью? Значит ты уже от безысходности тыкаешь на все ссылки который тебе выдает Google...

Если дома у тебя стоит windows и ты никогда не ставил linux, а хочется чтобы твои небольшие сайты "сохраняли сами себя" автоматически, и хотя бы некоторые сайты находятся на sweb.ru, то сразу дам ответ:

  1. на вебсервере создаем файл /cgi-bin/test.sh
  2. переносы строк в этом файле должны быть unux-овые - LF, а не CR LF (windows) - смотрите настройки вашего текстового редактора
  3. Записываем туда код:
#!/bin/bash
DBHOST=localhost
DBUSER=qsllogin
DBPASS=qslpassword
DBNAME=sqldbname
DBDATE=`date +%Y-%m-%d`

mysqldump --skip-opt --quick -u$DBUSER -h$DBHOST -p$DBPASS $DBNAME | gzip -c > $DBNAME-$DBDATE.gz

TO=youremail@gmail.com
SUBJECT=mysqldump
echo "Body message" | mutt -a $DBNAME-$DBDATE.gz -s "Subject" -- $TO
  1. права на файл выставляем 755 (rwxr-xr-x) Подробнее тут;
  2. настраиваем крон как вы хотите, все.

Это то, что у меня заработало, а да, кстати, у меня еще работал php скрипт с отправкой на Яндекс.диск, НО:

  • Хранить на сервере файлик с доступом к диску, и то есть – моей основной почте — нельзя (ИМХО)
  • А создавать для каждого сайта свою почту / Я.Диск чтобы хранить там дампы БД - ИМХО бред, сайтов больше 10…
  • Даже если создать только одну почту - то там будут все бд со всех ваших сайтов? =)

Так что я решил делать отправку на email (соответственно без хранения пароля на стороне сервера). Ну а кто хочет посмотреть как отправлять на яндекс диск, пожалуйста:

shell_exec("mysqldump --skip-opt --quick -u$dbuser -h$dbhost -p$dbpass $dbname | gzip -c > $dbname-$dbdate.gz");
shell_exec("curl --user $yadisk_email:$yadisk_pass -T $dbname-$dbdate.gz https://webdav.yandex.ru/$yadisc_dir");

Почти две строчки, и все работало:

#!/usr/local/bin/php
<?php
$dbhost = "...";
$dbuser = "...";
$dbpass = "...";
$dbname = "...";
$dbdate = date("Y-m-d-H-i-s");
shell_exec("mysqldump --skip-opt --quick -u$dbuser -h$dbhost -p$dbpass $dbname | gzip -c > $dbname-$dbdate.gz");
$yadisk_email='...';
$yadisk_pass='...';
$yadisc_dir='mysqldump/';
shell_exec("curl --user $yadisk_email:$yadisk_pass -T $dbname-$dbdate.gz https://webdav.yandex.ru/$yadisc_dir");
?>

А вот все то, что у меня не работало:

отправка письма из bash функцией sendmail - видимо пакет не установлен.
отправка письма из bash функцией mail с к кодированием вложения функцией uuencode — uuencode не работало...
bash mail + base64 — простите, работало, только файл был в теле письма а не "прикреплен", а декодировать вручную...
bash mailx меня тоже куда-то послал.

Впрочем если вы умеете на php отправлять файлы с вложением, то можно shell_exec(mysqldump + ваша отправка, но я почему-то решил, что отправка письма с вложением одной строчкой на bash - гораздо приятнее, чем в 10 строчек php

Удачи вам! Полезные ссылки:

bash/shell:

mysqldump:

PS: что ж за нафиг такой!!! на сервере руцентра (nic.ru):

mutt: command not found
man mutt
No manual entry for mutt

Ну да ладно, зато сработал:

( echo "body text message" ; echo ; cat $DBNAME-$DBDATE.gz | uuencode $DBNAME-$DBDATE.gz ) | mail -s $SUBJECT $TO

Если будете пользоваться последним скриптом отправки и слать на яндекс - файл будет в теле письма (куча кракозябр). Можно просто переслать в gmail , письмо окажется с вложением.


Добавить комментарий

2010–2018 Блог Максима Златова, контакты

PHP execution time: 0.0059 s.
SQL execution time: 0.0008 s. (select publication with comments)

Яндекс.Метрика