IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

MySQLのmysqldumpをオブジェクトストレージへ保存

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

こんにちは、R&D室の梶川です。

今回は、MySQLのデータをmysqldumpでダンプし、s3cmdを使って IDCフロンティア オブジェクトストレージ へ保存する方法をご紹介します。また、簡単に利用できるよう簡易なスクリプトも載せておきますので、ご自由にご利用ください。(無保証になりますので、ご利用の際はご注意ください。)

前回「セルフクラウド rootディスクの拡張」でもパイプでつないで、一時ファイルを作らずに行うUNIXらしいやり方をご紹介しましたが、今回もまったく同じような形で中間ファイルを作らずにオブジェクトストレージへ保存します。良い感じにs3cmdもSTDIN(標準入力)から受け取ってputすることがサポートされているため、詳しい方はご紹介するまでもなくパッと頭に浮かぶかもしれませんね。具体的には「mysqldump | gzip | s3cmd put -」といった感じになります。詳細をご紹介していきます。

■ 準備

まずはじめに、オブジェクトストレージs3cmdを使えるようにしておきましょう。

■ mysqldump

mysqldumpはMySQLを使う人にはお馴染みのツールですので、説明は不要かもしれませんが、オプションを簡単に説明しておきます。とはいえ、オプションはかなりの数があり、どのオプションを利用するかについてはサイトに合わせて設定しましょう。

--all-databases
すべてのデータベースをダンプ対象とする。
--opt
良く利用するオプションをまとめた物。デフォルトで有効。
--events
mysql.eventをバックアップ対象とする。
--master-data=2
CHANGE MASTER TO構文をダンプに含める。「=2」でコメントとして挿入されます。このオプションはMasterからダンプする際に指定します。
--dump-slave=2
CHANGE MASTER TO構文をダンプに含める。「=2」でコメントとして挿入されます。このオプションはSlaveからダンプする際に指定します。(Slaveが参照しているMasterの情報が記載されます。)
--include-master-host-port
--dump-slaveする際に、host情報とポート情報もCHANGE MASTER TO構文へ含めます。
--single-transaction
InnoDBのテーブルを一貫した状態でダンプします。
--flush-logs
ダンプ前にログファイルをフラッシュします。
--hex-blob
バイナリーデータを16新表記でダンプします。
--routines
ルーチンを(関数とプロシージャ)をダンプに含めます。

※ CentOS6系標準のMySQL-5.1系では--dump-slave, --include-master-host-portは利用できませんので、ご注意ください。

※ 基本的にはInnoDBを意識したオプションとなります。他のストレージエンジンをご利用の場合はご注意ください。

お勧めとしては、上記のオプションでSlave(--dump-slaveを利用)から、更新があまりない時間帯にダンプです。とはいえ、Lockする/しない等々色々あると思いますので、サイトに合わせて適切なオプションを選択してください。

■ gzip

省略します。

■ s3cmd

s3cmdの細かい説明は省略しますが、今回のSTDIN(標準入力)から受け取る部分を説明します。

通常の利用では、s3cmdで オブジェクトストレージ へ書き込みを行う場合、s3cmdのputを利用して「s3cmd put 転送元ファイル s3://バケット名/」としてs3cmdを実行するサーバー上のファイルを転送する形をとると思います。s3cmdのmanを見ると記載がある(--files-fromの説明部分)のですが、転送元ファイルの部分へ「-」をとするとSTDINから受け取ることができます。例えば「echo "Example Text" | s3cmd put - s3://BucketName/test.txt」とすると、echoの標準出力をパイプ(「|」)でs3cmdの標準入力(STDIN)へ接続し、オブジェクトストレージ へアップロードすることができます。

余談ですが、インプットファイルとして「-」を使うとSTDINからの入力になるコマンドは結構多いです。例えば「echo "abc" | cat - > abc.txt」とかもできます。覚えておくと、いつか役に立ちますよ。

ということで、これを使うと「mysqldump | gzip | s3cmd put -」としてmysqldumpの標準出力(MySQLのダンプデータ)をgzipの標準入力で受け取り、gzipの標準出力(圧縮されたデータ)をs3cmdの標準入力で受け取り、オブジェクトストレージへアップロードできます。各コマンドの標準入出力をつなぐことにより、中間ファイルを作らずにアップロードすることが可能です。

■ サンプルスクリプト

今までお話ししてきた内容をまとめた、サンプルスクリプトを用意しました。(ご利用の際は、十分なテストの上ご利用ください。)


#!/bin/bash
#
#  mysqldump to IDCF Object Storage
#
#  Required   : mysqldump(mysql-5.5.37) & s3cmd-1.5.0-alpha3 later
#  Configfile : /etc/mysqldump_to_obst.conf
#
# ## Changelog
# 2014/07/10 First Release - hkajikawa@idcf.jp

: <<'__COMMENT_OUT__'
#  --- Config File(mysqldump_to_obst.conf) Sample ---
# Required Option
MYSQL_HOST=10.x.x.xxx
MYSQL_USER=root
MYSQL_PASSWD=PASSWORD
BUCKET=mysql-backup
NAME=mysqldump

