【问题标题】:How to handle a previous Flyway migration becoming invalid in newer DB versions?如何处理以前的 Flyway 迁移在较新的数据库版本中变得无效?
【发布时间】:2019-09-19 13:53:21
【问题描述】:

所以,我有一个 Flyway 迁移,几年前成功应用到旧版本的 MariaDB。

较新版本的 MariaDB 现在更加严格,并且会在同一迁移中导致错误。该迁移存在一个合法问题,我想为从基线开始的新运行(例如在我的 CI 环境中构建,或在新的开发人员的笔记本电脑上构建)和我所有现有的数据库(在我尝试将它们升级到较新的 MariaDB 版本,可能会失败)。

什么是正确的解决方案?

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

具体来说,问题在于我正在将最初使用 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;

【问题讨论】:

  • 这不适用于 mysql - 如果 ROW_FORMAT 选项被省略,则意味着 ROW_FORMAT=DEFAULT。因此删除了 mysql 标签。
  • 我不确定这是否完全符合这里的情况,请查看我上面的修改并告诉我是否仍然适合您?
  • 在mysql上还是没问题。 Mysql 文档明确表示When a ROW_FORMAT option is not specified explicitly, or when ROW_FORMAT=DEFAULT is used, an operation that rebuilds a table silently changes the row format of the table to the format defined by the innodb_default_row_format variable. 重点是静默,意思是没有警告。

标签: mariadb flyway


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 的上下文中处理这个问题。我知道围绕“严格模式”的行为发生了变化,我只想修复这些原本“不可变”的过去迁移,以便在该严格模式下正常运行。
    【解决方案3】:

    将 mariadb 10.1 设置为严格模式,让我在 mariadb 10.3 上导出和导入数据

    错误的创建表选项错误消息消失了。

    set innodb_strict_mode=0;
    

    https://mariadb.com/kb/en/innodb-strict-mode/

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2012-11-21
      • 2017-05-21
      • 2012-08-06
      • 2017-08-05
      • 2016-09-12
      • 2011-11-05
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多