2008-10-24 68 views
4

我有兩臺機器......一臺開發機器和一臺生產機器。當我第一次將我的Rails應用程序帶到生產服務器上時,我沒有任何問題。我只需通過運行rake db導入schema.rb:schema:load RAILS_ENV = production。一切都好。爲什麼Rake會拋出這個Rails遷移錯誤?

因此,在我的開發機器上,我做了一些更改和另一次遷移,然後將新應用程序複製到生產計算機上。然後我嘗試通過運行rake db來更新數據庫:migrate RAILS_ENV = production。我收到以下錯誤: 「數據庫中已經有一個名爲'schema_migrations'的對象。」

我在想我自己,雅沒有開玩笑耙......你創造了它!我在耙子上跑過痕跡,好像耙子認爲這是它第一次跑步。但是,通過分析我的開發計算機和生產計算機上的'schema_migrations'表,可以看到一個遷移有差異,即我想要遷移的遷移。

我也試着明確定義版本號,但這也不起作用。

關於如何讓我的生產服務器保持最新的任何想法?

更新:

讓我說開始,我不能只是「降」的數據庫。這是一個已經有超過10萬條記錄的生產服務器。如果將來出現類似問題會發生什麼?我每次發生數據庫問題時都會丟掉表格?這次可能會起作用,但對於每個數據庫問題來說,它似乎都不是一個實用的長期解決方案。我懷疑我現在遇到的問題對我來說是獨一無二的。

  1. 聽起來像'schema_info'表和'schema_migrations'表是相同的。在我的設置中,我只有'schema_migrations'。如前所述,生產服務器上的'schema_migrations'表與開發計算機之間的差異只是一個記錄。也就是說,包含我想要遷移的更改版本號的記錄。

  2. 從我讀過的'Simply Rails 2'一書中,它指出,當第一次移動到生產服務器時,不應運行rake db:migrate,而應該運行rake:db:schema:load。

  3. 如果有關係,我使用的是Rails版本2.1。

回答

1

這是一個猜測,我承認:我想是因爲你第一次運行分貝:模式:負載,而不是分貝:遷移在生產環境中,你有你的數據庫的結構,而不是數據遷移填充到您的schema_info表中。因此,現在,當您在生產環境中運行遷移時,schema_info中沒有數據,這就是爲什麼遷移認爲它尚未運行(因爲尚未運行)的原因。這就是說......你說你看過「schema_migrations」表,並且從開發到生產有一個版本是有區別的......我還沒有聽說過那張表,在我的rails版本後面幾個月。也許你可以嘗試在生產環境中創建一個「schema_info」表格,並在單個「版本」列中添加一行,並添加一個相信你的生產環境的版本。

+0

是的,schema_migrations表是您的密鑰,它可能不在那裏或者沒有填充或生產服務器上的東西 – 2008-10-25 04:36:17

0

我只想刪除數據庫,再次添加它並運行rake rb:migrate。Brad是正確的,當你運行模式加載時,它沒有在schema_migrations表中放置任何記錄。

當然,如果在生產服務器上有不能丟失的數據,這當然會更復雜。你可以得到rake備份任務(不知道這是否是核心的一部分),然後在生產數據庫上運行rake db:backup:write,然後在生產中獲得最新的遷移之後,運行rake db:備份:閱讀。

+0

如果這是真的,或者最佳路徑,則不會對生產系統進行更改,在現實生活中幾乎總是有數據需要維護:) – 2008-10-25 03:34:39

+0

我是隻推薦它,因爲他第一次沒有正確運行遷移。 – 2008-10-27 13:58:18

-1
rake db:migrate RAILS_ENV=production 

僅在第一次創建時使用db:schema:load任務,應該遷移增量更改。

1

關於你提到的更新:

  1. 我不明白有什麼區別你的生產schema_migrations和開發人員版之間。兩個表中是否有記錄(應該只有一列,「版本」,右)還是在開發數據庫中有單個記錄,生產中是否有零記錄?如果存在零個記錄生產表,那麼這樣做:

    ActiveRecord::Base.connection.execute("INSERT schema_migrations (version) VALUES(#{my version number that production is supposedly on})")

  2. 或者,你可以嘗試對生產完全丟棄schema_migrations表:

    ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")

    然後,再運行rake db:migrate RAILS_ENV=production。這將從版本1開始進行遷移,這可能不是你想要的。

  3. 或者,您可以在您的生產環境中啓動IRB會話,執行要求加載的遷移文件的「require」或「load」(我永遠不會記住它是哪一個或哪一個很重要) ,然後致電MyMigrationClass.up。之後,您需要在schema_migrations表中手動設置版本號,因爲您仍然會遇到問題,但作爲快速修復類型的黑客,這可行。

1

如果您得到「在數據庫中已經有一個名爲'schema_migrations'的對象。」錯誤消息,那麼我懷疑你是使用MS SQLServer作爲你的數據庫? (因爲這看起來像MS SQL Server錯誤信息)

如果是,那麼你使用哪個ActiveRecord數據庫適配器? (什麼是你的database.yml文件,你安裝了什麼寶石來訪問MS SQL Server數據庫?)

目前看來,Rails沒有在生產架構中找到schema_migrations表,因此試圖創建它,並且此創建失敗數據庫錯誤消息。可能原因是schema_migrations表名中的大寫/小寫字符 - 據我瞭解,MS SQL Server標識符區分大小寫。

0

schema_info來自老版本的Rails。 schema_migrations是塊上的新小孩。您應該能夠移除schema_info表,因爲它不再被使用。您可能需要搜索與此名稱更改相關的任何問題。

0

rake db:schema:load將從schema.rb加載數據庫結構。該文件是數據庫結構的當前表示。當您有一個需要創建所有表和索引的空模式(數據庫)時使用它。它可以節省你不得不運行所有的遷移。如果您有一個包含數據的現有生產數據庫,則不需要運行它。正如其他人所說,這將是不好的!

1

取決於生產中所使用的系統上,我所看到的情況,其中低於不工作:

rake db:migrate RAILS_ENV=production 

但是,在這一個沒有問題:

RAILS_ENV=production rake db:migrate 

有些古怪,我知道,但值得嘗試一下,看看它是否有所作爲。

0

我知道這篇文章是前段時間,但我偶然發現它,它並沒有真正回答。當它出現在谷歌,這裏。

當您執行了rake db:schema:dump(或者這是由構建腳本爲您完成的)時,它會將遷移表的定義放入schema.rb中。在腳本結尾處,進程將嘗試再次創建表,但它顯然已經存在。在運行rake:schema:load之前,只需從schema.rb中刪除遷移表,並且不會有錯誤消息。

您需要在遷移表中設置版本號,以便隨後運行遷移。因此,瞭解schema.rb的相關版本很重要,或者刪除所有舊的遷移(它們在您的SCM中是安全的嗎?)

相關問題