最近優化GTID模式下事務表和非事務表更新報錯處理時,發現某幾張表更改存儲引擎為InnoDB報錯如下:
mysql> alter table sc_xxx_video_xxxxengine = innodb; ERROR 1031 (HY000): Table storage engine for '#sql-81a_32739' doesn't have this option
查看報錯的幾張表的定義語句如下:
CREATE TABLE `sc_sys_vedio_relation` ( `catalog_id` int(11) NOT NULL COMMENT '視頻目錄id', `vedio_id` int(11) NOT NULL COMMENT '視頻資源id' ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED
發現報錯的幾張表的ROW_FORMAT格式都是FIXED,並不是我們熟悉的Dynamic。查看資料和官方文檔發現不同版本或者不同源的MySQL對於行記錄格式的處理方式不一樣,解決上述問題就先要了解row_format的改進歷程,這里簡單介紹下MyISAM和InnoDB兩種存儲引擎對於row_format格式的處理。
MyISAM行存儲
MyISAM有3種行存儲格式:fixed/dynamic/compressed
1、fixed:為默認格式,只有當表不包含變長字段(varchar/varbinary/blob/text)時使用,該每行都是固定的,所以很容易獲取行在頁上的具體位置,存取效率比較高,但是占用磁盤空間較多
2、dynamic:每行都有一個行頭部,包含bitmap,用以記錄那些列為空(NULL列不算為空)
3、compressed只能通過myisampack創建且為只讀
InnoDB行存儲
Innodb plugin新引入Barracuda,其包含compressed/dynamic兩種行格式,而之前的compact/redundant統屬於antelope;目前可選值為Antelope和Barracuda,低版本默認為Antelope,高版本默認為Barracuda。
了解這兩種存儲引擎如上兩種row_format格式后,就能明白對一張MyISAM表且row_format為fixed格式的表更改存儲殷勤為InnoDB肯定是不行的,因為InnoDB的row_format不支持fixed格式。所以可以先備份要更改引擎的表數據,然后將表的row_format更改為存儲引擎都能識別的row_format,再進行引擎的變更。
mysql> alter table sc_xxx_video_xxxxROW_FORMAT = default; Query OK, 0 rows affected (0.15 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table sc_xxx_video_xxxxengine = innodb; Query OK, 0 rows affected (2.67 sec) Records: 0 Duplicates: 0 Warnings: 0