💽

バックアップのbashスクリプトを設置しよう

2022/12/04に公開

まえがき

エンジニアにとって、一番悩むのがバックアップです。やるのか?やらないのか?
やらないとだめです。やらないとダメなのに、僕らは必ずやるかやらないか悩みます。

たまのタスクなので、毎回忘れる

サーバの設定は手順書、Docker、サーバ屋さんのバックアップサービス使うとして...

データベースとソースは極力スタンプが欲しいものです。
ソースは軽量であればgithubでバージョン管理されています。
なので、焦点は

  • 画像、動画などのソース
  • DBのダンプ

です。

それを定期バッチで処理すればOK。どう戻すかって問題もあります。

bashの書き方。

まずは1行目に

#!/bin/bash

改行はunix用のLFでないとエラーがでます。
複数行のコメントアウトは覚えにくいので毎回先頭に「#」でコメントを残します。

#!/bin/bash

# 4時間おきにDBをdumpする
#
# 0 */4 * * * sh /_path_/_file_.sh 2>&1

で、日時をぶっこみたい

#!/bin/bash

# 4時間おきにDBをdumpする
#
# 0 */4 * * * sh /_path_/_file_.sh 2>&1

DATE=`date +%Y%m%d-%H:%M`

変数は別に使わなくともいいので直書きにします

#!/bin/bash

# 4時間おきにDBをdumpする
#
# 0 */4 * * * /_path_/_file_.sh 2>&1

mysqldump -u USER -p'PASSWORD' DBNAME > /_path_/mysqldump.`date +%Y%m%d-%H:%M`.sql

これをコメントアウトにあるようにcrontabに記述します。
今回は4時間おきです。DBが軽いので、刻んでdumpしています。

特定のソースをコピーする

つづいてはgithubにコミットできないサイズのソース類。

#!/bin/bash

# 4時間おきにソースをcopyする
#
# 0 */4 * * * /_path_/_file_.sh 2>&1

DATE=`date +%Y%m%d-%H:%M`

重いソースのcpは時間がかかります。ここらへんはテストしてケースバイケースで実施するといいと思います。たとえば圧縮させてーとか、日付でアーカイブしていれば、ごく一部をバックアップすればいいかもですね。時間帯や曜日でバックアップを分割してもいいでしょう。rsyncにすれば差分だけになりますが、タイムスタンプにならないので、土曜日ミスって日曜日ミスを保存みたいになったら10年後笑って話す酒の肴です。

#!/bin/bash

# 4時間おきにソースをcopyする
#
# 0 */4 * * * /_path_/_file_.sh 2>&1

DATE=`date +%Y%m%d-%H:%M`

mkdir /_path_/$DATE
cp -aR /_path_/_dir_ /_path_/$DATE

今回のケースでは数十分程度でコピーが終わる程度の規模なので数時間おきにバンバンスタンプを残します。容量についてはオブジェクトストレージが一般化してきたので、便利な時代になりました。

path, dir, file は環境に合わせて記述してください。

Discussion