xserver 上にデータベースが 10 個ほどありますが、これまではそれを別々にエクスポートしてバックアップしていました。
それが 5 つも あるとバックアップが面倒になってきます。ログもたくさんできますし。
それで、5 つのデータベースをまとめてバックアップします。
これまでは以下のようなシェルスクリプトを作って cron で動かしていました。
#!/bin/shperiod=7dirpath='~/moheno.site/mysql_bak'filename=`date +%y%m%d`mysqldump -uheno -pmoheno henomemo > $dirpath/$filename.sqlchmod 700 $dirpath/$filename.sqloldfile=`date --date "$period days ago" +%y%m%d`rm -f $dirpath/$oldfile.sqlこの場合、henomemo というデータベースをエクスポートするのですが、heno というユーザー名と moheno というパスワードをスクリプトに直接書き込んでいます。
おそらく漏れることはないと思いますが、セキュリティ上あまりいい感じはしません。
そこで、ルートディレクトリの直下に .my.cnf というファイルを作成してその中に重要な情報を書いておくとそれを自動的に読んでくれます。「my.cnf」じゃなくて「.my.cnf」です。
[client]user=rootpassword=R2%JB1Mne4wこんな感じです。
データベースが複数ある場合には以下のようにします。
# デフォルトクライアント(mysql, mysqldump 共通)[client]user=moheno_quenapassword=hoge
# laramemo 用 mysqldump[mysqldump_laramemo]user=moheno_boopassword=foo
# vocabula 用 mysqldump[mysqldump_vocabula]user=moheno_boopassword=foo
# kenadb 用 mysqldump[mysqldump_kenadb]user=moheno_quenapassword=Se23LpiU
# READalot 用 mysqldump[mysqldump_readalot]user=moheno_boopassword=foo
# laraconf 用 mysqldump[mysqldump_laraconf]user=moheno_larpassword=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 fidone
echo "=== Backup completed at $(date) ==="とても長いシェルスクリプトですが chatGPT は一瞬で作ってくれました。
かなり難解でよくわかりませんが、ポイントは database と group です。
例えば、group 名が”laramemo”の場合は .my.cnf の
[mysqldump_laramemo]user=moheno_boopassword=fooに書いてあるパラメータが使用されてデータベースのダンプが実行されます。
データベースを追加してダンプする場合は、.my.cnf に新しい情報を追加して、シェルスクリプトのデータベースとグループに新しい情報を追加すればいいのでとても簡単です。
このシェルスクリプトを cron で実行すれば、これだけで 5 つのデータベースを一括してバックアップすることができます。
バックアップしたファイルを xserver から NAS へ rsync します。
これも簡単にしました。
#!/bin/sh
logdir="/volume1/backup/xserver_DBbak/rsync_logs"
# vocabularsync -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 です。