it-roy-ru.com

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

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

Настройка:

  • Debian GNU/Linux 7.3 (wheezy) 
  • Версия MySQL Server: 5.5.33-0 + wheezy1 (Debian) 
  • каталоги user, backup и backup2 имеют разрешение 755
  • Имена пользователей для базы данных MySQL и учетной записи 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

Я был бы очень признателен за объяснение.

Спасибо

58
user3397547

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

Например, эта команда выгрузит базу данных и запустит ее через gzip, и данные, наконец, попадут в three.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

78
m79lkm

Вы можете использовать команду 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

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

8
m79lkm

если вам нужно добавить дату-время к имени вашего файла резервной копии (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

3
Unmesh

Лично я создал файл.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 

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

www.tikvamal.org

0
Jean-Marc Lambert