Datenbank-Schema verifizieren

Aus MoodleDocs
Wechseln zu:Navigation, Suche


Wenn Sie Ihre Moodle-Installation über mehrere Versionen hinweg aktualisiert haben, ist es möglich, ja geradezu wahrscheinlich, dass Ihre Moodle-Datenbank nach der Aktualisierung etwas anders aussieht als bei einer Neuinstallation der aktuellen Version. Genauer gesagt können kleine Unterschiede bei den Tabellen- und Felddefinitionen auftreten. Dies kann passieren, wenn kleine Tabellen- und Feldänderungen durch die Upgrade-Skripte nicht berücksichtigt wurden. Die meisten dieser Tabellenveränderungen mögen harmloser Natur sein, andere wiederum verursachen seltsame, unerwartete Fehler.

Wenn zum Beispiel ein Feld nunmehr verpflichtend einen Wert haben muss, dann müßte ein Upgrade-Skript die Felder des Altbestands entsprechend mit einem Vorgabewert füllen, ansonsten würde eine Programmverarbeitungsroutine, welche ja nunmehr immer einen Wert in diesem Feld erwartet, möglicherweise fehlerhaft darauf reagieren.

Um die Konsistenz Ihrer Datenbank nach dem Upgrade sicherzustellen, vergleichen Sie am besten das Datenbankschema Ihres Produktivsystems mit dem Schema einer Neuinstallation derselben Versionsnummer unter Verwendung desselben Moodle-Codes.

Es gibt eine Reihe von Möglichkeiten, dies zu tun.

Wir wollen Ihnen hier eine einfache kommandozeilenbasierende Methode für Unix/Linux aufzeigen:

  • Führen Sie die Aktualisierung Ihres Moodle Systems vollständig durch.
  • Erstellen Sie mit dem folgenden Befehl ein Datenbankschema von Ihrem soeben aktualisierten System:
   mysqldump -d -u root -p myproductiondb > production.schema
  • Führen Sie eine parallele Neuinstallation von Moodle der gewünschten Zielversion (wichtig!!) durch.
Um Konflikte mit Ihrer bisherigen Installation zu vermeiden, legen Sie hierbei ein neues Moodle-Verzeichnis, ein neues Moodle-Datenverzeichnis moodledata-clean und eine neue, separate Moodle-Datenbank an.
Nach dem Abschluß der Neuinstallation steht Ihnen mit der neu erstellten Datenbank ein Referenzdatenbankschema zum Vergleich zur Verfügung.
  • Erstellen Sie ein Datenbankschema von Ihrem neu aufgesetzten System:
   mysqldump -d -u root -p mycleandb > clean.schema
  • Um vom diff-Programm unter Linux eine Änderungsdatei erzeugen zu lassen, setzen Sie den folgenden Befehl ab:
   diff -u production.schema clean.schema > db.diff

Durch die Parameter -u oder -y beim diff-Befehl kann man das Anzeigeformat in der Ausgabedatei steuern (Unterschiede gekennzeichnet durch +/- oder nebeneinander, s. a. folgendes Beispiel zur Auswertung). Nun können Sie die db.diff Datei mit Ihrem bevorzugten Editor öffnen und sich die Unterschiede in den Datenbankschematas ansehen.

Hinweis: Alle angegebenen Befehle sind für MySQL-Datenbanken gedacht. Wenn Sie eine andere Datenbank verwenden, müssen Sie die entsprechenden Befehle verwenden, z.B. pg_dump für PostgreSQL-Datenbanken.


Auswertung der db.diff Datei

Beispiel für eine Ausgabe:

    --
    -- Table structure for table `mdl_backup_config`
       @@ -129,11 +93,11 @@
        DROP TABLE IF EXISTS `mdl_backup_config`;
        CREATE TABLE `mdl_backup_config` (
   -  `id` int(10) unsigned NOT NULL auto_increment,
   +  `id` bigint(10) unsigned NOT NULL auto_increment,
      `name` varchar(255) NOT NULL default ,
      `value` varchar(255) NOT NULL default ,
       PRIMARY KEY  (`id`),
   -  UNIQUE KEY `name` (`name`)
   +  UNIQUE KEY `mdl_backconf_nam_uix` (`name`)
        ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='Store backup conf';

In einer db.diff Datei können viele Änderungsbereiche aufgeführt sein. Durch den Parameter -u bei der Erzeugung der Änderungsdatei wurde als Ausgabeformat der *.diff Datei das vereinheitlichte Format mit folgender Darstellungssyntax ausgewählt:

  • Eine Zeile mit einem vorangestellten - kennzeichnet eine Zeile, die herausgenommen wurde.
  • Eine Zeile mit einem vorangestellten + kennzeichnet eine Zeile, die hinzugekommen ist (Produktion -> Neuinstallation).

In unserem Beispiel wurde der Datentyp int durch eine bigint Definition ersetzt, und gleichzeitig hat sich die Unique Index Definition von name auf nunmehr mdl_backconf_nam_uix geändert. Technisch gesehen hätten beide Veränderungen während des Laufes eines Upgrade-Skriptes berücksichtigt werden müssen, sind aber vergessen worden. Auf Grund der Natur der beiden obigen Unterschiede in den Tabellendefinitionen dürften diese die Funktionsweise von Moodle in der Regel nicht beeinflussen, sollten aber korrigiert werden.

Zu viele Änderungen

Sie können auch Datenbankverwaltungsprogramme verwenden, um die alte und die neue Moodle-datenbank zu synchronisieren, z.B. MySQL Workbench für MySQL-Datenbanken.

Wenn Sie unter Unix/Linux arbeiten, bietet das Python-Skript Schema Sync eine einfache und schnelle Möglichkeit, alle Befehle zur Aktualisierung der Datenbank zu genierieren.

Muss ich mir Sorgen machen?

Änderungen bei den Feldtypdefinitionen sind unkritisch, solange die Datentypen kompatibel zueinander sind (z. B. int -> bigint). Ebenso sind Wechsel bei den Tabellenschlüsseln häufig zu beobachten, gehören aber auch in die Kategorie von Unterschieden, die gewöhnlich keine Probleme beim Betrieb bereiten sollten.

Wonach Sie besonders Ausschau halten müssen, sind fehlende Felddefinitionen und Veränderungen bei den DEFAULT-Werten der Felder.

Siehe auch

  • Bericht über fehlende Indizes unter Website-Administration > Entwicklung > XMLDB-Editor generieren
  • Moodle Databases Forum - Diskussionsforum im Kurs Using Moodle auf moodle.org