"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

【mysql】DBバックアップでサイトのミラーリングするスクリプト



スポンサーリンク

とある要件で、サイトのミラーリングが必要になり、工数少な目でさっとやる形で実装したのでスクリプトをご紹介。


前提:
・メインと、セカンダリサーバの2台構成
・メインは、AP/DB/WEBの機能
・セカンダリサーバも同様にAP/DB/WEBの機能
・今回の同期範囲はユーザデータベースの内容のみ
・サーバ間はSSHでの通信のみ可であり、FTPは使用しない
・アラートはslack


大まかな流れ:
1. cronでメインでDBバックアップ
2. バックアップファイルをSCPでセカンダリサーバへ転送
3. セカンダリサーバでDB Drop / Create DB / ダンプインポート


スクリプト1(on コピー元サーバ)

cronがこいつをキックする

#!/bin/sh
SLAVE_HOST="セカンダリダリサーバIP"
SLAVE_SSH_PORT="セカンダリサーバのSSHポート"
BASE_PATH="セカンダリサーバ側のスクリプトのパス"
DUMP="メインサーバ側から吐き出すダンプファイル名フルパス"
LOGFILE="ログファイルフルパス"
script_path="メインサーバ側のスクリプトパス"

echo "#####################################################" > $LOGFILE
echo "           なんかメッセージ                                                                     " >> $LOGFILE
echo "#####################################################" >> $LOGFILE

# db backup
echo `date +%Y%m%d_%H-%M-%S`" : [INF] DB backup start ..." >> $LOGFILE
/bin/mysqldump --opt -c --host=localhost -u<DBユーザ名> -p<DBパスワード> <DB名> | gzip > $DUMP

if [ $? = 0 ]; then
     echo `date +%Y%m%d_%H-%M-%S`" : [OK ] DB backup end ..." >> $LOGFILE
else
     echo '[ERR] return code ' $?
     $script_path/slack.sh $LOGFILE  >> $LOGFILE
     exit 1
fi


# file copy to remote server
echo `date +%Y%m%d_%H-%M-%S`" : [INF] file copy start ..." >> $LOGFILE
scp -P $SLAVE_SSH_PORT -C $DUMP <セカンダリサーバOSユーザ名>@<セカンダリサーバIP>:<コピー先ファイル名フルパス>
if [ $? = 0 ]; then
     echo `date +%Y%m%d_%H-%M-%S`" : [OK ] file copy end ..." >> $LOGFILE
else
     echo '[ERR] return code ' $?
     $script_path/slack.sh $LOGFILE  >> $LOGFILE
     exit 1
fi

# dump import(dropdb/createdb/d:s:u/import)
echo `date +%Y%m%d_%H-%M-%S`" : [INF] Refresh Process in remote server start ..." >> $LOGFILE
ssh -p $SLAVE_SSH_PORT $SLAVE_HOST "cd $BASE_PATH; ./refresh_db.sh"
if [ $? = 0 ]; then
     echo `date +%Y%m%d_%H-%M-%S`" : [OK ] All Steps end ..." >> $LOGFILE
else
     echo '[ERR] return code ' $?  >> $LOGFILE
     $script_path/slack.sh $LOGFILE
     exit 1
fi

$script_path/slack.sh $LOGFILE  >> $LOGFILE


スクリプト2、4(on コピー元サーバとセカンダリの両方)

slack.shのファイルの中身。引数にログファイル名を渡すとログファイルの中身をslackで教えてくれる。

#!/bin/sh
WEBHOOKURL="WEBHOOKのURL"

msg=`cat $1`

DATA_PAYLOAD=`cat <<_EOT_
payload={ \
    "channel": "チャンネル名", \
    "username": "ユーザ名", \
    "text": "${msg}" \
}
_EOT_`

curl -s -S -X POST --data-urlencode "${DATA_PAYLOAD}" "${WEBHOOKURL}"

スクリプト3(on セカンダリサーバ)

#!/bin/sh
LOGFILE="ログファイル名フルパス"
script_path="スクリプトのパス"

# このスクリプトのディレクトリの絶対パスを取得
DUMP="とんでくるダンプのフルパス"
DUMP_SQL="解凍したファイルのフルパス"


echo "#####################################################" > $LOGFILE
echo "       なんか書く                           " >> $LOGFILE
echo "#####################################################" >> $LOGFILE

# 移動
cd ダンプのディレクトリ移動

# ファイル存在チェック
if [ ! -e $DUMP ]; then
     echo '[ERR] no dump file found ' >> $LOGFILE
     $script_path/slack.sh $LOGFILE  >> $LOGFILE
     exit 1
fi

# ファイル存在チェック
if [ -e $DUMP_SQL ]; then
   rm $DUMP_SQL
fi

# 解凍
gzip -d $DUMP

# MySQLをバッチモードで実行するコマンド
CMD_MYSQL="mysql -u <ユーザ> -p<パスワード>"

# Drop database
echo `date +%Y%m%d_%H-%M-%S`" : [INF] Drop Database start ..." > $LOGFILE
$CMD_MYSQL -e "drop database <DB名>"

if [ $? = 0 ]; then
     echo `date +%Y%m%d_%H-%M-%S`" : [OK ] Drop dabase end ..." >> $LOGFILE
else
     echo '[ERR] return code ' $?
     $script_path/slack.sh $LOGFILE  >> $LOGFILE
     exit 1
fi

# Create Database;
echo `date +%Y%m%d_%H-%M-%S`" : [INF] Create Database start ..." > $LOGFILE
$CMD_MYSQL -e "create database <DB名> default character set utf8;"


# Grant rights
echo `date +%Y%m%d_%H-%M-%S`" : [INF] Grant Database start ..." > $LOGFILE
$CMD_MYSQL -e "grant all privileges on <DB名>.* to <DBユーザ名>@localhost identified by '<DBユーザパスワード>';"