現象
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 — データベースバックアッププログラム