Bashスクリプトでmysqldumpバックアップと世代管理

WordPress用のデータベースのバックアップと世代管理を行うBashスクリプトの作成例です。cronに登録し、自動で定時実行させています。個人用途なのでエラー処理については厳密に考慮していません。

※目次をクリックすると目次の下部にコンテンツが表示されます。

スクリプトの処理の流れ
①mysqldumpコマンドでデータベースをバックアップ。
 
②バックアップが成功した場合、バックアップファイルの世代管理を行う。7世代分のバックアップファイルを保持。
 
③ログファイルにログ記録、エラー時にはメール送信。
 
④上記①~③を関数として定義し、データベース単位に実行。

スクリプトの説明
1)mysqldump実行とエラー判定
 

set -o pipefail
mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path
if [ $? -eq 0 ] ; then
  :
 世代管理処理
  :

・mysqldumpコマンドでデータベースをバックアップ。
・エラー出力をログファイルに記録。
・pipefailオプションを使ってエラー判定。
 
●パイプのexitステータスコードとpipefailオプション
 
通常は、パイプで指定した複数のコマンドの最後のコマンドのexitステータスコードが表示されます。
 mysqldumpによるバックアップと圧縮の処理ではパイプを使っているので、バックアップがエラー終了しても圧縮コマンドが成功するとexitステータスが0となってしまいます。
 
すべてのコマンドが0の場合のみ0が返るように挙動を変更する場合には、pipefailオプションを設定します。
 
●mysqldumpコマンドのエラーをログに記録
 
mysqldumpのエラーは標準エラー出力に出力されるので、2>> $tmp_logで標準エラー出力をログファイルに出力し、標準出力はパイプでbzip2コマンドに渡します。
 
2)ログ出力
 
●タイムスタンプをログに出力
 
・dateコマンドのフォーマットを指定
date +”%Y/%m/%d %k:%M:%S”
出力例)
2014/11/05 16:08:52
 
・タイムスタンプと開始、終了のコメントをログに記録
“でdateコマンドを挟んで、コマンド実行結果をechoの出力に埋め込みます。
 
echo “`date +”%Y/%m/%d %k:%M:%S”` MySQLダンプバックアップスクリプト開始” >> $log
 
3)バックアップファイルの世代管理
 

if [ $? -eq 0 ] ; then
  for i in 7 6 5 4 3 2 1 ; do
    let j=i+1
    new_name="${base}${j}_${bk_name}"
    old_name="${base}${i}_${bk_name}"
    mv $old_name $new_name
  done
  new_name="${base}1_${bk_name}"
  mv $bk_path $new_name
  del_name="${base}8_${bk_name}"
  rm $del_name

 
・mysqldumpコマンドによるバックアップが成功した場合のみ世代管理処理を行います。
・既存のバックアップファイル(添え字が1~7)をリネーム(添え字を2~8)します。
・新規バックアップファイル(添え字が0)を添え字1にリネームし、一番古いバックアップファイル(添え字8)を削除。
 
4)エラー時にメール通知
 
echo “From: root@mail.sample.com” > $msg
echo “To: admin@mail.myhome.com” >> $msg
echo “Subject: MySQL Dump BackUp($dbname) Error!” >> $msg
echo “” >> $msg
cat $tmp_log >> $msg
/usr/sbin/sendmail -t < $msg   5)関数を定義して、データベース単位に実行
 

bkup ()
{
  dbuser=$1
  dbpswd=$2
  dbname=$3
  bk_name="wp_db_${dbname}.bz2"
  bk_path="${base}0_${bk_name}"
   :
  mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path
  if [ $? -eq 0 ] ; then
   世代管理処理
  else
   エラー時のメール通知処理
  fi
}

bkup ユーザー名1 パスワード1 データベース名1
bkup ユーザー名2 パスワード2 データベース名2
bkup ユーザー名3 パスワード3 データベース名3

 
6)cronに登録して定期実行
 
$ crontab -e
 
01 4 * * * /home/user/bkup/wpbackup.sh

Bashスクリプト全体
#!/bin/bash

base="/home/user/bkup/"
log="${base}wpbkup.log"
tmp_log="${base}tmp_wpbkup.log"
msg="${base}mailmsg"
set -o pipefail
echo "`date +"%Y/%m/%d %k:%M:%S"` MySQLダンプバックアップスクリプト開始" >> $log

