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

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

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

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

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

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

```lang:create_all_dump.sh
#!/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$exclude\b//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のフルアクセス権限を付与して作成しました。

```lang:
# 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 ←ｙ入力Enter
Configuration saved to '/root/.s3cfg'
```
### S3コマンドで、アップロードテスト

```lang:
# echo hello > hello.txt
# s3cmd put -P hello.txt s3://Buket_Name/
```
### S3アップロードスクリプトの設置
次にダンプファイルをS3にアップロードするスクリプトを設置します。ダンプ作成スクリプトと同様の場所に保存してください。
本スクリプトは、１時間毎に作成されたダンプファイルのみをS3へアップロードします。
"**Buket_Name**"の部分のみ修正して使用します。

```lang:s3uploader.sh
#!/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`の前に以下のように追記しておきます。

```lang:create_all_dump.sh
     :
sh s3uploader.sh 　←追記
  
exit $STATUS
```
### 自動起動設定
毎時１分に全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.　（ファイルを格納して、３日後には削除するように設定。）
4. Action on Previous Versions:[Do Notiong]を選択する。
5. Rule Name: 任意名を入力する。