読者です 読者をやめる 読者になる 読者になる

mysqldumpでROW_FORMATが出力されなくなった #mysql

現象

MySQLを5.5から5.6にしたら、mysqldumpした際のDDL( CREATE TABLE とか)に、ROW_FORMATが出力されなくなった。
importでこけたので調査してみたらCompactで作成されており、追いかけてみるとdumpした時点のDDLにROW_FORMATの出力がなかった。

エラーメッセージ。

ERROR 1118 (42000) at line XXXX: Row size too large (> XXXX). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

ほんとは下記のように出力されて欲しい。

CREATE TABLE `table_name` (
  /* 略 */
) ENGINE=InnoDB AUTO_INCREMENT=5095266 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

対応

どうもmysqldumpに --compatible=ansi オプションをつけていたのが原因だったよう。

copatibleオプションは

古い MySQL サーバーやほかのデータベースシステムとの互換性がより高い出力を生成します。

とあるので、MySQL固有であるROW_FORMATを出力しなくなったということなのだろう。
オプションを外したら出力されるようになった。

メモ

-- ファイルフォーマットの設定確認
SHOW GLOBAL VARIABLES LIKE 'innodb_file_format';

-- ROWフォーマット確認
select TABLE_SCHEMA, TABLE_NAME,  ROW_FORMAT from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='schema_name' and ROW_FORMAT!='Compact';

-- テーブルごとのROWフォーマット確認
SHOW TABLE STATUS LIKE 'table_name';

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.4 mysqldump — データベースバックアッププログラム