図1●バックアップと可用性の違い
図1●バックアップと可用性の違い
[画像のクリックで拡大表示]
図2●バイナリログを使用した差分のリストア
図2●バイナリログを使用した差分のリストア
[画像のクリックで拡大表示]

 今回は,バックアップとリストアについて解説する。MySQL自体は,非常にトラブルが少ないので,あまりバックアップに関する問合せを受けることは少ない。しかし,システムである以上,障害の発生は避けられない。また,別のサーバーに移行する際にも必ず使用するのが,バックアップとリストアである。

MySQLのバックアップとリストアの概要

 MySQLは,標準でいくつかのバックアップ方法を用意している(表1)。これらは,バックアップの用途によって,使い分ける必要がある。

表1●MySQLのバックアップとリストアの概要

概要 バックアップ リストア
テーブルのデータ SELECT INTO OUTFILE LOAD DATA INFILE
テーブル(MyISAM) BACKUP TABLE RESTORE TABLE
データベース ファイルコピー
MYSQLDUMP(コマンドラインツール) MYSQL(コマンドラインツール)
可用性向上 レプリケーション
クラスタリング

 よく,データベースの運用に関する相談の中では,バックアップと可用性(アベイラビリティ)を混同してい場合がある。データベースは,ある瞬間のデータを保存することが目的である。障害が発生した際に保存したデータを再現することにより,復元をおこなう。

 可用性は,障害対策として,できるだけ止めずにデータベースを運用することを目的としている。もし,止める場合にも最小限の時間で,復旧することを目的としている。

 障害が発生した場合に,速やかに復旧することは,非常に重要なことである。そのため,「レプリケーションやクラスタリングを使用すれば万全」と考えるのは,間違いである。もし,レプリケーションやクラスタリング自身に障害が発生すれば,必ずバックアップデータによって,復旧する必要がある。

 また,誤ったデータベース更新を実行した場合,レプリケーションやクラスタリングは,すべてのサーバーが即座に更新を実行する。そのため,バックアップを使用して戻す必要が発生する(図1)。

 スペースの関係ですべてのバックアップ方法を解説することはできないが,代表的な3つの方法に関して解説する。

テーブル内のデータの取出しと流し込み

 最も小規模なバックアップとリストアは,テーブルデータの取出しと流し込みだろう。既に稼働しているデータ-ベースから,データを取出したり,他のデータベースから抜き出したデータを流し込むなど,色々なシチュエーションが考えられる。

データの取出し(SELECT * INTO OUTFILE)

 MySQLでデータの取出しは,SELECTステートメントのINTO OUTFILE 句を使用して行う。INTO OUTFILE 句を追加すると,SELECTステートメントの実行結果を指定したディレクトリにファイルとして保存する。

リスト1●データの取出し(1)

mysql> SELECT * INTO OUTFILE '/tmp/test.txt' FROM yotei;
Query OK,5 rows affected (0.12 sec)

 取り出したファイルの内容は,次の通りとなる。


リスト2●ファイル「test.txt」の内容

1	定例ミーティング	3
2	セミナー	1
3	面接	2
4	TQC	1
5	同好会	1

 INTO OUTFILE句で作成したテキストファイルは,デフォルト状態ではフィールドの区切りにタブ(\t),行の区切りにLF(\n)を使用する。例えば,CSVファイルとして作成する場合には,次のようにする。

リスト3●データの取出し(2)

mysql> SELECT * INTO OUTFILE '/tmp/test.cvs' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' FROM yotei;
Query OK,5 rows affected (0.00 sec)


リスト4●ファイル「test.cvs」の内容

1,定例ミーティング,3
2,セミナー,1
3,面接,2
4,TQC,1
5,同好会,1

データの流し込み(SELECT * INTO OUTFILE)

作成したデータは,LOAD DATAステートメントにてテーブルに流し込むことができる。LOAD DATAステートメントは,文字コードの変換は行わない。そのため,2バイトデータを含む場合には,事前に対象のテーブルの文字コードと合わせる必要がある。


リスト5●データの流込み

mysql> LOAD DATA INFILE '/tmp/test.txt' INTO TABLE yotei;
Query OK,5 rows affected (0.02 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from yotei;
+------+------------------+---------+
| no   | title            | room_no |
+------+------------------+---------+
|    1 | 定例ミーティング |       3 |
|    2 | セミナー         |       1 |
|    3 | 面接             |       2 |
|    4 | TQC              |       1 |
|    5 | 同好会           |       1 |
+------+------------------+---------+
5 rows in set (0.02 sec)

 このように簡単にテーブル内のデータを出し入れすることが可能である。

 OSのコピーコマンドを使用してバックアップとリストアを行うことも可能だ。