2015年3月3日火曜日

MySQL 5.6のInnoDB FTSはFLUSH TABLE FOR EXPORTできない

何かのはずみでFLUSH TABLE .. FOR EXPORTでInnoDBのテーブルをバックアップしようとしたら、なんかワーニングが出たのでメモ。

(FLUSH TABLE .. FOR EXPORTについては 日々の覚書: MySQLインスタンス間でテーブルを移行する投げ遣りベンチマーク の一番最後にやり方を書いた記憶がある)


まずはInnoDB FullTextを持ったテーブルを作る…のは、マニュアルのサンプルを丸コピーした。


mysql56> CREATE TABLE articles (
    ->       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->       title VARCHAR(200),
    ->       body TEXT,
    ->       FULLTEXT (title,body)
    ->     ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.15 sec)

mysql56> INSERT INTO articles (title,body) VALUES
    ->     ('MySQL Tutorial','DBMS stands for DataBase ...'),
    ->     ('How To Use MySQL Well','After you went through a ...'),
    ->     ('Optimizing MySQL','In this tutorial we will show ...'),
    ->     ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ->     ('MySQL vs. YourSQL','In the following database comparison ...'),
    ->     ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql56> SELECT * FROM articles
    ->     WHERE MATCH (title,body)
    ->     AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

この状態でFLUSH TABLE articles FOR EXPORTすると、


mysql56> FLUSH TABLE articles FOR EXPORT;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql56> SHOW WARNINGS;
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1235 | InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES on tables that have an FTS index. FTS auxiliary tables will not be flushed.' |
| Warning | 1235 | InnoDB: This version of MySQL doesn't yet support 'FLUSH TABLES on tables that have an FTS index. FTS auxiliary tables will not be flushed.' |
+---------+------+----------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

わーにんぐ。同じメッセージが2回出てるのはバグかな。。

【2015/03/04 00:26】
レポートしてVerifyしてもらいました。MySQL Bugs: #76121: Warning 1235, "FTS auxiliary tables will not be flushed" is printed twice.


この状態でdatadirの下のディレクトリを覗くと、


$ ll d1
合計 1188
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_1.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_2.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_3.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_4.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_5.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_000000000000006f_INDEX_6.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_BEING_DELETED.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_BEING_DELETED_CACHE.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_CONFIG.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_DELETED.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 16:09 2015 FTS_000000000000005b_DELETED_CACHE.ibd
-rw-rw---- 1 mysql mysql    700  3月  3 16:10 2015 articles.cfg
-rw-rw---- 1 mysql mysql   8618  3月  3 16:09 2015 articles.frm
-rw-rw---- 1 mysql mysql 114688  3月  3 16:09 2015 articles.ibd
-rw-rw---- 1 mysql mysql     61  3月  3 16:09 2015 db.opt

いつものやつらと.cfgファイル(これはFLUSH TABLE FOR EXPORTすると作られる。UNLOCKすると消える)の他に、見覚えのない.ibdファイルがいっぱい。こいつらがどうもFullText Indexの実体の様子。

コピー先にd3というスキーマを使うことにしてセットアップ。


mysql56> create database d3;
Query OK, 1 row affected (0.00 sec)

mysql56> use d3
Database changed

mysql56> CREATE TABLE articles (       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,       title VARCHAR(200),       body TEXT,       FULLTEXT (title,body)     ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.15 sec)

$ ll ../d3
合計 1184
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_1.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_2.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_3.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_4.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_5.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_000000000000008b_INDEX_6.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_BEING_DELETED.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_BEING_DELETED_CACHE.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_CONFIG.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_DELETED.ibd
-rw-rw---- 1 mysql mysql  98304  3月  3 17:10 2015 FTS_0000000000000074_DELETED_CACHE.ibd
-rw-rw---- 1 mysql mysql   8618  3月  3 17:10 2015 articles.frm
-rw-rw---- 1 mysql mysql 114688  3月  3 17:10 2015 articles.ibd
-rw-rw---- 1 mysql mysql     61  3月  3 17:10 2015 db.opt

FullText Index作った時点で作られるのねこのひとたち。


mysql56> ALTER TABLE articles DISCARD TABLESPACE;
Query OK, 0 rows affected (0.01 sec)

$ ll d3
合計 16
-rw-rw---- 1 ttanaka ttanaka 8618  3月  3 17:10 2015 articles.frm
-rw-rw---- 1 ttanaka ttanaka   61  3月  3 17:10 2015 db.opt

DISCARD TABLESPACEしたら一緒に消えた。。


$ cp -ip d1/*.{cfg,ibd} d3/

mysql56> ALTER TABLE articles IMPORT TABLESPACE;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql56> SHOW WARNINGS;
+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1817 | InnoDB: Index corrupt: Index '"title"' not found or corrupt, you should recreate this index. |
+---------+------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql56> SELECT * FROM articles
    ->     WHERE MATCH (title,body)
    ->     AGAINST ('database' IN NATURAL LANGUAGE MODE);
ERROR 1764 (HY000): The table does not have FULLTEXT index to support this query


おー。確かにできないー。
まあMroongaさんもできないっちゃできないし、全く構わない気もする。

あとこれ5.6.23なので、MeCab関係なくInnoDBのFTSとしてこういう動作。ってことは5.7.6のMeCab, Ngramでもこうなるんだろうなぁ。。

0 件のコメント :

コメントを投稿