[MySQL] MySQLバックアップシェルスクリプト
皆さんこんにちは。今年も半分\(^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の世界”]