it-roy-ru.com

mysqldump не работает в crontab

Я пытаюсь добавить cronjob в crontab (сервер Ubuntu), который выполняет резервное копирование базы данных mysql.

Выполнение скрипта в терминале от имени root работает хорошо, но при вставке в crontab ничего не происходит. Я пытался запускать его каждую минуту, но в папке/var/db_backups нет файлов.

(Другие cronjobs работают хорошо)

Вот cronjob:

* * * * * mysqldump -u root -pHERE THERE IS МОЙ ПАРОЛЬ --all-базы данных | gzip>/var/db_backups/database_`date +% d% m% y`.sql.gz

в чем может быть проблема?

15
xspecial

Вы должны экранировать символ% с помощью \

mysqldump -u 'username' -p'password' DBNAME > /home/eric/db_backup/liveDB_`date +\%Y\%m\%d_\%H\%M`.sql
59
The Java Guy

Проверьте журналы cron (должны быть в/var/log/syslog). Вы можете использовать grep для их фильтрации.

grep CRON/var/log/syslog

Также вы можете проверить свой локальный почтовый ящик, чтобы увидеть, есть ли какие-либо cron письма 

/ Вар/почта/имя пользователя 

Вы также можете настроить другую получающую почту в вашем файле crontab

[email protected]

5
adam187

Я пытался сделать то же самое, но обнаружил, что дамп был создан с 0 КБ. Следовательно, я узнал о решении, которое сэкономило мое время.

Команда:

0 0 * * * mysqldump -u 'USERNAME' -p'PASSWORD' DATEBASE > /root/liveDB_`date +\%Y\%m\%d_\%H\%M\%S`.sql

ПРИМЕЧАНИЕ: 1) Вы можете изменить настройку времени в соответствии с вашими требованиями. Я поставил каждый день в вышеупомянутой команде.

2) Убедитесь, что вы вводите свое ИМЯ ПОЛЬЗОВАТЕЛЯ, ПАРОЛЬ и БАЗУ ДАННЫХ внутри одинарной кавычки (').

3) Запишите указанную выше команду в Crontab.

Я надеюсь, что это помогает кому-то.

2
Krupal Patel

В качестве альтернативы вы можете создать собственную команду mycommand . К которому вы можете добавить больше вариантов. Вы должны дать разрешения на выполнение.

Предпочтительно иметь папку, в которой хранятся все ваши резервные копии, в этом случае используется перезаписываемая папка «backup», которую сначала создают, например, в «вашем доме».

Моя команда в "usr/local/bin/mycommand":

#!/bin/bash
MY_USER="your_user"
MY_PASSWORD="your_pass"
MY_HOME="your_home"
case $1 in 
"backupall")
    cd $MY_HOME/backup
    mysqldump --opt --password=$MY_PASSWORD --user=$MY_USER  --all-databases > bckp_all_$(date +%d%m%y).sql
    tar -zcvf bckp_all_$(date +%d%m%y).tgz bckp_all_$(date +%d%m%y).sql
    rm bckp_all_$(date +%d%m%y).sql;;
*)  echo "Others";;
esac

Cron: Запускается 1-го числа каждого месяца.

0 0 1 * * /usr/local/bin/mycommand backupall

Надеюсь, это поможет несколько.

1
alditis

Создайте новый файл и выполните там код, чтобы поместить его в папку и заархивировать его. Запустите этот скрипт через cron

0
user3277973

Я использую Percona Server (MySQL форк) в Ubuntu. Пакет (очень вероятно, обычный пакет MySQL) поставляется с учетной записью обслуживания под названием debian-sys-maint. Для использования этой учетной записи учетные данные создаются при установке пакета; и они хранятся в /etc/mysql/debian.cnf.

И теперь сюрприз: также устанавливается символическая ссылка /root/.my.cnf, указывающая на /etc/mysql/debian.cnf.

Этот файл файл опций читается автоматически при использовании mysql или mysqldump. Таким образом, в основном вы затем дважды вводили учетные данные - в этом файле и в командной строке. Это была моя проблема.

Поэтому одним из способов избежать этого условия является использование параметра --no-defaults для mysqldump. Файл параметров не будет прочитан. Однако вы предоставляете учетные данные через командную строку, поэтому любой, кто может выдать ps, сможет увидеть пароль после запуска резервного копирования. Поэтому лучше всего создать собственный файл параметров с именем пользователя и паролем и передать его в mysqldump через --defaults-file .

Вы можете создать файл опций, используя mysql_config_editor или просто в любом редакторе.

Запуск mysqldump через Sudo из командной строки как root работает только потому, что Sudo обычно не меняет $HOME, поэтому .my.cnf тогда не найден. Когда работает как cronjob, это так.

0
Shi

Хорошо, у меня была похожая проблема, и я смог ее исправить.

В вашем случае вы можете вставить эту команду mysqldump в сценарий , А затем получить профиль пользователя, который выполняет команду mysqldump Например, для: 

. /home/bla/.bash_profile

затем используйте абсолютный путь к команде mysqldump

/usr/local/mysql/bin/mysqldump -u root -pHERE THERE IS MY PASSWORD --all-databases | gzip > /var/db_backups/database_`date +%d%m%y`.sql.gz
0
niroshan.l