Mysqldump & gzip для правильного создания сжатого файла базы данных MySQL с использованием crontab

У меня возникают проблемы с работой crontab. Я хочу автоматизировать резервное копирование базы данных MySQL.

Настройка:

  • Debian GNU/Linux 7.3 (wheezy)
  • Версия сервера MySQL: 5.5.33-0 + wheezy1 (Debian)
  • каталоги пользователей, резервное копирование и резервное копирование2 имеют разрешение 755
  • Имена пользователей для MySQL db и учетной записи Debian одинаковы

Из оболочки эта команда работает

mysqldump -u user -p[user_password] [database_name] | gzip > dumpfilename.sql.gz

Когда я помещаю это в crontab, используя crontab -e

* * /usr/bin/mysqldump -u user -pupasswd mydatabase | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/dev/null 2>&1

Файл создается каждую минуту в каталоге /home/user/backup, но имеет 0 байт.

Однако, когда я перенаправляю этот вывод во второй каталог, backup2, я замечаю, что в нем создается надлежащий файл mysqldumpfile, должным образом сжатый. Я не могу понять, что является ошибкой, которую я делаю, что приводит к 0-байтовому файлу в первом каталоге и ожидаемом выходе во втором каталоге.

* * /usr/bin/mysqldump -u user -pupasswd my-database | gzip> /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz >/home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

Я очень благодарен за объяснение.

Спасибо

Ответ 1

Сначала выполняется команда mysqldump, и полученный результат перенаправляется с использованием этого канала. Труба отправляет стандартный вывод в команду gzip в качестве стандартного ввода. Следуя filename.gz, это оператор перенаправления вывода ( > ), который будет продолжать перенаправление данных до последнего имени файла, в котором будут сохранены данные.

Например, эта команда будет выгружать базу данных и запускать ее через gzip, и данные, наконец, приземляются в трех .gz

mysqldump -u user -pupasswd my-database | gzip > one.gz > two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 one.gz
-rw-r--r--  1 uname  grp  1246 Mar  9 00:37 three.gz
-rw-r--r--  1 uname  grp     0 Mar  9 00:37 two.gz

Мой первоначальный ответ - пример перенаправления дампа базы данных на многие сжатые файлы (без двойного сжатия). (Поскольку я просмотрел вопрос и серьезно пропустил - извините за это)

Это пример повторного сжатия файлов:

mysqldump -u user -pupasswd my-database | gzip -c > one.gz; gzip -c one.gz > two.gz; gzip -c two.gz > three.gz

$> ls -l
-rw-r--r--  1 uname  grp  1246 Mar  9 00:44 one.gz
-rw-r--r--  1 uname  grp  1306 Mar  9 00:44 three.gz
-rw-r--r--  1 uname  grp  1276 Mar  9 00:44 two.gz

Это хороший ресурс, объясняющий перенаправление ввода-вывода: http://www.codecoffee.com/tipsforlinux/articles2/042.html

Ответ 2

Вы можете использовать команду tee для перенаправления вывода:

/usr/bin/mysqldump -u user -pupasswd my-database | \
tee >(gzip -9 -c > /home/user/backup/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz)  | \
gzip> /home/user/backup2/mydatabase-backup-`date +\%m\%d_\%Y`.sql.gz 2>&1

см. документацию здесь

Ответ 3

если вам нужно добавить дату на свое имя файла резервной копии (Centos7), используйте следующее:

/usr/bin/mysqldump -u USER -pPASSWD DBNAME | gzip > ~/backups/db.$(date +%F.%H%M%S).sql.gz

это создаст файл: db.2017-11-17.231537.sql.gz

Ответ 4

Лично я создал файл .sh (справа 755) в корневом каталоге, файл, который выполняет эту работу, по заказу crontab.

Код Crontab:

10 2 * * * root/root/backupautomatique.sh

Код File.sh:

rm -f/home/mordb-148-251-89-66.sql.gz # (чтобы стереть старый)

mysqldump mor | gzip>/home/mordb-148-251-89-66.sql.gz (что вы сделали)

scp -P2222/home/mordb-148-251-89-66.sql.gz root @otherip: /home/mordbexternes/mordb-148-251-89-66.sql.gz

(чтобы отправить копию куда-то еще, если отправляющий сервер падает, потому что слишком старый, как я ;-))

Ответ 5

Всякий раз, когда я пытаюсь запустить mysql dump с помощью gzip, он просто создает действительно маленький файл размером 20 байт, а затем файл.sql внутри равен 0 байт. Если я не использую gzip, это работает. Я работаю в Ubuntu 16.04. Что здесь не так? я попробовал все примеры онлайн то же самое.