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

コメントを残す

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