xserver のデータベースをまとめてバックアップ

(2025-12-13)

xserver 上にデータベースが 10 個ほどありますが、これまではそれを別々にエクスポートしてバックアップしていました。

それが 5 つも あるとバックアップが面倒になってきます。ログもたくさんできますし。

それで、5 つのデータベースをまとめてバックアップします。

これまでのシェルスクリプト

これまでは以下のようなシェルスクリプトを作って cron で動かしていました。

#!/bin/sh
period=7
dirpath='~/moheno.site/mysql_bak'
filename=`date +%y%m%d`
mysqldump -uheno -pmoheno henomemo > $dirpath/$filename.sql
chmod 700 $dirpath/$filename.sql
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql

この場合、henomemo というデータベースをエクスポートするのですが、heno というユーザー名と moheno というパスワードをスクリプトに直接書き込んでいます。

おそらく漏れることはないと思いますが、セキュリティ上あまりいい感じはしません。

.my.cnf の作成

そこで、ルートディレクトリの直下に .my.cnf というファイルを作成してその中に重要な情報を書いておくとそれを自動的に読んでくれます。「my.cnf」じゃなくて「.my.cnf」です。

Terminal window
[client]
user=root
password=R2%JB1Mne4w

こんな感じです。

データベースが複数ある場合には以下のようにします。

Terminal window
# デフォルトクライアント(mysql, mysqldump 共通)
[client]
user=moheno_quena
password=hoge
# laramemo 用 mysqldump
[mysqldump_laramemo]
user=moheno_boo
password=foo
# vocabula 用 mysqldump
[mysqldump_vocabula]
user=moheno_boo
password=foo
# kenadb 用 mysqldump
[mysqldump_kenadb]
user=moheno_quena
password=Se23LpiU
# READalot 用 mysqldump
[mysqldump_readalot]
user=moheno_boo
password=foo
# laraconf 用 mysqldump
[mysqldump_laraconf]
user=moheno_lar
password=foo

最初の[client]はmysql(xserverではmariadb)にログインするための情報で、それ以下はそれぞれのデータベースのユーザー名とパスワードを記録しておきます。

シェルスクリプト

シェルスクリプトは以下のようになります。

#!/bin/bash
# バックアップ保存先ディレクトリ
dirpath='/home/moheno/DBbak'
logdir="$dirpath/log"
mkdir -p "$dirpath" "$logdir"
# データベース名と .my.cnf グループ名
databases=("laramemo" "vocabula" "kenadb" "readalot" "laraconf")
groups=("laramemo" "vocabula" "kenadb" "readalot" "laraconf")
# ログファイル(実行日ごと)
logfile="$logdir/backup_$(date +%y%m%d).log"
# 標準出力と標準エラーをログにまとめる
exec > >(tee -a "$logfile") 2>&1
echo "=== Backup started at $(date) ==="
for i in "${!databases[@]}"; do
db="${databases[$i]}"
group="${groups[$i]}"
filename="$dirpath/${db}_$(date +%y%m%d).sql"
echo "=== Backing up $db ==="
# mysqldump 実行
if ! mysqldump --defaults-group-suffix="_$group" moheno_"$db" > "$filename"; then
echo "Backup FAILED for $db! Check the log for details."
continue
fi
# 権限設定(所有者のみ読み書き実行)
chmod 700 "$filename"
# 最新10個以外のバックアップを削除(存在する場合のみ)
files=$(ls -1t "$dirpath/${db}_*.sql" 2>/dev/null)
if [ -n "$files" ]; then
echo "$files" | tail -n +11 | xargs -r rm -f
fi
done
echo "=== Backup completed at $(date) ==="

とても長いシェルスクリプトですが chatGPT は一瞬で作ってくれました。

かなり難解でよくわかりませんが、ポイントは database と group です。

例えば、group 名が”laramemo”の場合は .my.cnf の

[mysqldump_laramemo]
user=moheno_boo
password=foo

に書いてあるパラメータが使用されてデータベースのダンプが実行されます。

データベースを追加してダンプする場合は、.my.cnf に新しい情報を追加して、シェルスクリプトのデータベースとグループに新しい情報を追加すればいいのでとても簡単です。

このシェルスクリプトを cron で実行すれば、これだけで 5 つのデータベースを一括してバックアップすることができます。

xserver から NAS への rsync も簡単に

バックアップしたファイルを xserver から NAS へ rsync します。

これも簡単にしました。

#!/bin/sh
logdir="/volume1/backup/xserver_DBbak/rsync_logs"
# vocabula
rsync -avzu \
-e 'ssh -p 10022 -i ~/.ssh/moheno.key' \
--delete \
--checksum \
moheno@sv12345.xserver.jp:~/DBbak \
/volume1/backup/xserver_DBbak \
>> "$logdir/rsync_DB_$(date +%Y%m%d%H%M%S).log" 2>&1
# ==========================
# 古いログを削除(30日より前のもの)
# ==========================
find "$logdir" -type f -name "rsync_*.log" -mtime +30 -exec rm -f {} \;

後はこのシェルスクリプトを NAS の cron に設定すれば OK です。