背景
Mysqlをデータベースにしてサービスを運営している。 しかし現在、Mysqlのバックアップは取っておらず、元データが消えたら全データが消える状況である。 そこで、元サーバで毎日指定された時刻にmysql_dumpをし、バックアップサーバが元サーバからデータを持ってく量なcronジョブ を作りたいと思っている。
注意点としては、本番サーバはグローバルに、バックアップ鯖はローカルネットワークにいるので、グローバルからローカルには送れないってこと。(vpnとか貼ったらいけるけどめんどい)ので、バックアップサーバもcronでscpを動かして定期的に鶏肉という感じ。
AC
毎日元サーバから吐かれたmysqldumpファイルがバックアップサーバに置かれた状態になっている
関連技術
cron
設定ファイル
/var/spool/cron/crontabs/<user name>
が設定ファイルです。 rootユーザ用のcronを設定する方法は、
sudo vim /var/spool/cron/crontabs/root
って感じで開けます。 このファイルに実行したいジョブと実行日時(実行間隔も指定可能)を指定します。
0 * * * * /home/backup.sh
五つの*が何を表すかですが、 「分 時 日 月 曜日」
結構忘れがちなのが、シェルスクリプトのパーミッションでexecuteが入ってなくてエラーになることが多いので気をつけて。(上の/home/backup.sh)
ログについて(ubuntu)
デフォルトではログが出力されないようになっている。 こちらを参考にログを出力するように設定を変える
vi /etc/rsyslog.d/50-default.conf
# コメントアウト
cron.* /var/log/cron.log
# リスタート
service rsyslog restart
mysqldump
参考文献
上のによると、特定のユーザが持っているデータベースをダンプする方法は以下のようになるかな。
mysqldump -u hoge -p -B some_database > database.sql
ちなみに、パスワードの入力まで自動でやるとするとこんな感じです。
0 21 * * * mysqldump -u -hogehoge --password="hogehoge" --no-tablespaces DB_NAME > /hoge/database.sql
毎日21:01にSCPでとってくるcron jobをしくむ。さらにdbへの流し込みもやってくれると最高だよね〜。
まず、scpでpasswordを打たなくていいように鍵をリモートサーバに登録
sudo vim /etc/ssh/sshd_config
# 以下をコメントアウト
PubkeyAuthentication yes
ssh-keygenで秘密鍵と公開鍵を生成
パスフレーズを入れないのがポイント
sshできるか確認
ssh -i /home/hoge/.ssh/id_rsa_hoge root@hoge
入れる。
scpで持ってくる
scp -i /home/hoge/.ssh/id_rsa_hoge -P 9999 root@xxx.xxx.xxx.xxx:/hoge/database.sql ~/hoge/
問題なく持って来られる。 ということであとはcron jobを立てるだけか。
## cronでログを出すようにする&cronジョブを立てる&実際に見てみる
hoge@hoge:~$ sudo vim /etc/rsyslog.d/50-default.conf
[sudo] password for ray:
hoge@hoge:~$ sudo systemctl restart rsyslog
# うえのscpを入れる
sudo vim /var/spool/cron/crontabs/root
# ログを見る
ray@evn:~$ cat /var/log/cron.log
Sep 28 20:00:01 evn cron[1108]: (root) INSECURE MODE (mode 0600 expected) (crontabs/root)
で怒られたので、permitionを変更する
sudo chmod 600 /var/spool/cron/crontabs/root
で、ちゃんとcronでバックアップが取れるようになった。いいですね。
完成系
db本ちゃん側
0 */6 * * * mysqldump -u hoge --password="hoge" --no-tablespaces hoge > /hoge/database.sql
バックアップ側
1 */6 * * * scp -i /home/ray/.ssh/id_rsa_hoge -P xxxx root@xxx.xxx.xxx.xxx:/hoge/database.sql /home/hoge/hdd/
完璧や!! まあ、あとは自動でmysqlに読み込ませるジョブも走らせた方が安心ですが、まあ今はいいや。