MySQLデータのバックアップ方法
本稿は、最近O’Reillyから出版された書籍『 Linux System Administration 』の抜粋。
MySQLサーバを休みなく稼働させ続ける必要がないなら、以下に示すような圧縮なしのオフラインバックアップ手法が手っとり早い。
- MySQLサーバを停止させる。
# /etc/init.d/mysqld stop
- MySQLのデータファイルおよびディレクトリをコピーする。例えば、MySQLのデータディレクトリ/var/lib/mysqlを/tmp/mysql-backupに保存する場合は、次のようにする。
# cp -r /var/lib/mysql /tmp/mysql-backup
cp
の代わりに、rsync
、tar
、gzip
などのコマンドを使ってもよい。
- MySQLサーバを起動し直す。
# /etc/init.d/mysqld start
これに対し、オンラインバックアップは一筋縄ではいかない。相互に依存するMyISAMテーブルがある(外部キーやトランザクションは存在しない)場合は、各テーブルを順にロックし、そのファイルをコピーしてからロック解除を行うことができる。しかし、InnoDBテーブルが存在する場合や、誰かが複数のテーブルを必要とするトランザクションを書く可能性もある。幸いにして、そうした場合のためにmysqlhotcopy、mysqlsnapshot、レプリケーション(replication)、mysqldumpといった商用でない手頃なソリューションがいくつか存在する。
mysqlhotcopyは、ISAMテーブルやMyISAMテーブルをそのままの形でオンラインバックアップするPerlスクリプトである。manページには多数のオプションが記されているが、以下ではdrupalと名付けられた単体のデータベースのバックアップ方法を示す。
# mysqlhotcopy -u user -p password drupal /tmp Locked 57 tables in 0 seconds. Flushed tables ('drupal'.'access', 'drupal'.'accesslog', 'drupal'.'aggregator_ category', 'drupal'.'aggregator_category_feed', 'drupal'.'aggregator_category_item', 'drupal'.'aggregator_feed', 'drupal'.'aggregator_item', 'drupal'.'authmap', 'drupal'. 'blocks', 'drupal'.'book', 'drupal'.'boxes', 'drupal'.'cache', 'drupal'.'client', 'drupal'.'client_system', 'drupal'.'comments', 'drupal'.'contact', 'drupal'.'file_ revisions', 'drupal'.'files', 'drupal'.'filter_formats', 'drupal'.'filters', 'drupal'.'flood', 'drupal'.'forum', 'drupal'.'history', 'drupal'.'locales_meta', 'drupal'.'locales_source', 'drupal'.'locales_target', 'drupal'.'menu', 'drupal'. 'node', 'drupal'.'node_access', 'drupal'.'node_comment_statistics', 'drupal'.'node_ counter', 'drupal'.'node_revisions', 'drupal'.'permission', 'drupal'.'poll', 'drupal'.'poll_choices', 'drupal'.'poll_votes', 'drupal'.'profile_fields', 'drupal'. 'profile_values', 'drupal'.'role', 'drupal'.'search_dataset', 'drupal'.'search_ index', 'drupal'.'search_total', 'drupal'.'sequences', 'drupal'.'sessions', 'drupal'. 'system', 'drupal'.'term_data', 'drupal'.'term_hierarchy', 'drupal'.'term_node', 'drupal'.'term_relation', 'drupal'.'term_synonym', 'drupal'.'url_alias', 'drupal'. 'users', 'drupal'.'users_roles', 'drupal'.'variable', 'drupal'.'vocabulary', 'drupal'.'vocabulary_node_types', 'drupal'.'watchdog') in 0 seconds. Copying 171 files... Copying indices for 0 files... Unlocked tables. mysqlhotcopy copied 57 tables (171 files) in 1 second (1 seconds overall).
mysqlsnapshot はさらに簡単に使える。こちらは、サーバ上のすべてのISAMテーブルまたはMyISAMテーブルを、データベースごとに1つのtarファイルにまとめてバックアップしてくれる。
# ./mysqlsnapshot -u user -p password -s /tmp --split -n checking for binary logging... ok backing up db drupal... done backing up db mysql... done backing up db test... done snapshot completed in /tmp
MySQLのレプリケーション機能を毎日24時間休みなく利用できる設定にしていれば、上記各方法の1つを使ってスレーブサーバからバックアップを行うことができる。レプリケーション情報(ログや設定ファイルなど)の保存も必要になるだろう。
ハードウェア障害(人的エラーは除く)に対するデータの保護を強化するには、レプリケーションを設定してスレーブサーバ(またはマスタサーバ、あるいはその両方)にRAID 1(ミラーリング)ディスクを用意する。
多くのMySQLサイトは、本来のデータベーストランザクションとより優れた書き込みパフォーマンスを得るために、MyISAMテーブルからInnoDBテーブルにデータを移行している。InnoDBのオンラインバックアップ用には、InnoDBモジュールの開発者によってInnoDB Hot Backupという商用プロダクトが提供されている。
最後に紹介するのがmysqldumpで、ほとんどのマニュアルでは最初に紹介されていることが多い。mysqldumpは、処理を加えずに(一字一句そのままに)コピーするのではなく、指定されたデータベースおよびテーブルのASCIIダンプを生成する。この方法は、InnoDBなどすべての種類のMySQLテーブルで使える。比較的時間がかかり、巨大なテキストファイルが生成されるが、圧縮効率はかなり高い。ときどきこうしたダンプを作成しておくと役に立つ。データベースやテーブルをスクラッチから再作成するためのわかりやすいスクリプトが含まれているからだ。エディタやgrepをはじめとするテキストツールを使えば、ダンプファイルに対して検索をかけたり、変更を加えることができる。
すべてのテーブルをロックして、1つのファイルにダンプするには、次のように入力する。
# mysqldump -u user -ppassword -x --all-databases > /tmp/mysql.dump
次のように、その出力をパイプしてgzip
をかけると、多少は処理時間とサイズを減らすことができる。
# mysqldump -u user -ppassword -x --all-databases | gzip > /
tmp/mysql.dump.gz
Zmanda Recovery Manager for MySQLという新しいオープンソースツール(ダウンロードは無償、サポートは有償)は、こうした方法の多くに対応した便利なフロントエンドである。その注目すべき特徴を以下に示す。
-
コマンドラインインタフェースを備えている
-
ローカルデータベースのバックアップの他、SSLによるリモートデータベースのバックアップにも対応
-
バックアップ処理の状態をメールで通知
-
InnoDBを含む全種類のテーブルに対応
-
従来のバックアップ手法のみ提供。mysqldump、mysqlhotcopy、MySQLのレプリケーション、LVMスナップショットから選択
-
特定のトランザクションや時点へのリカバリに対応
Zmandaは多数のLinuxディストリビューション用の.tar.gzおよび.rpmファイルを提供している。Debian向けのインストール手順については、HowtoForgeを参照するとよい。