因此,我有一个Flyway迁移,几年前成功应用于较旧版本的MariaDB。
较新版的MariaDB现在更加严格,并导致同一迁移出错。这个迁移有一个合法的问题,我想修复基线的新运行(例如在我的CI环境中构建,或者在新的devleoper的笔记本电脑上),以及我所有现有的数据库(在我尝试将它们升级到之前)一个较新的MariaDB版本,可能会失败)。
什么是正确的解决方案?
具体来说,问题是我正在迁移最初使用ENGINE=MyISAM ROW_FORMAT=FIXED
到ENGINE=InnoDB
的表 - MariaDB 10.1接受了这一点,但是除非我还添加了ROW_FORMAT=DEFAULT
,否则更新的MariaDB版本似乎失败了。
CREATE TABLE FOO ( ... )
ENGINE=MyISAM ROW_FORMAT=FIXED;
ALTER TABLE FOO
ENGINE=InnoDB;
后一种语句在较新的MariaDB版本上失败了(也可能对MySQL也不确定?)。
但是这个陈述有效:
ALTER TABLE FOO
ENGINE=InnoDB ROW_FORMAT=DEFAULT;
问题是前面的语句在内部尝试执行类似这样的操作,但失败了:
CREATE TABLE FOO ( ... )
ENGINE=InnoDB ROW_FORMAT=FIXED;
InnoDB没有ROW_FORMAT = FIXED。在旧版本中,变量innodb_strict_mode设置为0,在这种情况下会发出警告,并且在转换时使用ROW_FORMAT = COMPACT。
ALTER TABLE FOO ENGINE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql [localhost] {msandbox} (test) > SHOW WARNINGS;
+---------+------+--------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------+
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=COMPACT. |
+---------+------+--------------------------------------+
在较新的版本中,innodb_strict_mode设置为1,因此返回错误。
ALTER TABLE FOO ENGINE=InnoDB;
ERROR 1005 (HY000): Can't create table `test`.`FOO` (errno: 140 "Wrong create options")
您可以在会话期间设置变量0,以便复制旧行为。
set innodb_strict_mode=0;
参考文献:
处理此问题的最佳方法可能是仔细修改迁移并发出flyway repair
以使用磁盘上的新校验和重新校准数据库中的校验和。