#!/bin/sh
# バックアップ先ディレクトリ
BKDIR=/data/sample/backup/database/full
# 本スクリプトパス
MYPATH=$(cd "$(dirname "$0")"; pwd)
#世代管理(何日分残すか)
DAYAGO="31"
# MySQユーザー
USER=admin
# MySQLパスワード
# ※ 平文でのパスワード直書きは非推奨。実運用では環境変数や
# シークレットマネージャー(例: AWS Secrets Manager, Vault 等)から取得すること。
PASS="${DB_PASSWORD:?環境変数 DB_PASSWORD を設定してください}"
# 日付・時刻取得し変数に代入
# ※ 元コードは "%H%I%M" と24時間表記(%H)と12時間表記(%I)が
# 両方含まれており時刻が重複していたため "%H%M" に修正
TIMESET=$(date +%Y%m%d-%H%M)
# バックアップ先ファイル名を設定
# 設定ファイルにあるファイル名+日付.tar.gzする
BKFILE="${BKDIR}/mysql.${TIMESET}.tar.gz"
# データベース名取得
DBNAME=sample
# DBNAMEデータベースをmysqldumpでバックアップ
# $?は最後に実行したコマンドの戻り値
DUMPFILE="${BKDIR}/$(date "+${DBNAME}-%Y%m%d%H%M%S").sql"
mysqldump --user="${USER}" --password="${PASS}" "$DBNAME" --opt > "$DUMPFILE" | logger -t mysqldump
if [ $? = 0 ]; then
logger -t mysqldump "Backup OK mysqldump:${DBNAME}"
# ダンプファイルを含めて圧縮(BKFILEを実際に使用)
tar zcf "$BKFILE" "$DUMPFILE"
else
# 失敗したらその旨を表示かつ、ログに保存、メール送信
logger -t mysqldump "Backup NG mysqldump:${DBNAME}"
fi
# yyyymmdd形式のファイルから古い物を削除
# 削除する日付(yyyymmdd)を設定(DAYAGO日前の日付を求める)
tday=$(date -d "${DAYAGO} day ago" +%Y%m%d)
# 対象Dir配下のファイル名をwhileに渡し「$list」となる
# ※ 元コードは "|" の直後に全角スペースが混入しており、
# シェルが "while" を予約語として認識できずエラーになるバグがあったため半角スペースに修正
ls "$BKDIR" | while read -r list
do
#ファイル名に「数字x14」が含まれている場合、
if expr "$list" : "${DBNAME}\-[0-9]\{14\}.sql" > /dev/null; then
# $listから、「yyyymmdd」を取り出しepoch時間($fday)にする
fday=$(expr "$list" : "${DBNAME}\-\([0-9]\{8\}\)[0-9]\{6\}.sql")
#ファイル名から取得した「yyyymmdd」がDAYAGOの「yyyymmdd」よりも小さいとき削除
if [ -n "$fday" ] && [ "$fday" -lt "$tday" ]; then
# echo する
# echo "$list"
#削除する
# ※ 元コードはバッククォートでコマンド置換として囲まれており
# 意図せずコマンド置換扱いになっていたバグがあったため削除
sudo rm -f "${BKDIR}/${list}"
fi
fi
done