我们正在使用 Liquibase 来部署数据库中的更改,我们在这个领域还很陌生。我现在发现了一些我不确定它是错误还是功能的东西。
例如,我们以这个 yaml 为例:
databaseChangeLog:
- changeSet:
id: FOOBAR-1
failOnError: false
author: anyA
changes:
- createTable:
columns:
- column:
constraints:
nullable: false
name: COLA
type: VARCHAR2(1000 BYTE)
- column:
name: COLB
type: VARCHAR2(1000 BYTE)
- column:
name: VOLC
type: VARCHAR2(1000 BYTE)
- column:
name: COLD
type: VARCHAR2(1000 BYTE)
tableName: FOOBAR
- changeSet:
id: FOOBAR-2
failOnError: false
author: anyA
changes:
- createIndex:
columns:
- column:
name: COLA
indexName: FOOBAR_PK
tableName: FOOBAR
unique: true
- changeSet:
id: FOOBAR-3
failOnError: false
author: anyA
changes:
- addUniqueConstraint:
columnNames: COLA
constraintName: FOOBAR_PK
forIndexName: FOOBAR_PK
tableName: FOOBAR
在属于其他表的 yaml 中还有很多其他变更集。我们现在将此 yaml 称为 init_2023.yaml。这个 yaml 是由 Liquibase 导入的,一切正常。
为了使表彼此独立,因为我们没有数据库的版本,更像是每个表都有一个版本,我们为每个表制作了一个yaml。因此,我们通过将 init_2023.yaml 拆分为 tablename.yaml 制作了很多 yaml 文件。所以在示例中是 foobar.yaml。在 foobar.yaml 中,我们现在添加了一个新的变更集:
- changeSet:
id: FOOBAR-4
failOnError: false
author: anyB
changes:
- dropTable:
cascadeConstraints: true
tableName: FOOBAR
使用 drop 导入 yaml 后,表格如预期消失了。 现在很奇怪,重新导入后,Liquibase 导入了变更集 FOOBAR-1、FOOBAR-2 和 FOOBAR-3,就像它不知道它们已经导入一样,但是为什么以及如何确保 Liquibase 不会重试以下变更集已经在 DATABASECHANGLOG 表中了吗?文件名有影响吗?我不希望如此。
DATABASECHANGLOG 表如下所示(ID、DATEEXECUTED、ORDEREXECUTED、DEPLOYMENT_ID 也不是实数,它们只是按正确的顺序排列):
| ID | AUTHOR | FILENAME | DATEEXECUTED | ORDEREXECUTED | MD5SUM | DEPLOYMENT_ID
| -------- | ------ | -------------- | ------------------- | ------------- | ------------------- |
| FOOBAR-3 | anyA | foobar.yaml | 23.10.2023 12:00:00 | 517 | 8:foobar3md5sum_abc | 63
| FOOBAR-2 | anyA | foobar.yaml | 23.10.2023 12:00:00 | 516 | 8:foobar2md5sum_def | 63
| FOOBAR-1 | anyA | foobar.yaml | 23.10.2023 12:00:00 | 515 | 8:foobar1md5sum_ghi | 63
| FOOBAR-4 | anyB | foobar.yaml | 23.10.2023 11:00:00 | 504 | 8:foobar2md5sum_def | 52
| FOOBAR-3 | anyA | init_2023.yaml | 01.09.2023 12:00:00 | 103 | 8:foobar3md5sum_abc | 11
| FOOBAR-2 | anyA | init_2023.yaml | 01.09.2023 12:00:00 | 102 | 8:foobar2md5sum_def | 11
| FOOBAR-1 | anyA | init_2023.yaml | 01.09.2023 12:00:00 | 101 | 8:foobar1md5sum_ghi | 11
我的期望是已经导入(通过 ID)的变更集将不会再次执行。
以下属性组合创建唯一的变更集标识符:
查看文档
每个变更集都包含 id 和作者标签。 id 标签、作者标签、搜索路径位置和变更日志文件的名称为变更集创建唯一标识符。
为了确保 liquibase 不执行已运行的变更集,您需要保持上述所有属性不变,而不是更改
databasechangelog
表。
以任何方式改变现有的变更集都不是一个好习惯。这是“仅向前”的事情。如果您需要进行更改,请创建新的更改集并保留现有的更改集。
这背后的主要思想是维护所有环境之间数据库模式的一致性。