MySQLのデータをgzip形式でエクスポートした場合、今度は、逆にインポート処理が必要になる場合があります。
そこで、ここでは、gzip形式のバックアップファイルから、MySQLデータをリストアしてインポートする方法を覚書しておきます。
なお、使用サーバーは、CORESERVERです。また、お約束ですが、ご利用は、自己責任でお願いします。あと、もちろん、phpMyAdminからインポートする方法等もありますが、ここでは取り上げません。
■ SSHでコマンドラインから実行する方法
まず、SSHログインしていて、コマンドラインから実行するには次のコマンドでインポートが可能です。
zcat /virtual/yours/backup/sample.gz | mysql -h localhost -u user --password=pass your_db
上記スクリプトは、実質1行です。また、赤字は、ユーザー依存のデータであり、適当な値に置き換えが必要です。
簡単に解説しておくと、zcatコマンドで、gzファイル(絶対パス)を開き読み込みます。その後、パイプ(|)でmysqlコマンドに渡し、読み込んだデータ(SQL)を処理します。
SSHでコマンドラインからインポートすると処理が軽いので短時間でインポートが済むメリットがあります。
■ CRONから自動実行する方法
次に、上記スクリプトを改良して、CRONから、実行できるようにしたスクリプトを紹介します。使い方としては、毎日バックアップしたデータから、日毎の最新データを毎日、自動的にインポートする処理等が考えられます。
なお、これもCORESERVERで実行する場合です。shファイルとして保存し、CRON設定画面で処理ができるようにしておきます。例えば、import.shと保存して、CRON設定画面でファイル等を指定します。
#!/bin/sh DATE=`date -d '1 days ago' +'%Y%m%d'` EXT=.gz zcat /virtual/yours/db_backup/$DATE$EXT | /usr/local/mysql/bin/mysql -h localhost -u user --password=pass your_db exit
ピンクの文字は、bashの変数となっています。変数の前後にはスペースは入れません。また、gzファイルは、20140227.gzのように日付をファイル名にしておきます。
ここでは、1日前のデータを利用したいので、’1 days ago’を指定していますが、これを消せば、当日のデータがインポートされます。
最初のスクリプトと異なるのは、mysqlコマンドが絶対パスになっていることです。CORESERVERでは、CRONから実行する場合、絶対パスにしないと動作しませんでした。パスを解決できないからと思われます。
なお、コマンドのパスを調べるには、whichコマンドで確認することができます。
以上、MySQLをgzipからインポートする方法の覚書でした。