所以,我有一个飞行迁移,几年前成功地应用于较旧版本的Mariadb。
MariadB的较新版本现在更加严格,并在同一迁移中导致错误。该迁移存在一个合法的问题,我想对基线的新鲜运行进行修复(例如,在我的CI环境中或在新的Devleoper的笔记本电脑上构建(,以及我所有现有的数据库(在我试图将其升级到之前(较新的Mariadb版本,可能会失败(。
正确的解决方案是什么?
- 更改迁移,并添加一个进行相同修复程序的新迁移(另一个Alter表...(,这将有效地是新创建的DBS的NOOP,但可以修复我的现有内容。
- 在解决问题的情况下,添加一个新的迁移版本的零下序列版本。希望这意味着新的DBS将在破裂迁移之前应用,现有安装将在我的任何新迁移之前应用它?
具体而言,问题是我正在迁移一张表,该表最初是使用ENGINE=MyISAM ROW_FORMAT=FIXED
到ENGINE=InnoDB
-Mariadb 10.1接受的,但是较新的MariadB版本似乎失败了,除非我也添加ROW_FORMAT=DEFAULT
。
基线
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;
处理此操作的最佳方法可能是仔细修改迁移并发出flyway repair
,以在数据库中使用磁盘上的新校验和进行调整。
innodb没有row_format =固定。在较旧的版本中,变量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;
参考:
- https://mariadb.com/kb/en/library/xtradbinnodb-strict-mode/
- https://mariadb.com/kb/en/library/innodb-system-variables/#innodb_strict_mode
- https://mariadb.com/kb/en/library/myisam-storage-formats/#fixed-length
- https://mariadb.com/kb/en/library/innodb-storage-formats/
设置Mariadb 10.1对严格模式,让我导出并导入MariadB 10.3 10.3
上的数据错误的创建表选项错误消息已经消失。
set innodb_strict_mode=0;
https://mariadb.com/kb/en/innodb-strict-mode/