因此,我进行了一次Flyway迁移,几年前已成功将其应用于旧版本的MariaDB。
MariaDB的较新版本现在更加严格,并且在相同的迁移上导致错误。我想解决该迁移的合法性问题,以解决从基线开始的新运行(例如,在我的CI环境中构建,或在新的devleoper的便携式计算机上构建)以及所有现有数据库(在尝试将其升级到之前)较新的MariaDB版本,可能会失败)。
什么是正确的解决方案?
具体来说,问题是我正在将原来使用ENGINE=MyISAM ROW_FORMAT=FIXED
的表迁移到ENGINE=InnoDB
- MariaDB 10.1接受,但是除非我也添加{ {1}}。
ROW_FORMAT=DEFAULT
CREATE TABLE FOO ( ... )
ENGINE=MyISAM ROW_FORMAT=FIXED;
后一个语句在较新的MariaDB版本上失败(可能对MySQL也是不确定的?)。
此语句有效,但是:
ALTER TABLE FOO
ENGINE=InnoDB;
问题在于,先前的语句在内部尝试执行以下操作,但失败了:
ALTER TABLE FOO
ENGINE=InnoDB ROW_FORMAT=DEFAULT;
答案 0 :(得分:0)
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;
参考文献:
答案 1 :(得分:0)
处理此问题的最佳方法可能是仔细修改迁移并发出flyway repair
以将数据库中的校验和与磁盘上的新校验和重新对齐。
答案 2 :(得分:0)
将mariadb 10.1设置为严格模式,让我可以在mariadb 10.3上导出和导入数据
错误的创建表选项错误消息消失了。
set innodb_strict_mode=0;