Mroongaブログ

2019-07-30

Mroonga 9.05リリース!

Mroonga 9.05 をリリースしました!

変更点

今回の変更点は以下の通りです。

  • MySQL 5.6.45と5.7.27とMySQL 8.0.17への対応
  • ユニークインデックスを更新する際の不具合を修正

ユニークインデックスを更新する際の不具合を修正しているので、すでにユニークインデックスを作っている人はテーブルを作り直す必要があります。 既存のユニークインデックスにゴミが残っているかもしれないからです。詳細は後述します。

また、Mroongaの変更点ではないのですが、Groonga 9.0.5で大きな全文検索用のインデックスを更新したときにクラッシュする可能性のある不具合が修正されているので、クラッシュする問題を踏んでいる場合には、アップグレードすることで解決するかもしれません。

MySQL 5.6.45と5.7.27とMySQL 8.0.17への対応

今回のリリースでは、MySQLの各バージョンのアップデートに追従するパッケージをリリースしました。 MySQL 8.0向けのパッケージでサポートしていなかった TIMESTAMP 型にも対応しています。

MySQL 8.0向けパッケージには制限がいくつかあります。もし不具合や疑わしい挙動をみつけたら報告してくれると助かります。

なお、MySQL8.0に関する既知の問題は以下の通りです。

  • ラッパーモードは未対応
  • ストレージモードでも JSON データ型は未対応

[ストレージモード] ユニークインデックスを更新する際の不具合を修正

今回のリリースでは、ユニークインデックスを更新する際の不具合を修正しました。

以下の条件を満たすと INSERT 時にキーの重複エラーが発生していました。

  • ユニークインデックスをマルチカラムに対して作成する
  • ユニークキーのカラムの一部が更新される

例えば、次のようなサンプルでエラーが再現します。

MySQL [test]> CREATE TABLE fts_targets (
    ->   id int(11) NOT NULL AUTO_INCREMENT,
    ->   source_id int(11) NOT NULL,
    ->   source_type_id int(11) NOT NULL,
    ->   PRIMARY KEY (id),
    ->   -- Multiple column unique index
    ->   UNIQUE KEY (source_id, source_type_id)
    -> ) DEFAULT CHARSET=utf8mb4 ENGINE=Mroonga;
Query OK, 0 rows affected (0.027 sec)

MySQL [test]> INSERT INTO fts_targets (source_id, source_type_id) VALUES (10, 100);
Query OK, 1 row affected (0.006 sec)

MySQL [test]> UPDATE fts_targets SET source_id = 11 WHERE id = 1;
Query OK, 1 row affected (0.001 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MySQL [test]> INSERT INTO fts_targets (source_id, source_type_id) VALUES (10, 100);
ERROR 1062 (23000): Duplicate entry '10-100' for key 'source_id'

上記のようなケースで、古いインデックスのエントリが削除されず、キーの重複が発生してしまっていました。

冒頭でも述べましたが、すでにユニークインデックスを作っている人はテーブルを作り直す必要があります。 テーブルを作り直すには、ダンプ・リストアするか、以下の手順を実行してください。

ALTER TABLE (ユニークインデックスを作ったテーブル) DISABLE KEYS;
ALTER TABLE (ユニークインデックスを作ったテーブル) FORCE;
ALTER TABLE (ユニークインデックスを作ったテーブル) ENABLE KEYS;

おわりに

9.04からの詳細な変更点は9.05リリース - 2019-07-30を確認してください。

それでは、Mroongaでガンガン検索してください!