Frage

Ich habe zwei Maschinen...eine Entwicklung, Maschine und Produktion Maschine.Als ich das erste brachte meine rails-app auf dem Produktions-server, hatte ich keine Probleme.Ich habe einfach importiert schema.rb durch ausführen von rake db:schema:load RAILS_ENV=Produktion.Alles war gut.

So, dann auf meiner Entwicklung Maschine, ich machte einige weitere änderungen und ein weiterer migration, und kopieren Sie anschließend die neue Anwendung über die Produktion Maschine.Dann habe ich versucht, ein update der Datenbank durch ausführen von rake db:migrate RAILS_ENV=production.Ich bekomme die folgende Fehlermeldung:"Es ist bereits ein Objekt mit dem Namen 'schema_migrations' in der Datenbank."

Ich dachte mir, ya das ist kein Scherz Rake...Sie es erstellt haben!Ich lief Spur auf rake und es scheint, als ob rake denkt, dass es das erste mal ist es immer lief.Jedoch, durch die Analyse von mein 'schema_migrations' Tabelle auf meiner Entwicklung Maschine und meine Produktion Maschine können Sie sehen, dass es ist ein Unterschied von einer migration, nämlich die, die ich migrieren möchten.

Ich habe auch versucht, explizit definieren, die Versionsnummer, aber das funktioniert auch nicht.

Alle Ideen, wie kann ich meinem Produktions-server aktuell?

Update:

Lassen Sie mich zunächst sagen, dass ich nicht nur 'drop', um die Datenbank.Es ist ein Produktionsserver mit etwas über 100k Datensätze bereits in es.Was passiert, wenn ein ähnliches problem in der Zukunft auftreten?Bin ich nur die Tabelle löschen jedes mal, wenn ein Datenbank-problem Auftritt?Es könnte funktionieren, aber es scheint nicht, wie eine praktische langfristigen Lösung für jede Datenbank-problem.Ich bezweifle das problem das ich habe ist jetzt nur für mich.

  1. Es klingt wie die 'schema_info" Tisch und die 'schema_migrations' Tabelle sind die gleichen.In meinem setup, ich habe nur 'schema_migrations'.Wie schon erwähnt, der Unterschied zwischen der 'schema_migrations' Tisch, auf dem Produktions-server und die Entwicklung Maschine ist nur einen Datensatz.Das heißt, der Datensatz enthält die Versionsnummer der Veränderung, die ich migrieren möchten.

  2. Aus dem Buch, das ich lese, 'Einfach-Schienen 2', heißt es, dass beim ersten Umzug zu einem Produktions-server, statt ausführen rake db:migrate, sollte man nur ausführen rake:db:schema:load.

  3. Wenn es darauf ankommt, ich bin mit Schienen version 2.1.

Keine korrekte Lösung

Andere Tipps

Das ist eine Vermutung, ich gebe zu: Ich denke, dass, weil Sie zuerst db lief: schema: load statt db: in der Produktionsumgebung migrieren, haben Sie die Struktur Ihrer db, aber nicht die Daten, die bevölkert in Ihre migrieren schema_info Tisch. So, jetzt, wenn Sie in der Produktionsumgebung migrieren laufen, gibt es keine Daten in schema_info weshalb Migrate glaubt, dass es noch nicht abgelaufen ist (weil es nicht).

Das heißt ... Sie sagen, dass Sie in der „schema_migrations“ Tisch ausgesehen haben, und dass es einen Unterschied von einer Version von dev Produktion ist ... Ich habe nicht von dieser Tabelle gehört, obwohl ich bin ein paar Monate hinter auf meiner Schienen-Version. Vielleicht versuchen Sie könnten eine „schema_info“ Tabelle in der Produktionsumgebung, mit einer einzigen Spalte „Version“ zu schaffen, und eine Zeile mit der Version hinzufügen, die Sie Ihre Produktionsumgebung glauben an sein.

Wenn Sie "Es ist bereits ein Objekt mit dem Namen 'schema_migrations' in der Datenbank." Fehlermeldung, dann vermute ich, dass Sie MS SQLServer-Datenbank?(Wie dies scheint, wie MS SQL Server error message)

Wenn ja, dann ist die ActiveRecord-Datenbank-adapter Sie verwenden?(Was ist Ihre Datenbank.yml-Datei, welche gems Sie haben, installiert werden, um Zugriff auf den MS SQL Server-Datenbank?)

Derzeit scheint es, dass die Schienen nicht finden schema_migrations Tabelle in der Produktion-schema und deshalb versucht es zu erschaffen und diese Schöpfung schlägt mit Datenbank-Fehlermeldung.Wahrscheinlich der Grund dafür ist groß - /Kleinbuchstaben in der Tabelle schema_migrations name - soweit ich das verstanden habe MS SQL Server-Bezeichner sind case-Sensitiv.

