簡易MySQLバックアップスクリプト

投稿日:

更新日:

カテゴリ:

簡易的な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

このバックアップスクリプトには、次の改善点があると思います。

  1. ログローテーション
    $HOME/scripts/db_backup.logにログを溜めてますが、ログローテーションの対象に入れたほうがいいでしょう。
  2. メール送信
    サーバ自体が死んでも、外部にアップロードされているので、全くデータが取れなくなる事態は避けられるかと思いますが、postfixとか入れてバックアップできたことをメールで通知するといいと思われます。

参考

    1. mysqlやmysqldumpで「 [Warning] Using a password on the command line interface can be insecure.」という警告が表示される場合の対処
    2. How to log cron jobs?
    3. How can I change the date modified/created of a file?

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です