

**環境**  
・CentOS  
・MySQL 5.6 … パスワードはmysql_config_editorで設定  
・Linuxユーザ名 … test

* * *

**下記コマンドを実行したら、期待した通りファイルが作成されるのですが、**

[code]

    sh hoge.sh
    
[/code]

▼hoge.sh

> mysqldump --single-transaction -u データベースユーザ名 データベース名 >  
>  /home/test/バックアップディレクトリ名/ファイル名

* * *

**crontab経由で、shファイルを実行したら、サイズが0のファイルが作成され、dumpデータが取得できません**  
・cronのエラーメールも送られてきません(cronエラーではないから？)

>
[code]

>     1 15 * * * root /bin/bash /home/test/hoge.sh
>  
[/code]

* * *

**権限関連が原因のような気もするのですが、rootで実行したら何でもいけるわけではないのでしょうか？**

[code]

    ls -la
    
[/code]

> -rwxrwxrwx 1 test test 270 1月 19 14:52 2017 hoge.sh

* * *

**追記**  
・その後、色々試した結果、shファイルに記述しているコマンド内のmysqldumpにpオプションを付与すれば、crontab経由からも正常にファイル取得できることがわかりました  
・しかし、mysql_config_editorを使用することで、コマンドからパスワード指定しなくてもログインできるよう設定しているのですが、この方式ではcrontab経由から、データ取得できないのでしょうか？  
・mysqldumpエラーをファイル出力しようと思い、「-r ファイル名」としたのですが、取得できませんでした

* * *

**再追記**

・現状をようやく確認できました(cron以前の問題？)  
・hoge.shをtestユーザとして直接実行すると、正常動作します  
・hoge.shをrootユーザとして直接実行すると、下記エラー発生

> mysqldump: Got error: 1045: Access denied for user 'test'@'localhost'  
>  (using password: NO) when trying to connect

・hoge.shのdumpコマンドにパスワードを付与してcron経由で(rootユーザとして)実行すると、正常動作します

・mysqlテーブルを「select * from user;」すると、rootユーザもtestユーザもいます。パスワードは同じです

[code]

    $ mysql_config_editor print --all
    
[/code]

[test]  
user = test  
password = *****  
host = localhost  
[mysqldump]  
user = root  
password = *****  
[root]  
user = root  
password = *****  
host = localhost

そもそも根本的なことが分かっていないのですが、shの実行権限が何であれ、MySQLにはsh内のmysqldumpコマンドで記述したデータベースユーザ名でアクセスするわけではないのでしょうか？「mysqldump
-u データベースユーザ名」


CC BY-SA 3.0
2017-01-19T06:16:08.417
31965
2018-07-11T05:19:37.203
2017-02-08T03:03:35.730
7886
7886
question
mysql linux shellscript sh
MySQLパスワードをmysql_config_editorで設定している場合、crontab経由で、shファイルを実行したときだけ、mysqldump結果のファイルサイズが0になるのですが


よく見たらユーザ名記載していますね……

`cron.d`で自動実行する処理については"root"の指定が出来るかと思いますが、  
`crontab`については`crontab`の実行ユーザの権限で処理が行われるため  
"root"で実行していない限り"root"の権限で処理は行えないはずです。

また、crontabはユーザ毎に実行したユーザが所有者でcrontabのファイルが作成されますが、  
上記のことからして、crontabファイルの権限を変えたりしてしまうとcronが実行されません。  
(セキュリティ的に当たり前ですよね)

色んなユーザの権限で複数処理したいなら"cron.d"に記載するか  
そもそもの実行権限を持つユーザでcrontabを編集するといいです。


CC BY-SA 3.0
2017-01-19T06:54:37.020
31971
2017-01-19T06:54:37.020
31965
answer


crontab から実行される環境では、`HOME=/` になっているため、/root/.my.cnf や /root/.mylogin.cnf
が読み込めないのではないでしょうか。  
hoge.sh に `export HOME=/root` と設定するとどうでしょうか。


CC BY-SA 3.0
2017-01-19T15:22:10.410
31993
2017-01-19T15:22:10.410
4603
31965
answer


`mysql_config_editor` で設定した内容は ~$HOME/.mylogin.cnf` に保存されます。

`root` で `mysqldump` 実行すると `/root/.mylogin.cnf`
を参照しようとしますが、このファイルが存在しないので、認証に失敗していると思います。

恐らく `mysql_config_editor` を設定したのが `test` ユーザだったというオチでは？と思いました。

> 1 15 * * * root /bin/bash /home/test/hoge.sh

crontab の 6番目のフィールドに `root` と書かれているので `hoge.sh` は root ユーザの権限で実行されています。これを
`test` に書き換えみてください。


CC BY-SA 3.0
2017-06-08T12:46:02.273
35404
2017-06-08T12:46:02.273
5008
31965
answer