MySQL 5.1.47リリース

出ました。今回は機能追加が1件、バグ修正が28件あります。バグ修正のうちセキュリティに関するものが3件、レプリケーションに関するものが2件となっています。

InnoDB Plugin 1.0.8

MySQL 5.1.46で1.0.7 GAとなったInnoDB Pluginですが、今回のリリースで早速バージョンアップが行われました。ざっと見たところInnoDB Pluginの新しいデータフォーマットに関するバグ修正が目立ちますので、新しいデータフォーマットを使っている場合はアップグレードした方がよいと思います。

  • COMPRESSEDテーブルを利用している場合、InnoDBページの分割時に無限ループにおちいることがあった (Bug#52964)
  • プレフィックスインデックスを利用している場合、DYNAMICおよびCOMPRESSEDテーブルのデータ削除に伴ってアサーションエラーが出ることがあった (Bug#52746)
  • DYNAMICおよびCOMPRESSEDテーブルにおいて、データを別のInnoDBページに格納するフラグの扱いが誤っていた (Bug#52745)

InnoDB Pluginの新しいデータフォーマットについては昨年MySQL InnoDB Pluginのデータ圧縮機能 - SH2の日記で解説しています。以下のようにして使うことができますが、今のところデフォルトでOFFになっている機能なので影響のあるシステムはほとんどないと思います。

CREATE TABLE `text` (
  `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `old_text` mediumblob NOT NULL,
  `old_flags` tinyblob NOT NULL,
  PRIMARY KEY (`old_id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8

上記のエントリにはBug#52964で問題となっているInnoDBページの分割処理についてもまとめていますので、興味があればご覧ください。
プレフィックスインデックスとはカラムの前方一部に対してインデックスを作成するものです。インデックスのサイズが小さくなるというメリットがありますが、インデックスだけではデータを絞りきれなくなるデメリットもあります。

mysql> create index emp_ix1 on emp (ename(2));
Query OK, 0 rows affected (0.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

InnoDBが特定のデータを別のページに格納する仕組みについては、リファレンスマニュアルをご参照ください。

長さが半ページ未満の行では、そのすべてがローカルのページ内に格納されます。半ページを超える行では、その行が半ページ以内に収まるように、可変長カラムが外部オフページストレージの対象として選択されます。オフページストレージの対象として選択されたカラムでは、InnoDB は最初の 768 バイトをローカルの行内に格納し、残りを外部のオーバーフローページ内に格納します。そのようなカラムはそれぞれ、独自のオーバーフローページリストを持ちます。768 バイトの先頭部分に続く 20 バイトの値には、カラムの実際の長さと、値の残りの部分が格納されたオーバーフローページのリストへのポインタとが格納されます。

この説明は、現在デフォルトで用いられているCOMPACTテーブルに対してのものです。DYNAMICおよびCOMPRESSテーブルの場合は、サイズの大きなカラムについて「最初の768バイトをローカルの行内に格納」するのではなく「全てのバイトデータを行外に格納」するように変更されました。これによって、クラスタインデックスのサイズがこれまでよりも小さく保たれるようになりました。

セキュリティ修正

MySQL 5.1.47ではセキュリティ修正が3件あります。いずれもMySQL通信プロトコル脆弱性で、細工をしたパケットを送り込むことで本来アクセス権限のないテーブルのデータを読み取るなどの攻撃が行われるものです。CVEにも登録されているようですので、必要に応じて対処を行ってください。
また、これらのセキュリティ修正のために今回あわせてMySQL 5.0.91もリリースされています。