如何处理以前的飞行迁移在较新的DB版本中变得无效



所以,我有一个飞行迁移,几年前成功地应用于较旧版本的Mariadb。

MariadB的较新版本现在更加严格,并在同一迁移中导致错误。该迁移存在一个合法的问题,我想对基线的新鲜运行进行修复(例如,在我的CI环境中或在新的Devleoper的笔记本电脑上构建(,以及我所有现有的数据库(在我试图将其升级到之前(较新的Mariadb版本,可能会失败(。

正确的解决方案是什么?

  • 更改迁移,并添加一个进行相同修复程序的新迁移(另一个Alter表...(,这将有效地是新创建的DBS的NOOP,但可以修复我的现有内容。
  • 在解决问题的情况下,添加一个新的迁移版本的零下序列版本。希望这意味着新的DBS将在破裂迁移之前应用,现有安装将在我的任何新迁移之前应用它?

具体而言,问题是我正在迁移一张表,该表最初是使用ENGINE=MyISAM ROW_FORMAT=FIXEDENGINE=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/

最新更新