使用golang-migrate时出现脏数据库版本错误

问题描述 投票:0回答:5

我是 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
5个回答
23
投票

脏数据库版本 2 意味着您尝试运行迁移 v2 但失败。

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

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

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

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

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

清理数据库后,您还可以打开

schema_migrations
表并将脏标志和回滚版本号更改为成功应用的上次迁移。


1
投票

转到您的 postgres 控制台并在 Schema_Migrations 表中查找详细信息。

如果您看到 Dirty=true 那么您已经找到了根本原因,您只需通过运行更新查询来更新即可。

看看下面的命令。

select * from schema_migrations;

update schema_migrations set dirty =false where version=XXXX;

0
投票

我通过将脏标志更新为零解决了此错误。 就我而言,我的数据库名称是“auth”。因此,我首先运行以下命令来检查脏版本。

select * from auth_migrations

在输出中我发现脏列的值为 1。

然后我将其更新为零,我的问题就解决了。

注意:如果您的数据库名称是“exampleDb”,那么您的脏版本将位于“exampleDb_migrations”中


0
投票

如果删除

schema_migrations
表,您可以通过强制迁移版本来重新创建它。

例如

m, err := migrate.New("file://db/migrations","postgres://postgres:postgres@localhost:5432/mydatabase?sslmode=disable")
if err != nil {
    log.Fatal(err)
}
err := m.Force(11) //11 is migrations version number, you may use your latest version
if err != nil {
    return err
}

0
投票

发生这种情况时,您可能需要手动修复错误。

然后,使用 CLI 工具您可以清理数据库。基本上你应该运行:

migrate -path PATH_TO_YOUR_MIGRATIONS -database YOUR_DATABASE_URL force VERSION
,其中 N 是 DB 的当前状态。

您可以在入门文档

了解更多信息
© www.soinside.com 2019 - 2024. All rights reserved.