MySQL 5.1.51リリース

出てます。今回は27件のバグ修正が行われており、そのうちセキュリティに関するものが8件、レプリケーションに関するものが1件、パーティショニングに関するものが1件となっています。InnoDB Pluginは1.0.12にバージョンアップしています。また仕様変更が2件あります。
MySQL 5.1.51ではセキュリティ修正が8件と多いので、内容を確認しておきましょう。

  • LEAST()、GREATEST()など極値を求めるファンクションの引数の評価において型変換エラーが正しく扱われておらず、サーバがクラッシュすることがありました。(Bug#55826)
  • サブクエリの評価によって作成される仮テーブルが、集計処理のために一時テーブルを要求した場合、サーバがクラッシュすることがありました。(Bug#55568)
  • SQL内でユーザ変数への代入を行うと、GROUP BYの処理に備えて一時テーブル上であらかじめ値が計算されます。しかし、その値が一時テーブル作成後に再度評価された場合、一時テーブル上の値が再利用されず結果としてサーバがクラッシュすることがありました。(Bug#55564)
  • LIKE句を含むVIEWを作成する際、LIKE句を評価する部分でサーバがクラッシュすることがありました。(Bug#54568)
  • GROUP_CONCAT()ファンクションとWITH ROLLUP句を同時に用いると、サーバがクラッシュすることがありました。(Bug#54476)
  • GREATEST()あるいはLEAST()ファンクションの引数として数値とLONGBLOBが混在している場合、サーバがクラッシュすることがありました。また、それらのファンクションは中間の一時テーブルを利用して処理されていました。(Bug#54461)
  • ストアドプロシージャあるいはプリペアドステートメント入れ子結合を用いると、サーバが無限ループに陥る場合がありました。(Bug#53544)
  • PolyFromWKB()ファンクションに対して不正なデータを入力すると、サーバがクラッシュすることがありました。(Bug#51875)

現在問題なく動いているシステムが突然攻撃を受けてダウンする、といったタイプのものはないと思います。また今回のセキュリティ修正8件のうち、7件がMySQLサポートエンジニアのShane Bester氏によって報告されたものです。Shane Bester氏はブログもお持ちのようです。

仕様変更 その1

MySQL 5.5.6-rcにおいてCREATE TABLE IF NOT EXISTS ... SELECT ...文の仕様が変更され、それと整合性をとるためにMySQL 5.1.51においても仕様変更が行われました。(Bug#47442Bug#47132Bug#48814Bug#49494)
CREATE TABLE IF NOT EXISTS ... SELECT ...文は、他のテーブルからテーブル定義、データをコピーして新しいテーブルを作るコマンドです。ここで、既に新しいテーブルが作られてしまっているときの挙動は、以下のようになっています。

  • MySQL 5.1.50:警告を出力する。既に存在するテーブルに対してデータを追記する。
  • MySQL 5.1.51:警告を出力する。既に存在するテーブルに対してデータを追記する。
  • MySQL 5.5:エラーを出力する。既に存在するテーブルに対してデータを追記しない。

MySQL 5.1では、既にテーブルがある場合でも後半のSELECT、INSERT処理を実行します。ここまでの挙動はMySQL 5.1.50と5.1.51で同じです。一方MySQL 5.5では、既にテーブルがある場合は後半のSELECT、INSERT処理を実行しません。
問題が発生するのは、MySQL 5.1.50をマスタ、MySQL 5.5をスレーブとしてレプリケーションを構成した場合です。MySQLでは原則的に低いバージョンから高いバージョンへのレプリケーションがサポートされていますが、この構成でCREATE TABLE IF NOT EXISTS ... SELECT ...文を実行すると、「マスタのMySQL 5.1.50にはデータが追記されているが、スレーブのMySQL 5.5にはデータが追記されていない」という状態になってしまいます。
この問題に対処するため、MySQL 5.1.51ではバイナリログに変更が加えられました。具体的には「CREATE TABLE IF NOT EXISTS ... SELECT ...」というSQL文が、バイナリログ上では「CREATE TABLE IF NOT EXISTS ...」と「INSERT ... SELECT ...」という二つのSQL文に分割されて記録されるようになりました。これによって、MySQL 5.5のスレーブに対しても期待通りにデータが追記されるようになりました。
MySQL 5.1とMySQL 5.5でレプリケーションを構成する場合は、MySQL 5.1.51以上を使う、と覚えておけばよいかと思います。

仕様変更 その2

MySQL 5.1.51ではもう一つ、FLUSH LOGS文(またはmysqladmin flush-logs)の仕様が変更されました。(Bug#29751)
FLUSH LOGS文はエラーログなどのログファイルを切り替えるコマンドで、これまでは以下のような動作をしていました。

  1. 現行のログファイルをリネームする(host.err → host.err-old)。
  2. 新しくログファイルをオープンする(host.err)。

今回の仕様変更で、最初のリネームが行われなくなりました。MySQL 5.1.51以降のFLUSH LOGS文は、単にログファイルを一旦クローズしてオープンしなおすという動作になります。これはFLUSH LOGS文を二回連続で実行してしまった際に、host.err-oldファイルが上書きされて内容が消えてしまうことが問題視されたためです。
運用中のシステムにおいて、logrotateなどの設定でhost.err-oldの方をバックアップ対象にしている場合は、MySQL 5.1.51へのアップグレード時に設定変更が必要となります。ご注意ください。