Linux一覧

【Linux/MySQL】データベースのバックアップを毎日自動的に取得する仕組みの実装

MySQLのバックアップにmysqldumpを利用している方は多いかと思います。
既に公開・運用しているWEBサービスやブログサイトの場合、バックアップを取得して復元できるように備えておくことは非常に重要です。

この際、バックアップはできるだけ細かく、かつ自動的に取得されることが望ましいでしょう。
また、自動実行の仕組みを作った場合、古いバックアップが蓄積されすぎないように適切なタイミングで削除する必要も発生します。

この記事では、mysqldumpを使ったバックアップ取得と世代管理をスクリプト化し、スケジュールに従って自動実行させる方法をご紹介します。
スケジュール管理にはcrontabを使用します。

バックアップの取得と世代管理を行うスクリプトの作成

早速バックアップ処理のスクリプトを作成します。

ここでは、/var/backup/shというディレクトリを作成し、その中にmysql-backup.shというファイルを作成することにしてみましょう。
また、バックアップファイルの出力先ディレクトリは/var/backup/mysql-dumpとします。

#!/bin/sh

# -------------------------------------------------------
#
# [環境設定]
#

# バックアップファイルを保存するディレクトリパス
dirpath='/var/backup/mysql-dump'

# バックアップを保存する日数
period=14
# -------------------------------------------------------

#
# [バックアップ取得処理]
#
# ファイル名を定義  ※「mysql-dump-yymmdd.sql」となるようにします
fileprefix="mysql-dump-"
filedate=`date +%y%m%d`
filename=$fileprefix$filedate

# mysqldumpを実行しdumpファイルを出力
mysqldump --opt --password=[パスワード] [ユーザ名] > $dirpath/$filename.sql

# 出力されたdumpファイルのパーミション変更
chmod 700 $dirpath/$filename.sql

#
# [ローテーション処理]
#
# 削除対象年月日を取得
olddate=`date --date="$period days ago" +%y%m%d`

# 削除対象ファイル名を生成
oldfile=$fileprefix$olddate

# 削除実行
rm -f $dirpath/$oldfile.sql

各ステップにコメントを入れていますので、それぞれ何を行っているかは理解できるかと思います。
[環境設定]の値はバックアップ要件にあわせて書き換えてください。

それではスクリプトが期待通りに動作するか、試しに実行してみましょう。
dumpファイルが出力され、パーミションが700に変更されていれば成功です。

# sh /var/backup/sh/wp-backup.sh
# ls -l /var/backup/wp-dump
-rwx—— 1 root root 6298699 5月 26 07:24 mysql-dump-190526.sql

crontabへのスケジュール登録

定時実行はcrontabで行います。

[crontab]
コマンドの定時実行のスケジュール管理を行うために用いられるコマンド。
Windowsのタスクスケジューラようなもの。

crontabコマンドに-e オプションをつけて実行すると、コマンドの実行スケジュールを登録できます。
先ほど作成したスクリプトファイルの実行スケジュールを登録しましょう。

# crontab -e

# 午前2時にmysqlバックアップを実行する
00 2 * * * /var/backup/sh/mysql-backup.sh

「00 2 * * *」の部分がスケジュールの設定になっています。
左から順に「分」「時」「日」「月」「曜日」の5項目を指定でき、指定しない項目にはアスタリスク(*)を記述します。

アスタリスク(*)がスケジュールの設定になっていて、左から順に「分」「時」「日」「月」「曜日」を指定できます。
時間は0-23で指定します。
曜日は日曜日なら0または7を指定し、月~土曜日は1-6にそれぞれ対応しています。

先ほどの例では毎日午前2時にスクリプトを実行するよう設定しましたが、週ごとや月ごとに実行させることも可能です。
以下の設定例をご参考ください。

# (例) 毎週土曜日の午前0時に実行する場合
00 0 * * 6 /var/backup/sh/mysql-backup.sh

# (例) 毎月15日の午後11時30分に実行する場合
30 23 15 * * /var/backup/sh/mysql-backup.sh

終わりに

以上で、毎日dumpの取得と古いデータの削除を行う最低限のバックアップの仕組みをつくることができました。
WEBサイトの規模が小さくリスクが少ないうちは、このようにコストと手間がかからない簡易なバックアップでも充分だと思います。
ぜひご活用ください。