mita2 database life

主にMySQLに関するメモです

Index column size too large エラーでレプリケーションが停止

マスターが MySQL 5.5 で スレーブが 5.6 の構成で、Index column size too large エラー でCREATE TABLEがコケてレプリケーションが止まった。

はて?5.5で通ったDDLがなぜ5.6でエラー?

mysql> SET GLOBAL innodb_large_prefix=OFF;
Query OK, 0 rows affected (0.00 sec)

-- warning が出てインデックス長は自動的に切り詰められる
mysql> CREATE TABLE t (pk serial, col1 varchar(2000), index(col1));
Query OK, 0 rows affected, 1 warning (0.19 sec)
mysql> SET GLOBAL innodb_large_prefix=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t2 (pk serial, col1 varchar(2000), index(col1));
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

innodb_large_prefix による挙動の違いでした。
innodb_large_prefix が OFF のときは、warning でクエリは通る(インデックス長は自動で短くされてしまう)が、ONだとエラーになるようだ。
innodb_large_prefix がマスター(5.5)ではOFFで、スレーブ(5.6)ではON になっていた。

「せっかくinndb_large_prefix をONにしてるんだから、ROW_FORMAT=Dynamicを指定すれば、長いインデックス作れますよ!」というMySQLさんのアピールか。

スレーブのinnodb_large_prefixをOFFにしてレプリケーション再開することで復旧。

実はさらに孫スレーブが5.7なのだが、5.7ではinnodb_default_row_format が Dynamic になっててエラーにならなかった&長いインデックスが作成されてた。MySQLの歴史を感じた。