MySQL のバックアップスクリプト
本 WordPress「masassiah.xyz」では MySQL のデータベースを利用しています。そのデータをバックアップするスクリプトを作成したので紹介します。作成したスクリプトは CRON で一日一回,定時に実行しています。
バックアップスクリプト
MySQL のデータベースをバックアップするスクリプトを示します。
#!/bin/sh
# 定数
BACKUP_PERIOD=31 # バックアップの保存期間(1ヶ月)
BACKUP_DIR='/home/hoge/dbbackup' # バックアップを保存するディレクトリ
PREFIX="wp_" # バックアップファイルのプレフィックス
MYSQL_DB="dbname" # MySQL データベース名
CREDENTIALS_SCRIPT='/home/hoge/dbbackup/credentials.sh' # 認証情報スクリプトのパス
# エラーハンドリング用の関数
error_exit() {
echo "Error: $1" >&2
exit 1
}
# 認証情報の読み込み
load_credentials() {
if [ -f "$CREDENTIALS_SCRIPT" ]; then
. "$CREDENTIALS_SCRIPT"
else
error_exit "Credentials script not found"
fi
}
# バックアップの作成
create_backup() {
local filename="${PREFIX}$(date +%Y%m%d).sql.gz"
# mysqldumpとgzipでバックアップ作成
mysqldump --skip-column-statistics -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" | gzip > "$BACKUP_DIR/$filename" || error_exit "Failed to create backup"
# パーミッションの変更
chmod 0600 "$BACKUP_DIR/$filename" || error_exit "Failed to set permissions on backup file"
echo "Backup created: $filename"
}
# 古いバックアップの削除
delete_old_backups() {
find $BACKUP_DIR -name "${PREFIX}*.sql.gz" -type f -mtime +$BACKUP_PERIOD -exec rm {} \; || error_exit "Failed to delete old backups"
echo "Old backups deleted"
}
# メイン処理
main() {
load_credentials
create_backup
delete_old_backups
}
# 実行
main
また,認証情報スクリプトを示します。このスクリプトに MySQL のユーザ,パスワード,ホストを記載します。
#!/bin/sh
export MYSQL_USER="username"
export MYSQL_PASSWORD="password"
export MYSQL_HOST="host"
スクリプトの解説
上記のスクリプトでは,認証情報の読み込み,バックアップの作成,古いバックアップの削除を行なっており,それぞれの概要について説明します。
認証情報の読み込み
認証情報の読み込みでは,MySQL のホスト名,データベースのユーザ名,パスワードを読み込んでいます。セキュリティ上の配慮を行うため,スクリプトと別ファイルに分けています。
load_credentials() {
if [ -f "$CREDENTIALS_SCRIPT" ]; then
. "$CREDENTIALS_SCRIPT"
else
error_exit "Credentials script not found"
fi
}
バックアップの作成
バックアップでは,mysqldump し,gzip で圧縮しています。また,バックファイルのパーミッションを 600(オーナのみ「呼出」「書込」が可能)に変更しています。
create_backup() {
local filename="${PREFIX}$(date +%Y%m%d).sql.gz"
# mysqldumpとgzipでバックアップ作成
mysqldump --skip-column-statistics -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DB" | gzip > "$BACKUP_DIR/$filename" || error_exit "Failed to create backup"
# パーミッションの変更
chmod 0600 "$BACKUP_DIR/$filename" || error_exit "Failed to set permissions on backup file"
echo "Backup created: $filename"
}
古いバックアップの削除
一定期間(上記のスクリプトでは 31 日)を経過した古いバックファイルを削除しています。
delete_old_backups() {
find $BACKUP_DIR -name "${PREFIX}*.sql.gz" -type f -mtime +$BACKUP_PERIOD -exec rm {} \; || error_exit "Failed to delete old backups"
echo "Old backups deleted"
}
CRON 設定
LOLIPOP の cron 設定では,毎日 22 時 0 分のスケジュールで実行する設定を行っています。
cron の設定名 | cron の設定名を任意に作成 |
日付(月) | 毎月 |
日付(日) | 毎日 |
時間(時) | 22 時 |
時間(分) | 0 分 |
スケジュール | 毎日 22 時 0 分のスケジュールで実行します(上記の 4 行を入力すると自動で表示される) |
実行ファイルパス | MySQL のデータベースをバックアップするスクリプトのパスを入力 |
なお,LOLIPOP の CRON では,実行ファイルのパーミッションは 700(オーナのみ呼出・書込・実行が可能),データファイル(今回は認証情報スクリプト)のパーミッションは 600(オーナのみ呼出・書込が可能)と設定するように指定されています。
実行結果
MySQL のバックアップスクリプトを実行すると,以下のような結果となります。
mysqldump のコマンドで「-p」でパスワードをつけているため,ワーニングが表示されているようです。
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Backup created: wp_20250220.sql.gz
Old backups deleted