日々勉強のaraiです。
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$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のフルアクセス権限を付与して作成しました。
# 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の機能を使用しました。
- マネージメントコンソールにて、[S3]⇒バケット選択⇒[Properties]⇒[Lifecycle]⇒[Add rule]を押下する。
- Action on Current Version:[Expire Only]を選択する。
- Expire 3 days after the object's creation date. (ファイルを格納して、3日後には削除するように設定。)
- Action on Previous Versions:[Do Notiong]を選択する。
- Rule Name: 任意名を入力する。