簡易的なMySQLのバックアップスクリプト(シェル)を紹介します。
バックアップのスクリプト
バックアップのスクリプトは以下になります。
※Ubuntu 22.04.2 LTSで動作確認しています。
#!/bin/bash
# Shell script to backup MySQL database
echo "----- MySQL backup start at $(date +'%Y-%m-%d %H:%M:%S') -----"
# DB情報
HOST="ホスト名" # ローカルならlocalhost
DB="データベース名"
USER="ユーザ名"
# バックアップ先
DEST="$HOME/backups/db" # /home/username/backups/db
# バックアップのリモートアップロード先
REMOTE_SERVER="remote-server" # .ssh/configで該当サーバにsshログインできることを確認してください。
REMOTE_PATH="backups/db/" # リモートのディレクトリ、この場合は/home/username/backups/db
# バックアップの保存期間
DAYS=60
# コマンドパス取得
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
# バックアップファイル日付フォーマット: yyyy-mm-dd_UnixTime
NOW="$(date +"%Y-%m-%d_%s")"
# バックアップ用ディレクトリ作成
MBD="$DEST/$NOW/mysql"
install -d $MBD
# DBダンプ
FILE="$MBD/$DB.sql"
$MYSQLDUMP --defaults-extra-file=$HOME/.mysql_conf --no-tablespaces\
-h $HOST -u $USER $DB > $FILE
# ダンプファイルを圧縮
cd $DEST
tar -cf $NOW.tar $NOW
$GZIP -9 $NOW.tar
# リモートにアップロード
ssh ${REMOTE_SERVER} mkdir -p ${REMOTE_PATH}
scp $NOW.tar.gz ${REMOTE_SERVER}:${REMOTE_PATH}
echo "MySQL backup is completed! Backup name is $NOW.tar.gz"
rm -rf $NOW
# 古いバックアップを削除
find $DEST -mtime +$DAYS -exec rm -f {} \;
echo "Remote old files (begin)"
ssh ${REMOTE_SERVER} "find backups/mba12/db/* -type f -ctime +$DAYS -exec echo {} \;"
echo "Remote old files (end)"
ssh ${REMOTE_SERVER} "find backups/mba12/db/* -type f -ctime +$DAYS -exec rm -rf {} \;"
echo "----- MySQL backup end at $(date +'%Y-%m-%d %H:%M:%S') -----"
MySQLのパスワード設定
MySQLのバージョン8で試してみたところ、mysqldumpの引数として直接パスワードを渡すと、セキュリティ警告が出ます。
そのため、ホームディレクトリ配下で、.mysql_conf
を作成して次のようにパスワードを設定します。
[client]
password=バックアップスクリプトに指定したMySQLユーザのパスワード
最後に次のように.mysql_conf
の権限を設定してあげます。
$ chmod 400 ~/.mysql_conf # 変更や追加する可能性があれば、600に設定したほうがよいかと。
ここでは、$HOME/scripts/
に置くとします。
これでスクリプトは動作できるはずですので、次のコマンド実行してバックアップされるか、リモートにもアップロードされるかを確認してみてください。
$ sh $HOME/scripts/db_backup.sh
crontabの設定
cronの設定は例として次のように毎日朝4時に実行するように設定します。
スクリプトの出力は$HOME/scripts/db_backup.log
に保存します。
$ crontab -e
0 4 * * * sh $HOME/scripts/db_backup.sh >> $HOME/scripts/db_backup.log 2>&1
終わりに
これで毎日朝4時にバックアップされるはずですが、いかがでしょうか。
古いバックアップは削除されるかの確認するには、スクリプトの保存期間設定値でDAYS
を0とかに変えてみると、バックアップしたばかりのものでも削除されるとはずですので、確認してみてください。
ちなみに、参考3に次のようなコマンドで古い日付のファイルを作成してみましたが、確かにlsで見たら日付古いですが、何故かfindコマンドでは見つかりませんでした。
ご存知の方はコメントいただけると嬉しいです。
$ touch -d "2 hours ago" filename
$ touch -a -m -t 201512180130.09 fileName.ext
このバックアップスクリプトには、次の改善点があると思います。
- ログローテーション
$HOME/scripts/db_backup.log
にログを溜めてますが、ログローテーションの対象に入れたほうがいいでしょう。 - メール送信
サーバ自体が死んでも、外部にアップロードされているので、全くデータが取れなくなる事態は避けられるかと思いますが、postfixとか入れてバックアップできたことをメールで通知するといいと思われます。
コメントを残す