執行 ROLLBACK 出現 Warning: Some non-transactional changed tables couldn't be rolled back,表示交易中混入非交易型表(如 MyISAM)。本文說明原因、如何檢查表引擎、以及解決策略。
Warning: Some non-transactional changed tables couldn't be rolled back.
意味著:交易內修改的表中,有不支援交易的引擎(MyISAM、MEMORY、CSV 等),這些表的變更**無法回滾**,已永久生效。
CREATE TABLE 未指定 ENGINE=InnoDB--skip-innodb)-- 方法一
SHOW TABLE STATUS LIKE 'tbl_name'\G
-- 關注 Engine 欄位
-- 方法二
SHOW CREATE TABLE tbl_name\G
-- 結尾會顯示 ENGINE=...
-- 方法三(資訊架構)
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tbl_name'
SHOW ENGINES\G
-- Support 欄位:YES/DEFAULT/NO/DISABLED
-- 或檢查變數
SHOW VARIABLES LIKE 'have_%';
-- have_innodb = YES 表示可用
ALTER TABLE tbl_name ENGINE=InnoDB
CREATE TABLE tbl_name_new (LIKE tbl_name) ENGINE=InnoDB;
INSERT INTO tbl_name_new SELECT * FROM tbl_name;
RENAME TABLE tbl_name TO tbl_name_old, tbl_name_new TO tbl_name;
DROP TABLE tbl_name_old;
💡 MySQL 5.6+ 可用 ALTER TABLE ... ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE 線上轉換。
CREATE TABLE **永遠顯式指定 ENGINE=InnoDB**default-storage-engine=InnoDBSELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE <> 'InnoDB' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')