背景

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に読み込ませるジョブも走らせた方が安心ですが、まあ今はいいや。