如何处理先前的Flyway迁移在较新的DB版本中变为无效?

问题描述 投票:2回答:2

因此,我有一个Flyway迁移,几年前成功应用于较旧版本的MariaDB。

较新版的MariaDB现在更加严格,并导致同一迁移出错。这个迁移有一个合法的问题,我想修复基线的新运行(例如在我的CI环境中构建,或者在新的devleoper的笔记本电脑上),以及我所有现有的数据库(在我尝试将它们升级到之前)一个较新的MariaDB版本,可能会失败)。

什么是正确的解决方案?

  • 改变迁移,并添加一个新的,执行相同的修复(另一个ALTER TABLE ...),它将有效地成为新创建的数据库的noop,但将修复我现有的东西。
  • 在破坏之前添加一个无序版本的新版本,这可以解决问题。希望这意味着新数据库将在中断迁移之前应用,现有安装将在我的任何新迁移之前应用它?

具体来说,问题是我正在迁移最初使用ENGINE=MyISAM ROW_FORMAT=FIXEDENGINE=InnoDB的表 - MariaDB 10.1接受了这一点,但是除非我还添加了ROW_FORMAT=DEFAULT,否则更新的MariaDB版本似乎失败了。


Baseline

CREATE TABLE FOO ( ... )
   ENGINE=MyISAM ROW_FORMAT=FIXED;

Later Migration

ALTER TABLE FOO
  ENGINE=InnoDB;

后一种语句在较新的MariaDB版本上失败了(也可能对MySQL也不确定?)。

但是这个陈述有效:

ALTER TABLE FOO
  ENGINE=InnoDB ROW_FORMAT=DEFAULT;

问题是前面的语句在内部尝试执行类似这样的操作,但失败了:

CREATE TABLE FOO ( ... )
   ENGINE=InnoDB ROW_FORMAT=FIXED;
mariadb flyway
2个回答
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;

参考文献:


0
投票

处理此问题的最佳方法可能是仔细修改迁移并发出flyway repair以使用磁盘上的新校验和重新校准数据库中的校验和。

© www.soinside.com 2019 - 2024. All rights reserved.