Файл задания cron:
46 13 * * * корень /home/tmp/test_mysql.sh
сценарий:
выполнить_запрос(){ запрос="$1" res=`mysql --skip-column-names -e "$query"` эхо "$res" } res=`execute_query "показать базы данных"` эхо $res
Ошибка, которую я получил, когда задание cron успешно выполнило скрипт:
ОШИБКА 1045 (28000): Доступ запрещен для пользователя 'root'@'localhost' (использован пароль: НЕТ)
Я могу успешно выполнить скрипт из командной строки как пользователь root, потому что учетные данные для входа в mysql сохранены в /root/.my.cnf. В чем проблема? cronjob каким-то образом не читает /root/.my.cnf?
решение1
Вам не следует полагаться на то, что клиент MySQL выберет подходящий файл конфигурации MySQL из-закаскадная природатого, как клиент читает эти файлы. Вместо этого вы должны поместить оба my.cnf
и test_mysql.sh
внутри /home/tmp
и использовать --defaults-extra-file
[связь] параметр в вашем скрипте.
Обратите внимание, что --defaults-extra-file
потребности должны бытьпервыйаргумент вашей команды mysql, в противном случае она не будет работать.
execute_query(){
query="$1"
res=`mysql --defaults-extra-file=/home/tmp/my.cnf --skip-column-names -e "$query"`
echo "$res"
}
res=`execute_query "show databases"`
echo $res
/root
не очень хорошее место для хранения информации (разрешений и т. п.), и его следует избегать.
Запуск скриптов, взаимодействующих с сервером MySQL, также следует выполнять от имени непривилегированного пользователя.