# Optional
#MYSQLDUMP=/opt/rh/mysql55/root/usr/bin/mysqldump
#S3CMD=/usr/bin/s3cmd
#GZIP=/bin/gzip

# Dump from MySQL Master Sample
#MYSQLDUMP_OPT="--all-databases
# --opt
# --events
# --master-data=2
# --single-transaction
# --flush-logs
# --hex-blob
# --routines"
#
# Dump from MySQL Slave Sample (Default)
#MYSQLDUMP_OPT="--all-databases
# --opt
# --events
# --dump-slave=2
# --include-master-host-port
# --single-transaction
# --flush-logs
# --hex-blob
# --routines"

# DATETIME=$( date +%Y%m%d%H%M%S )
#  ---------------------
__COMMENT_OUT__

# Default for Optional Configuration
MYSQLDUMP=/opt/rh/mysql55/root/usr/bin/mysqldump
S3CMD=/usr/bin/s3cmd
GZIP=/bin/gzip
MYSQLDUMP_OPT="--all-databases
 --opt
 --events
 --dump-slave=2
 --include-master-host-port
 --single-transaction
 --flush-logs
 --hex-blob
 --routines"
DATETIME=$( date +%Y%m%d%H%M%S )

# Include Configuration File
CONFIG_FILE=/etc/mysqldump_to_obst.conf
[ ! -e ${CONFIG_FILE} ]  && echo "[ERROR] Config file(${CONFIG_FILE}) does not exist!" && exit 1
. ${CONFIG_FILE}

# Config Check
[ -z "${MYSQL_HOST}" ]   && echo "[ERROR] MYSQL_HOST is not set!"   && exit 1
[ -z "${MYSQL_USER}" ]   && echo "[ERROR] MYSQL_USER is not set!"   && exit 1
[ -z "${MYSQL_PASSWD}" ] && echo "[ERROR] MYSQL_PASSWD is not set!" && exit 1
[ -z "${BUCKET}" ]       && echo "[ERROR] BUCKET is not set!"       && exit 1
[ -z "${NAME}" ]         && echo "[ERROR] NAME is not set!"         && exit 1

# mysqldump | gzip | s3cmd put -
${MYSQLDUMP} --host=${MYSQL_HOST} \
             --user=${MYSQL_USER} \
             --password=${MYSQL_PASSWD} \
             ${MYSQLDUMP_OPT} \
             2> /dev/null \
| ${GZIP} 2> /dev/null \
| ${S3CMD} put - s3://${BUCKET}/${NAME}_${DATETIME}.gz > /dev/null 2>&1

# command execution check
result=( ${PIPESTATUS[*]} )
[ ${result[0]} -ne 0 ] && echo "[ERROR] ${MYSQLDUMP} execution error!" && exit 1
[ ${result[1]} -ne 0 ] && echo "[ERROR] ${GZIP} execution error!"      && exit 1
[ ${result[2]} -ne 0 ] && echo "[ERROR] ${S3CMD} execution error!"     && exit 1

echo "[OK] mysqldump to IDCF Object Storage was successfully."
${S3CMD} info s3://${BUCKET}/${NAME}_${DATETIME}.gz

使い方は次のとおりです。

このスクリプトはroot権限で実行することを想定しています。mysqldumpはroot権限不要なので、実際にはroot権限は不要です。別のユーザーで起動する場合は、下記読みかえてご利用ください。

まず、コンフィグファイル「/etc/mysqldump_to_obst.conf」を次の内容で準備します。なおこのファイルはパスワードなどが記載されるため、rootユーザー所有でパーミッションは600(「chown root:root /etc/mysqldump_to_obst.conf; chmod 600 /etc/mysqldump_to_obst.conf」)としておきましょう。


## --- /etc/mysqldump_to_obst.conf --- ##

# Required Option
MYSQL_HOST=MySQL ServerのIPアドレスを指定
MYSQL_USER=MySQLへ接続するためのユーザーを指定
MYSQL_PASSWD=MYSQL_USERで指定したユーザーのパスワードを指定
BUCKET=IDCFオブジェクトストレージ上のバケット名を指定
NAME=バケットへ保存するファイル名

# ※ =の前後にスペースを含めるとエラーになってしまいますのでご注意ください。

指定したユーザーで、指定したMySQLへmysqldumpできるか事前に確認しておきましょう。

このスクリプトのmysqldumpのオプションは、mysqldumpのオプション説明でお勧めと書いた、Slaveからのダンプで指定してあります。基本的には上記の設定ファイルでMYSQL_HOSTへSlaveを指定してスクリプトを実行すれば、せっせとオブジェクトストレージへアップしてくれます:-)

mysqldumpのオプションを変更する際は、MYSQLDUMP_OPTを設定ファイルへ記載することで変更することができます。また、いくつか他のオプションも指定できるようにしてありますので、詳しくはスクリプトの冒頭へコメントの形で記載してありますのでご確認ください。

Copyright © IDC Frontier Inc.