Wie erstelle ich eine Registrierungstabelle neu?

9

Ich habe die registryTabelle aufgrund der anderen Probleme abgeschnitten , aber jetzt habe ich Probleme beim Neuerstellen der registryTabelle basierend auf den in der Datenbank aufgelisteten Dateien.

Ich rufe registry_update()an _registry_update()oder registry_rebuild()mache es:

drush eval "registry_rebuild();"

Aber dann habe ich folgenden Fehler, der auftritt:

Schwerwiegender Fehler: Die Klasse 'SelectQueryExtender' wurde in include / pager.inc in Zeile 15 nicht gefunden

Standardmäßig ist die Tabelle (bei der systemModulinstallation) registryleer. Wie füllt Drupal diese Tabelle mit den richtigen Standarddaten?

Kenorb
quelle

Antworten:

15

Der absolut einfachste Weg, dies zu tun, besteht darin, ein beliebiges Modul zu aktivieren, da dies für Sie erledigt wird. Wenn Sie die Registrierung neu erstellen müssen, ist die Benutzeroberfläche im Allgemeinen möglicherweise nicht verfügbar, aber drush en [modulename]möglicherweise alles, was Sie benötigen.

Wenn das nicht genug ist, wieder aufzubauen Registry macht es trivial einfach die Registrierung neu zu erstellen. Der einfachste Weg, dies zu tun, besteht darin, es als Drush-Erweiterung zu installieren.

Installieren Sie die Erweiterung und führen Sie sie aus drush rr.

Die Modulseite enthält detaillierte Installationsanweisungen und zeigt auch, wie Sie sie bei Bedarf ohne Drush ausführen können.

Letharion
quelle
9

Dies kann entweder durch Neuinstallation von Drupal oder durch Kopieren der Tabelle von einer idealerweise neuen Installation von Drupal in Ihre defekte Instanz behoben werden.

Oder Sie können die folgende Problemumgehung ausprobieren (nur, wenn Ihre Drupal-Instanz bereits defekt ist):

  1. Sichern Sie zuerst die alte Registrierungstabelle (nur für den Fall):

    drush sqlq "CREATE TABLE registry_bak LIKE registry; INSERT INTO registry_bak SELECT * FROM registry;"
    drush sqlq "CREATE TABLE system_bak LIKE system; INSERT INTO system_bak SELECT * FROM system;"
    
  2. Löschen Sie den Bootstrap-Cache und die Registrierungstabelle.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Fügen Sie die Basisdaten in die Registrierungstabelle ein:

    drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("SelectQueryExtender", "class", "includes/database/select.inc"), ("DrupalDefaultEntityController", "class", "includes/entity.inc");'
    drush eval "registry_update();"
    
  4. Löschen Sie die Caches:

    drush -y cc all
  5. Wenn das Löschen von Caches in 4. aufgrund einiger anderer fehlender Klassen fehlgeschlagen ist, können Sie entweder:

    a) Fügen Sie die fehlenden Klassen manuell hinzu, zum Beispiel:

    $ drush -y cc all
    Fatal error: Class 'Entity' not found in profile2.module on line 593
    $ grep -Rwl "^class Entity" .
    ./sites/all/modules/entity/includes/entity.inc
    $ drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("Entity", "class", "sites/all/modules/entity/includes/entity.inc");'
    $ drush -y cc all # testing...
    # If Fatal error:, repeat 5a. again.
    

    oder:

    b) Versuchen Sie, diese fehlerhaften Contrib-Module (z. B. Profil2, Regeln) zu deaktivieren, indem Sie:

    drush sqlq 'UPDATE system SET status = 0 WHERE name = "failing_module"'

    und wiederholen Sie die Schritte ab 4.

  6. Wenn etwas mehr kaputt ist als es war, können Sie Ihre Tabellen auf den ursprünglichen Punkt zurücksetzen (der in Schritt 1 ausgeführt wurde), indem Sie:

    drush sqlq "TRUNCATE registry; INSERT INTO registry SELECT * FROM registry_bak;"
    drush sqlq "TRUNCATE system; INSERT INTO system SELECT * FROM system_bak;"
    

    und versuche es noch mal.

Siehe auch: So verschieben Sie installierte Module von / sites / all / modules / * nach / sites / all / contrib / modules / *


Die Neuerstellung der registryTabelle kann auch mit dem folgenden Skript erreicht werden, das in Drupal Webroot ausgeführt wird:

grep -ERo "^(\s+)?(abstract )?class (\S+)" . | tr ':' ' ' | sed "s/abstract //g" | awk '{print "INSERT INTO registry (filename, type, name) VALUES (\x27"$1"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' | $(drush sql-connect) -f

Dank Mikes Hilfe bei Regex.

Kenorb
quelle
4
thx - Schritt 3 hat mich gerettet, wo es drush rrfehlgeschlagen ist
ErichBSchulz