【问题标题】:Dirty database version error when using golang-migrate使用 golang-migrate 时出现脏数据库版本错误
【发布时间】:2020-01-07 01:37:19
【问题描述】:

我是golang-migrate的新用户。

我已经运行了一些成功执行的迁移。

我处于开发模式,所以我想在psql shell 中重新运行迁移,在连接到我的数据库后,我执行了drop database schema_migrations

现在的问题是,当我运行执行迁移的代码时(如下所示)


func RunMigrations() {
    m, err := migrate.New(
        "file://db/migrations",
        "postgres://postgres:postgres@localhost:5432/mydatabase?sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    if err := m.Up(); err != nil {
        if err.Error() == "no change" {
            log.Println("no change made by migration scripts")
        } else {
            log.Fatal(err)
        }
    }
}

我收到此错误

脏数据库版本 2。修复并强制版本。

这个错误是关于什么的,我该如何解决?

【问题讨论】:

    标签: go migration golang-migrate


    【解决方案1】:

    肮脏的数据库版本 2 意味着您尝试运行迁移 v2 并且失败了。

    如果迁移失败,数据库可能会不一致或损坏。

    在损坏状态之上重新运行其他迁移是不可预测的,因此在您清理数据库之前迁移会被阻止。

    https://github.com/golang-migrate/migrate/blob/master/FAQ.md#what-does-dirty-database-mean

    “脏”数据库是什么意思?

    在迁移运行之前,每个 数据库设置脏标志。如果迁移失败并且执行停止 脏状态持续存在,这会阻止尝试运行更多 在失败的迁移之上进行迁移。您需要手动修复 错误,然后“强制”预期的版本。

    清理数据库后您还可以打开schema_migrations 表并将脏标志和回滚版本号更改为成功应用的上次迁移。

    【讨论】:

    • 但是为什么删除schema_migrations 表并不能解决问题?
    • 迁移应该是安全的。没有schema_migrations 表的数据库被解释为迁移未涵盖的数据库。
    • 如果迁移表不存在,go-migrate 将知道它应用的最后一次成功更改。在这种情况下,go-migrate 将从头开始并尝试升级到最新版本。
    • 不相关:如果多个服务使用同一个数据库,一个好的做法是指定一个 go-migrate 应该使用的迁移表。依赖同一张表,您将无法为来自不同地方的单独服务升级表。
    • 请注意,如果您想跳过有问题的迁移,只需将 schema_migrations 条目脏标志设置为 false 并重新部署您的服务。
    猜你喜欢
    • 2015-11-25
    • 2017-11-27
    • 2017-09-18
    • 2020-06-22
    • 2020-03-15
    • 1970-01-01
    • 2015-06-02
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多