簡體   English   中英

如何 db:從 docker 中的 mysql 轉儲中恢復數據庫后遷移

[英]how to db:migrate after restoring database from mysql dump in docker

I have two docker containers for mysql and ruby and the ruby container is dependent on mysql container.

在我的docker-compose中,我已將 sql 轉儲卷安裝到mysql容器的/docker-entrypoint-initdb.d中,以便在啟動某些數據容器時執行它並首次填充數據容器。

sql 轉儲被執行,數據按預期恢復到 db 容器,但問題是,在啟動ruby (with rails) 容器時,它拋出了一個migration pending error 我知道發生這種情況是因為schema_migrations表中沒有記錄任何模式遷移版本,因為數據是故意從 sql 轉儲中恢復的。

但是,即使運行docker-compose run <container> rake db:migrate也無濟於事,因為它會拋出table already exists錯誤,因為表已經創建。

如何將 Rails 架構遷移版本與數據庫中的實際數據同步?

我還嘗試通過手動將最新的架構版本號添加到schema_migrations表中,但仍然返回migration pending error 而且,在從 sql 轉儲恢復之前,我無法運行docker-compose run <container> rake db:create db:migrate因為容器的/docker-entrypoint-initdb.d中的文件只有在尚未創建數據庫時才會執行。

我認為您可以將schema_migrations中的所有數據連同初始轉儲模式一起轉儲,這樣它將包含遷移版本,並且在運行rails db:migrate時不會引發異常。

更新:舊版本的 rails 實際上會檢查所有模式版本以決定是否需要遷移。 你可以在這里查看更多信息。

      def needs_migration?(connection = Base.connection)
        (migrations(migrations_paths).collect(&:version) - get_all_versions(connection)).size > 0
      end

希望這會有所幫助。

您可以在 docker_entrypoint 文件中編寫bundle exec rake db:migrate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM