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' のアクセスが拒否されました (パスワード使用: NO)
mysql のログイン資格情報は /root/.my.cnf に保存されているため、コマンド ラインからスクリプトを root として正常に実行できます。何が問題なのでしょうか? 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 サーバーと対話するスクリプトの実行も、権限のないユーザーで実行する必要があります。