Come ricostruire la tabella di registro?


9

Ho troncato la registrytabella, a causa degli altri problemi, ma ora ho problemi a ricostruire la registrytabella in base ai file elencati nel database.

Sto chiamando registry_update(), _registry_update()o registry_rebuild()per farlo:

drush eval "registry_rebuild();"

Ma poi ho il seguente errore che appare:

Errore irreversibile: classe 'SelectQueryExtender' non trovata in Includes / pager.inc alla riga 15

Per impostazione predefinita ( systemall'installazione del modulo) la registrytabella è vuota, quindi come Drupal riempie quella tabella con i dati predefiniti corretti?

Risposte:


15

Il modo assolutamente più semplice per farlo è abilitare qualsiasi modulo, poiché ciò lo farà per te. Naturalmente, se è necessario ricostruire il registro, in generale l'interfaccia utente potrebbe non essere disponibile, ma drush en [modulename]potrebbe essere tutto ciò di cui hai bisogno.

Se ciò non bastasse, la ricostruzione del registro rende banalmente facile ricostruire il registro. Il modo più semplice per farlo è installarlo come estensione drush.

Installa l'estensione ed esegui drush rr.

La pagina del modulo contiene istruzioni dettagliate per l'installazione e mostra anche come eseguirlo senza drush, se necessario.


9

Questo può essere risolto reinstallando Drupal o copiando la tabella da un'installazione idealmente fresca di Drupal nella tua istanza non funzionante.

Oppure puoi provare la seguente soluzione alternativa (fallo solo quando l'istanza di Drupal è già rotta):

  1. Esegui prima il backup della vecchia tabella di registro (per ogni evenienza):

    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. Cancella la cache bootstrap e la tabella di registro.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Inserisci i dati di base nella tabella di registro:

    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. Cancella le cache:

    drush -y cc all
  5. Se la cancellazione della cache in 4. non riesce, a causa di alcune altre classi mancanti, è possibile:

    a) Aggiungere manualmente le classi mancanti, ad esempio:

    $ 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.

    o:

    b) Prova a disabilitare questi moduli contrib non funzionanti (es. profilo2, regole):

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

    e ripetere i passaggi a partire da 4.

  6. Se qualcosa è più rotto di quanto non fosse, è possibile ripristinare le tabelle al punto originale (che è stato fatto in 1. passaggio):

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

    e riprova.

Vedi anche: Come spostare i moduli installati da / sites / all / modules / * a / sites / all / contrib / modules / *


La ricostruzione della registrytabella può essere ottenuta anche con il seguente script eseguito nel webroot Drupal:

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

Grazie all'aiuto di Mike con regex.


4
grazie - il passaggio 3 mi ha salvato dove drush rrfallito
ErichBSchulz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.