[MySQL] MySQLバックアップシェルスクリプト


nullpopopo96x96皆さんこんにちは。今年も半分\(^o^)/オワタと嘆くよりも、21世紀の1/8が終わったというスケールの大きさでいろいろと誤魔化している (っ´∀`)っ ゃー でございます。いかがお過ごしでしょうか。

MySQLのバックアップは常にとっておきたいですよね。シェルスクリプトに書いてしまってcronでまわせば、わざわざコンソールやブラウザ(phpMyAdmin)でカタカタポチポチしなくて済みます。今回作成したMySQLのバックアップシェルスクリプトは、ワンライナーではありませんがワンライナーの応用を使っているので、一応シェル芸のひとつとしてご紹介したいと思います。

まずはいきなりソースを見てみましょう。

#!/bin/bash
LANG=C

ID=<全DBにアクセスできるID rootとか>
PASSWD=<パスワード>

DSTDIR=${HOME}/src/sql

[ ! -d ${DSTDIR} ] && mkdir -p ${DSTDIR}
cd ${DSTDIR}
for A in $(mysql -u ${ID} -p${PASSWD} -e "show databasesG" | egrep ^Database | awk '{print $NF}' | egrep -v '(^information_schema$|^mysql$)')
do
  [ -f 001_${A}.sql.gz ] && mv 001_${A}.sql.gz 002_${A}.sql.gz
  mysqldump -u ${ID} -p${PASSWD} $A > 001_${A}.sql
  gzip 001_${A}.sql
done

このスクリプトの機能ですが、 information_schema と mysql 以外のデータベースをぐるっと一巡して2世代バックアップし、バックアップしたsqlファイルはgzip圧縮しています。ですので、あるDBだけリストアしたいという場合に便利です。

どこがシェル芸?かと言いますと、ソースの11行目にあるfor文です。DBの追加や削除をするたびに、このシェルスクリプトをメンテナンスすることがないよう、MySQLのコマンド「show databases」の結果を食わせています。MySQLのオプションに「-e」をつけることで、bashなどのコマンドラインインターフェイスから直接コマンドを投げることができます。ということは、MySQLの処理をシェルスクリプトに書くことができるわけです。それでは、ここのワンライナーだけ実行してみましょう。

mysql -u root -pPASSWORD_IS_HERE -e "show databasesG" | egrep ^Database | awk '{print $NF}' | egrep -v '(^information_schema$|^mysql$)'

データベースの一覧がコンソールに表示されたかと思います。MySQLコマンドに「G」を加えたので、出力結果の罫線がなく、上記コマンドの出力結果がそのままfor文の引数として使えるというわけです。sedやawkやtrを使いこなせるのもシェル芸のスキルですが、コマンドラインのオプションで表示を綺麗にしてしまえば、パイプで繋ぐ回数も減ってマシンリソースに優しいシェル芸ができます。

ちなみに何故 information_schema と mysql をバックアップ対象から外しているかというと、これらのバックアップが役立つときは、すなわちMySQL全体が壊れたときです。ちまちまリストアするくらいだったらmysqldを再インストールしましょう、という割り切りです。

ね、簡単でしょう?

[amazonjs asin="4797321946" locale="JP" title="入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界"]