bkup ()
{
  dbuser=$1
  dbpswd=$2
  dbname=$3
  bk_name="wp_db_${dbname}.bz2"
  bk_path="${base}0_${bk_name}"
  echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップ開始" > $tmp_log
  mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path

  if [ $? -eq 0 ] ; then
    for i in 7 6 5 4 3 2 1 ; do
      let j=i+1
      new_name="${base}${j}_${bk_name}"
      old_name="${base}${i}_${bk_name}"
      mv $old_name $new_name
    done
    new_name="${base}1_${bk_name}"
    mv $bk_path $new_name
    del_name="${base}8_${bk_name}"
    rm $del_name
    echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップ正常終了" >> $log
  else
    cat $tmp_log >> $log
    echo "From: root@mail.sample.com" > $msg
    echo "To: admin@mail.myhome.com" >> $msg
    echo "Subject: MySQL Dump BackUp($dbname) Error!" >> $msg
    echo "" >> $msg
    cat $tmp_log >> $msg
    /usr/sbin/sendmail -t < $msg
    echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップエラー終了" >> $log
  fi
}

bkup ユーザー名1 パスワード1 データベース名1
bkup ユーザー名2 パスワード2 データベース名2
bkup ユーザー名3 パスワード3 データベース名3

関連記事の目次
VPSサーバーでスナップショットを取得
~障害に備え、リカバリーポイントを作成。
VPSサーバーにログインして、設定内容を確認
~グローバルIPアドレス確認、SSHキーを作成。
VPSサーバーにSSHでログイン
~Tera Term、SSH、公開鍵認証方式
yumコマンドで最新のパッケージにアップデート
~全パッケージを最新にアップデート
Apacheのインストール
~yumコマンドでApacheインストール、iptablesでファイアウォールの設定
PHPとMySQLをインストール
~yumコマンドでPHP、MySQLインストール
WinSCPを使ってWordPressをアップロード
~WinSCPをクライアントPCにインストール、ファイルアップロード方法
WordPressをインストール
~MySQLでWordPress用データベース作成、wp-config.phpファイルの設定
CentOSのファイアウォール設定
~iptablesを使ってネットワークフィルタリング設定を一から行う
OpenSSHの設定をよりセキュアに
~ログイン制限、ポート変更、認証方式
ApacheでTCPのTraceメソッドを無効にする
~Apacheの設定変更、Telnetで動作確認
ヘッダーにApacheバージョンが表示されないようにする
~Apacheの設定変更、Telnetで動作確認
Apacheでディレクトリ内一覧表示を無効にする
~autoindex_moduleのロードを無効にする
セキュリティを考慮し、MySQLの匿名ユーザーにパスワードを設定、または削除
~MySQLの匿名ユーザーにパスワードを設定、または削除
PHPのバージョンが表示されないようにする
~php.iniの設定変更
WordPressディレクトリのパーミッションをセキュアに
~WordPress用ディレクトリの所有グループ、ユーザー、パーミッション設定
パーマリンク設定時のApache設定
~WordPressパーマリンクの設定、Apache .htaccessの設定
WordPressテーマの選定
~テーマ追加の特徴フィルターの項目、テンプレートキング
WordPressで画像のアップロード、サイズ調整、リンクを設定
~アップロード画像の画像サイズ、サムネイル、画像編集、リンク設定
更新可能なRPMパッケージのリストをメールで送信する
~yumコマンド、Bashスクリプト、Cron
Linuxでディスク使用量が多いディレクトリを調べる方法(1)
~du --max-depth
Linuxでディスク使用量が多いディレクトリを調べる方法(2)
~duコマンド、sortコマンド
WordPressデータベースのバックアップとリストア
~コマンドラインでバックアップ、リストア
WordPressのバージョンアップと旧バージョンへの戻し
~データベースとディレクトリのバックアップ、リストア
BashスクリプトでWordPressデータベースを自動バックアップ
~MySQLデータベースをBash、Cronを使って自動バックアップ、メール通知
BashスクリプトでDos攻撃など大量アクセスのログを検知
~Apacheアクセスログ、Dos、Cron、メール通知
テーマ作成
 
ブートストラップ3を使って自作テーマ作成
~Bootstrap3、自作テーマ作成、TwentyFourteen
Bootstrapのフリーのテーマを使ってデザインを簡単にカスタマイズ
~Bootstrap3のスタイルをカスタマイズ
 
WordPresssショートコード
 
簡単なショートコードを作ってみる
~ショートコードの作り方
ショートコードを使って関連記事のリンクを自動で挿入
~ショートコードの簡単なサンプル
ショートコードを使ってディレクトリ内のファイル名を取得し、投稿内にリンクを挿入
~カスタムフィールド利用、PHPで日本語文字列検索などのコーディング
 
AJAX、AngularJSなどその他応用
 
WordPress投稿内でAngularJSを使用
~AngularJS、Bootstrap、アコーディオン
Bootstrap3で作成したナビゲーションメニューをAngularJSに変更
~AngularJS、Bootstrap、自作テーマheder.php
WordPressでAngularJSを使ったGoogleマップを使えるようにする
~AngularJSを使って投稿内にGoogleマップ

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください