crontabでrsync

MySQLのバックアップをとるのに、ローカル外付けHDDだけでは心許ないので、ネットワーク上の物理的に離れたコンピュータ上にバックアップをとりたいと思い、

 

mysql_backup.shという名前の下記の内容のシェルスクリプトを作り、

 

/usr/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=******** | gzip > $dirpath/$filename.sql.gz
/usr/bin/rsync -avr /mnt/external_2TB/mysql_backup/ 192.168.1.23:/data/mysql_backup
/usr/bin/rsync -avr /mnt/external_2TB/mysql_backup/ 192.168.1.135:/mnt/external_3TB/mysql_backup

 

sudo crontab -e

で最後に

0 3 * * * /home/honya/mysql_backup.sh

を追加したところ、ローカルバックアップはできるのだけれど、どうしてもネットワーク先では自動的にバックアップされない。

しかし、普通に

sh mysql_backup.sh

とやればネットワーク上でのバックアップができる。色々調べてcronでは実行ファイルをフルパスで指定しなくてはならない等書いてあったので上記のようにフルパスにしてみたりしたが、ダメ。再度調べてみて、やはり同じような問題で悩んでいる書き込みを見て、ログインユーザの問題ということが分かった。つまり、honyaでログインしていて、

./mysql_backup.sh

を実行すると、192.168.1.23、192.168.1.135にはhonyaでログインできるように設定されているのだけれど、crontabはroot権限で実行されるのでうまくいかないのだ、と。

そのため、

sudo su

でrootでログインし、

ssh-keygen

でキーを作成し、

cd /root

scp .ssh/id_rsa.pub honya@192.168.1.23

 

ssh honya@192.168.1.23

 

cat id_rsa.pub >> .ssh/authorized_keys

 

でキーをコピー。これを192.168.1.135に対しても行い、mysql_backup.shを

 

/usr/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=******** | gzip > $dirpath/$filename.sql.gz
/usr/bin/rsync -avr /mnt/external_2TB/mysql_backup/ honya@192.168.1.23:/data/mysql_backup
/usr/bin/rsync -avr /mnt/external_2TB/mysql_backup/ honya@192.168.1.135:/mnt/external_3TB/mysql_backup

 

のように書き換えてようやくネットワーク越しのバックアップもできるようになった。