【发布时间】: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.重点是静默,意思是没有警告。