11 Stimmen

Geländer: Der beste Weg, um Änderungen an einer Produktionsdatenbank vorzunehmen

Ich muss Änderungen an einer im Einsatz befindlichen Produktionsdatenbank vornehmen. Ich füge nur ein paar Spalten hinzu. Ich habe die Änderungen an der Entwicklungsdatenbank mit Migrationen vorgenommen. Wie kann ich die Produktionsdatenbank am besten aktualisieren, ohne die vorhandenen Daten zu beschädigen und den Betrieb zu sehr zu stören?

Es handelt sich um MYSQL, und ich muss den Spalten auch Daten für bereits vorhandene Datensätze hinzufügen. Eine Spalte kann einen Standardwert haben (sie ist boolesch), aber die andere ist ein Zeitstempel und sollte einen beliebigen rückdatierten Wert haben. Die Anzahl der Zeilen ist nicht sehr groß.

Also, wenn ich Migrationen verwenden, wie füge ich Daten hinzu und wie bekomme ich es zu tun, nur die zwei (oder drei - ich füge Daten - neueste Migrationen auf die Produktion db, wenn es nicht ursprünglich über Migrationen (ich glaube, Sie verwendet das Schema stattdessen) gebaut wurde?

14voto

RichH Punkte 6090

Ich befolge dieses Verfahren immer:

  • Dump der prod-Datenbank mit dem Befehl mysqldump
  • Auffüllen der Entwicklungs-/Testdatenbank mit dem Dump über den Befehl mysql
  • Migrationen in der Entwicklungs-/Testphase durchführen
  • Prüfen Sie, ob die Migration funktioniert hat
  • Dumpen Sie die prod-Datenbank mit dem Befehl mysqldump (da sie sich möglicherweise geändert hat) und behalten Sie die Sicherung auf dem Server.
  • Migrationen auf prod durchführen (mit capristano)
  • Testmigration hat bei prod funktioniert
  • Bier trinken (und dabei Fehlerprotokolle ansehen)

6voto

Cameron Price Punkte 1185

Es hört sich so an, als ob Sie sich in einem Zustand befinden, in dem das Schema der Produktions-DB nicht genau mit dem übereinstimmt, das Sie in der Entwicklungsumgebung verwenden (obwohl es nicht ganz klar ist). Ich würde einen Schlussstrich ziehen und die Produktivdatenbank in einen besseren Zustand bringen. Im Wesentlichen sollten Sie dafür sorgen, dass die prod db eine "schema_info"-Tabelle hat, in der alle Migrationen aufgelistet sind, die Sie >nicht< in der Produktion ausführen wollen. Dann können Sie nach Herzenslust Migrationen hinzufügen, die dann mit der Produktions-DB funktionieren.

Wenn Sie das getan haben, können Sie Migrationen schreiben, die Schemaänderungen oder Daten hinzufügen, aber eine Sache, auf die Sie besonders achten müssen, ist, dass Sie, wenn Sie Daten mit Hilfe einer Migration hinzufügen, das Modell innerhalb der Migration selbst definieren müssen, etwa so:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

Der Grund dafür ist, dass Sie das Modell in der Zukunft bei einem Refactoring oder ähnlichem entfernen könnten. Wenn Sie die Benutzerklasse nicht in der Zeile "User.find_by_login..." definieren, wird die Migration eine Ausnahme auslösen, was sehr ärgerlich ist.

4voto

Matt Punkte 39978

Gibt es einen Grund dafür, dass Sie nicht dieselben Migrationen verwenden, die Sie in Ihrer Entwicklungsumgebung eingesetzt haben?

2voto

Mike Woodhouse Punkte 50241

Hinzufügen einer Spalte mit add_column in einer Migration sollte nicht destruktiv sein: Es wird eine "ALTER TABLE"-Anweisung erzeugt. Wenn Sie wissen, was Sie in die einmal erstellten Spalten eintragen wollen, können Sie die Werte im Rahmen der Migration ausfüllen (bei großen Zeilenzahlen können Sie eine weniger zeitaufwändige Alternative wählen).

Das Entfernen oder Ändern der Definition einer Spalte ist meines Erachtens plattformabhängig: Einige erlauben das Löschen einer Spalte an Ort und Stelle, andere führen eine Abfolge von Befehlen zum Umbenennen, Anlegen, Auswählen und Löschen aus.

Um genauer zu werden, benötigen wir mehr Informationen: Welche Art von Migration haben Sie im Sinn, auf welcher Plattform laufen Sie, müssen Sie Werte als Teil der Migration festlegen? Solche Informationen wären sehr hilfreich. Bearbeiten Sie einfach die Frage, dann wird sie in der Liste nach oben verschoben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X