share facebook facebook2 twitter menu hatena pocket slack

2014.11.13 THU

全MySQLダンプ作成か〜ら〜の、S3アップロードをスクリプトで簡単にする

荒井 立樹

WRITTEN BY荒井 立樹

日々勉強の、cloudpackaraiです。

Linux上で、全Mysqlダンプを作成し、S3へアップロードを簡単に行えるスクリプトを作成してみました。

全MySQLダンプ作成スクリプト

まず、全MySQLダンプを作成するスクリプトが以下です。
ユーザー、パスワード、ホストを設定して、実行するだけで、簡単にダンプ作成ができます!

スクリプトの概要は、こんな感じです。

  • 1時間毎にダンプ作成を想定、24世代保持するローテート
  • /DUMP_BACKUPSディレクトリの中にダンプ格納用各DB名ディレクトリを作成
  • 全DBのダンプファイルを作成 (mysql、information_schema、performance_schemaを除外)
  • アーカイブ

create_all_dump.shを/root/直下に格納します。

#!/bin/bash

USERNAME=root  ←ユーザーを設定設定(全データベースにアクセスできるユーザー)
PASSWORD="password"  ←パスワードを設定
DBHOST=localhost  ←ホストを設定
BACKUPDIR="/DUMP_BACKUPS"
DBEXCLUDE="mysql information_schema performance_schema"  ←除外したいDBを指定
COMP=gzip
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin
DATE=`date +%Y%m%d`
DNOW=`date +%H`
LOGERR=$BACKUPDIR/ERRORS_$DBHOST-`date +%N`.log

if [ ! -e "$BACKUPDIR" ]        # Check Backup Directory exists.
    then
    mkdir -p "$BACKUPDIR"
fi

touch $LOGERR
exec 7>&2
exec 2> $LOGERR

dbdump () {
mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $1 > $2
return 0
}

SUFFIX=""
compression () {
if [ "$COMP" = "gzip" ]; then
    gzip -f "$1"
    echo
    echo Backup Information for "$1"
    gzip -l "$1.gz"
    SUFFIX=".gz"
elif [ "$COMP" = "bzip2" ]; then
    echo Compression information for "$1.bz2"
    bzip2 -f -v $1 2>&1
    SUFFIX=".bz2"
else
    echo "No compression option set, check for settings"
fi
return 0
}

if [ "$DBHOST" = "localhost" ]; then
    HOST=`hostname`
else
    HOST=$DBHOST
fi

DBNAMES="`mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST --batch --skip-column-names -e "show databases"| sed 's/ /%/g'`"
# If DBs are excluded
for exclude in $DBEXCLUDE
do
    DBNAMES=`echo $DBNAMES | sed "s/b$excludeb//g"`
done

    for DB in $DBNAMES
    do
        DB="`echo $DB | sed 's/%/ /g'`"
        if [ ! -e "$BACKUPDIR/$DB" ]        # Check DB Directory exists.
            then
            mkdir -p "$BACKUPDIR/$DB"
        fi
        # Delete old dump
        eval rm -fv "$BACKUPDIR/$DB/*.$DNOW.sql.*"
            # Create dump
        dbdump "$DB" "$BACKUPDIR/$DB/${DB}_$DATE.$DNOW.sql"
        compression "$BACKUPDIR/$DB/${DB}_$DATE.$DNOW.sql"
    done

if [ -s "$LOGERR" ]
    then
        STATUS=1
    else
        STATUS=0
fi

eval rm -f "$LOGERR"

exit $STATUS

S3アップロードスクリプト

事前準備

S3コマンドインストール

S3コマンドがインストールされていない場合は、以下のコマンドでインストールする。
# yum -y install –enablerepo=epel s3cmd

S3_CLIの設定

S3にCLIでアクセスできるようにするため、以下のようにして設定する。
今回、アクセスするIAMユーザーは、S3のフルアクセス権限を付与して作成しました。

# s3cmd --configure ←Enter

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: XXXXXXXXXXXXXXXXXXXX ←入力Enter
Secret Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ←入力Enter

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: ←Enter
Path to GPG program [/usr/bin/gpg]: ←Enter

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: ←Enter

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name: ←Enter

New settings:
  Access Key: XXXXXXXXXXXXXXXXXXXX
  Secret Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  Encryption password:
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: False
  HTTP Proxy server name:
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y ←Y 入力Enter
Please wait...
Success. Your access key and secret key worked fine 🙂 ←接続確認OK!

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y ←y入力Enter
Configuration saved to '/root/.s3cfg'

S3コマンドで、アップロードテスト

# echo hello > hello.txt
# s3cmd put -P hello.txt s3://Buket_Name/

S3アップロードスクリプトの設置

次にダンプファイルをS3にアップロードするスクリプトを設置します。ダンプ作成スクリプトと同様の場所に保存してください。
本スクリプトは、1時間毎に作成されたダンプファイルのみをS3へアップロードします。
Buket_Name“の部分のみ修正して使用します。

#!/bin/sh

DATE=`date +%Y%m%d`
HH=`date +%H`
DUMPDIR="/DUMP_BACKUPS/"

cd $DUMPDIR
DUMPLIST=`find . -name "*.$HH.sql.gz"`

for DUMP_PATH in $DUMPLIST
do
    DUMP_PATH="`echo $DUMP_PATH | sed s@^./@@`"
    DBNAME=`echo $DUMP_PATH | awk -F'/' '{print $1}'`
    s3cmd put -P $DUMPDIR$DUMP_PATH s3://Buket_Name/mysql_dump/$DBNAME/$DBNAME"_"$DATE"."$HH".sql.gz"
done

exit 0

全MySQLダンプ作成スクリプトの実行後に、動くのがベストなので、MySQLダンプ作成スクリプトのexit $STATUSの前に以下のように追記しておきます。

     :
sh s3uploader.sh  ←追記

exit $STATUS

自動起動設定

毎時1分に全MySQLダンプ作成スクリプトを起動をcronに設定

01 * * * * /root/create_all_dump.sh

これで、全MySQL_Dump作成か〜ら〜の、S3アップロードが自動で行われます。

S3に格納したファイルを自動で削除するには

S3側に格納したファイルを自動で削除するには、S3のLifecycle Rulesの機能を使用しました。

  1. マネージメントコンソールにて、[S3]⇒バケット選択⇒[Properties]⇒[Lifecycle]⇒[Add rule]を押下する。
  2. Action on Current Version:[Expire Only]を選択する。
  3. Expire 3 days after the object’s creation date. (ファイルを格納して、3日後には削除するように設定。)
  4. Action on Previous Versions:[Do Notiong]を選択する。
  5. Rule Name: 任意名を入力する。

元記事はこちらです。
全MySQLダンプ作成か〜ら〜の、S3アップロードをスクリプトで簡単にする

荒井 立樹

荒井 立樹