Je nach System in der Produktion verwendet, ich habe Fälle gesehen, wo die unten hat nicht Arbeit:

rake db:migrate RAILS_ENV=production

Aber wo dies funktioniert:

RAILS_ENV=production rake db:migrate

Quirky, ich weiß, aber es lohnt sich versuchen zu sehen, ob es einen Unterschied macht.

In Bezug auf Ihre Update:

  1. Ich verstehe nicht, was der Unterschied zwischen Ihrer Produktion schema_migrations und der Entwickler-Version. Gibt es einen Datensatz in beiden Tabellen (es sollte nur 1 Spalte „Version“, richtig sein) oder gibt es einen einzelnen Datensatz in der dev DB und null Datensätze in der Produktion? Wenn es null Datensätze in der Produktion Tabelle sind, dann tun:

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

  2. Alternativ können Sie versuchen, die schema_migrations Tisch fallen ganz auf die Produktion:

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

    Dann wieder laufen rake db:migrate RAILS_ENV=production. Das wird Migrationen läuft von ab Version 1 aber das ist wahrscheinlich nicht, was Sie nach.

  3. Alternativ Alternativ könnten Sie eine IRB-Sitzung in der Produktionsumgebung starten, tun entweder einem „require“ oder „load“ (ich nie welche erinnern kann, oder wenn es darauf ankommt) der Migrationsdatei, die Sie mögen, laden, und dann MyMigrationClass.up nennen. Sie müßten danach die Versionsnummer in der schema_migrations Tabelle manuell einstellen, wie Sie immer noch das Problem für die Zukunft haben würden, aber als Hauruck-Art von Hack, das funktionieren würde.

Ich würde nur die DB fallen, fügen Sie es wieder und laufen Rake rb: wandern. Brad ist richtig, dass, wenn Sie das Schema Last laufen, es keine Datensätze in dem schema_migrations Tisch gelegt hat.

Dies ist komplizierter natürlich, wenn es Daten gibt, Sie nicht auf dem Produktionsserver verlieren. Sie könnten die Rake-Backup-Aufgaben erhalten (nicht sicher, ob das Teil des Kerns oder nicht ist) und dann rake db laufen: Backup: Schreiben Sie auf Ihre Produktionsdatenbank, und dann, nachdem Sie die Migration auf dem Laufenden über die Produktion, laufen rake db erhalten: Backup: s.

schema_info ist von einer alten Version von Rails. schema_migrations ist das neue Kind auf dem Block. Sie sollten in der Lage sein, die schema_info Tabelle zu entfernen, da es nicht mehr verwendet werde. Sie werden wahrscheinlich für alle Probleme mit dieser Namensänderung zugeordnet gesucht werden soll.

rake db: schema: load wird die Datenbankstruktur von schema.rb laden. Diese Datei ist die aktuelle Darstellung der Datenbankstruktur. Es wird verwendet, wenn Sie ein leeres Schema (Datenbank), die alle die Erstellung der Tabellen und Indizes benötigt. Es erspart Ihnen alle Migrationen ausführen zu müssen. Wenn Sie eine bestehende Produktionsdatenbank mit Daten in haben, die Sie nicht wollen, um sie auszuführen. Wie andere gesagt haben, das wäre schlecht!

Ich weiß, dass dieser Beitrag vor einiger Zeit war, aber ich stolperte über sie und es nicht wirklich beantwortet wurde. Da es auf Google kommt, hier geht.

Wenn Sie eine rake db tun: schema: dump (oder, wenn dies wurde für Sie durch den Build-Skripte durchgeführt) wird sie die Definition der Migrationen Tabelle in die schema.rb gesetzt worden. Am Ende des Skripts wird der Prozess versuchen, die Tabelle wieder zu schaffen, aber es bereits existiert offensichtlich. Entfernen Sie einfach die Migrationen Tabelle aus der schema.rb vor dem Ausführen Rechen: Schema:. Last und es wird keine Fehlermeldung sein

Sie müssen die Versionsnummer in der Migrationen Tabelle setzen, um anschließend Migrationen laufen. Deshalb ist es wichtig zu wissen, welche Version Ihr schema.rb auch bezieht, oder löschen Sie alle alten Migrationen (sie sind sicher in Ihrem SCM oder?)

rake db:migrate RAILS_ENV=production

Mit der db:schema:load Aufgabe nur für die erste Schöpfung, sollten inkrementelle Änderungen migriert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top