ついに,MySQL 5.1.30 GA(GeneralAvailability)がリリースされた。MySQL5.0から3年の歳月をかけて,多くの新機能を搭載した意欲的なバージョンとなっている。

 しかし,現時点では,多く(約180)のバグが残されている。そのため,本番システムに適用するには細心の注意が必要だ。米Sun Microsystemsでは,十分なテストを実施した上での本番システムへの適用を呼び掛けている。

 MySQL 5.1はパーティショニング,イベントなど多くの新機能を搭載しているが,注目したい点は,レプリケーション機能の強化だ。今回は,MySQL5.1で信頼性の高い機能に成長したレプリケーション機能を紹介する。

MySQL 5.0までのレプリケーションと問題点

 MySQLには,手軽なレプリケーション機能が搭載されている。構築が容易でレスポンスが高いことが特徴だ。これにより,データベースの信頼性や可用性を向上させることができる。しかし,旧来のレプリケーションには,手軽さとは裏腹に問題点もあった。その問題点を注意しないと,マスターとスレーブが大きくかい離する状況となる。

 MySQL5.0以前のレプリケーション機能は,SQLステートメント(SQL文)をベースにして同期を行っていた。つまり,マスターで実行したSQLステートメントをスレーブでも実行するという方式だ。

図1●旧来(MySQL5.0まで)のMySQLレプリケーション

 正確にレプリケーションが継続されるには,マスターとスレーブのデータが完全に一致している必要がある。しかし,同じSQLステートメントを実行したも,マスターとスレーブで異なるデータがあった場合,処理内容が異なる場合があるのだ。

 例えば,図2のように条件判断に使用するカラム(フィールド)の内容が異なる場合,処理結果が大きく異なる。さらに,更新対象の値をもとに計算して再格納する場合は,計算結果が異なるため再格納する値も異なる。しかもこの場合,処理自体は正常に実行されるためエラーとはならない。発見はきわめて困難である。

図2●UPDATEステートメントの更新結果(旧来のMySQLレプリケーション)

 このようにMySQL5.0以前では,マスターとスレーブに不整合あると,その不整合が拡大してしまう。つまり,マスターとスレーブに格納されているデータが一致していることを前提に運用を開始しなければならない。スレーブを直接更新するなど,まったくの想定外なのだ。