День добрый, есть скрипт который бекапит базы mysql. столкнулся с такой проблемой, поломалась как-то база и скрипт бекап делал zero размер с ошибкой но, делал. Возник вопрос как проверять что команды выполнились без ошибки? А если есть ошибка отправить сообщение на email.
Вот сам скрипт:mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par1 | gzip -c > /var/backups/backup/mysql/par1-date "+%Y-%m-%d".sql.gz
mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par2 | gzip -c > /var/backups/backup/mysql/par2-date "+%Y-%m-%d".sql.gz
mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par3 | gzip -c > /var/backups/backup/mysql/par3-date "+%Y-%m-%d".sql.gz
mysqldump -uroot -hlocalhost -123456-dezS –default-character-set=cp1251 par4 | gzip -c > /var/backups/backup/mysql/par4-date "+%Y-%m-%d".sql.gz
#Удаляем файлы бекапов старше 7 дней tmpwatch -m 7d /var/backups/backup/mysql/
http://kedar.nitty-witty.com/blog/mysql-database-backup-shel...
> День добрый, есть скрипт который бекапит базы mysql. столкнулся с такой проблемой,
> поломалась как-то база и скрипт бекап делал zero размер с ошибкой
> но, делал. Возник вопрос как проверять что команды выполнились без ошибки?
> А если есть ошибка отправить сообщение на email.Придумыайте критерии по которым будете определять, удовлетворительно прошёл бекап или нет. Например:
- Ловите exit code выполнения mysqldump. Имейте в виду "что в лоб" вы получите exit code выполнения gzip а не mysqldump. Типа
set -o pipefail
mysqldump какие-то-параметры-чтобы-была-ошибка | gzip -c > par.sql.gz
echo $?- Если при типичной ошибке получается размер файла 0, то это может оказаться уже полезно. Типа
if [ $(wc -c < par.sql.gz) -le 0 ] ...- Смотрите на содежимое получившегося файла, например, на количество незакоментированных строк и/или наличие какого-нибудь кодового слова. Типа
if zcat par.sql.gz | wc -l ...
if zcat par.sql.gz | grep волшебное-словоНу и, как водится, пара непрошенных советов:
Не передавайте пароль mysqldump в командной строке, храните его в ~/.my.cnf или типа того.
Не лезте в базу из скрипта как root, создайте специального пользователя чтобы смог прочесть всё для бакапа из правильных баз, но не смог порочесть из неправильных или что-то испортить.Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение не только в случае ошибки, но и при успешном выполнении, пусть будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно и на каком именно месте ошиблся, и что именно пытался сделать.
>[оверквотинг удален]
> Ну и, как водится, пара непрошенных советов:
> Не передавайте пароль mysqldump в командной строке, храните его в ~/.my.cnf или
> типа того.
> Не лезте в базу из скрипта как root, создайте специального пользователя чтобы
> смог прочесть всё для бакапа из правильных баз, но не смог
> порочесть из неправильных или что-то испортить.
> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
> не только в случае ошибки, но и при успешном выполнении, пусть
> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
> и на каком именно месте ошиблся, и что именно пытался сделать.не могли бы написать для меня ибо я не очень в этом деле. в долгу не останусь!
mysqldump --any-dump-keys db > db.dump 2>/tmp/err
[ $? -eq 0 ] || cat "/tmp/err"
>[оверквотинг удален]
>> типа того.
>> Не лезте в базу из скрипта как root, создайте специального пользователя чтобы
>> смог прочесть всё для бакапа из правильных баз, но не смог
>> порочесть из неправильных или что-то испортить.
>> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
>> не только в случае ошибки, но и при успешном выполнении, пусть
>> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
>> и на каком именно месте ошиблся, и что именно пытался сделать.
> не могли бы написать для меня ибо я не очень в этом
> деле. в долгу не останусь!Прошу прощения Был в отчаянии.
>>[оверквотинг удален]
>> Воздержусь от описания собственно отправки на email. Однако порекомендую отправлять сообщение
>> не только в случае ошибки, но и при успешном выполнении, пусть
>> будет канарейкой. Включайте в сообщение достаточно информации, чтобы понять, кто именно
>> и на каком именно месте ошиблся, и что именно пытался сделать.
> не могли бы написать для меня ибо я не очень в этом
> деле. в долгу не останусь!Боюсь, что нет. Не мой бизнес.
Сделал - вроде работает.
email с авторизацией.
Вот код может пригодится кому.
#/bin/bashallerror=""
set -o pipefail
mysqldump -user -hlocalhost -password --default-character-set=cp1251 par1 | gzip -c > /var/backups/backup/mysql/par1-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
allerror="Backup базы par1 не выполнен\n"
fimysqldump -user -hlocalhost -password --default-character-set=cp1251 par2 | gzip -c > /var/backups/backup/mysql/par2-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
allerror="${allerror}Backup базы par2 не выполнен\n"
fimysqldump -user -hlocalhost -password --default-character-set=cp1251 par3 | gzip -c > /var/backups/backup/mysql/par3-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
allerror="${allerror}Backup базы par3 не выполнен\n"
fimysqldump -user -hlocalhost -password --default-character-set=cp1251 par4 | gzip -c > /var/backups/backup/mysql/par4-`date "+%Y-%m-%d"`.sql.gz
if [ $? -ne 0 ]; then
allerror="${allerror}Backup базы par4 не выполнен\n"
fiif [[ -n "$allerror" ]]; then
TMP=$(mktemp)
FROM_EMAIL_ADDRESS="откого@example.net"
TO_EMAIL_ADDRESS="кому@example.net"
EMAIL_SUBJECT="Тема письма"
SMTP="smtp.example.net:25"
FRIENDLY_NAME="User Name"
EMAIL_ACCOUNT_PASSWORD="smtp_password"cat > $TMP << EOF
EOFcat $TMP | \
echo -e $allerror | iconv -t UTF-8 | mailx -v \
-s "$EMAIL_SUBJECT" \
-S smtp-auth=login \
-S smtp=${SMTP} \
-S from="${FROM_EMAIL_ADDRESS}(${FRIENDLY_NAME})" \
-S smtp-auth-user=$FRIENDLY_NAME \
-S smtp-auth-password=$EMAIL_ACCOUNT_PASSWORD \
$TO_EMAIL_ADDRESS[ -e $TMP ] && rm $TMP
fi
> Сделал - вроде работает.Замечательно.
Там ещё много стружки можно снять.
Имейте в виду, что если вы запускаете скрипт из Cron, то этот сервис сам умеет слать почту. Таким образом, в скрипте можно не возиться с настройкой и запуском mailx, а просто писать диагностику на стандартный вывод (stdout). Cron это подхватит, завернёт и скормит системному почтовику. Заодно пометит, если возвращённый код отличается от нуля.
>> Сделал - вроде работает.
> Замечательно.
> Там ещё много стружки можно снять.
> Имейте в виду, что если вы запускаете скрипт из Cron, то этот
> сервис сам умеет слать почту. Таким образом, в скрипте можно не
> возиться с настройкой и запуском mailx, а просто писать диагностику на
> стандартный вывод (stdout). Cron это подхватит, завернёт и скормит системному почтовику.
> Заодно пометит, если возвращённый код отличается от нуля.Спасибо за наводку.