Jak odbudować tabelę rejestru?

9

Obciąłem registrytabelę z powodu innych problemów, ale teraz mam problem z przebudowaniem registrytabeli na podstawie plików wymienionych w bazie danych.

Dzwonię registry_update(), _registry_update()czy registry_rebuild()to zrobić:

drush eval "registry_rebuild();"

Ale potem pojawia się następujący błąd:

Błąd krytyczny: nie znaleziono klasy „SelectQueryExtender” w pliku / pager.inc w linii 15

Domyślnie (przy systeminstalacji modułu) registrytabela jest pusta, więc w jaki sposób Drupal wypełnia tę tabelę odpowiednimi domyślnymi danymi?

kenorb
źródło

Odpowiedzi:

15

Absolutnie najłatwiejszym sposobem na to jest włączenie dowolnego modułu, ponieważ zrobi to za Ciebie. Oczywiście, jeśli trzeba odbudować rejestr, ogólnie interfejs użytkownika może być niedostępny, ale drush en [modulename]może być wszystkim, czego potrzebujesz.

Jeśli to nie wystarczy, odbudowa rejestru sprawia, że odbudowanie rejestru jest banalnie proste. Najłatwiej to zrobić, instalując go jako rozszerzenie drush.

Zainstaluj rozszerzenie i uruchom drush rr.

Strona modułu zawiera szczegółowe instrukcje instalacji, a także pokazuje, jak go uruchomić bez pośpiechu, jeśli to konieczne.

Letharion
źródło
9

Można to naprawić albo ponownie instalując Drupal, albo kopiując tabelę z idealnie nowej instalacji Drupala do zepsutej instancji.

Możesz też wypróbować następujące obejście (zrób to tylko wtedy, gdy instancja Drupala jest już zepsuta):

  1. Najpierw wykonaj kopię zapasową starej tabeli rejestru (na wszelki wypadek):

    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. Wyczyść pamięć podręczną bootstrap i tabelę rejestru.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Wstaw podstawowe dane do tabeli rejestru:

    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. Wyczyść skrzynki:

    drush -y cc all
  5. Jeśli wyczyszczenie pamięci podręcznej w 4. nie powiodło się, z powodu niektórych innych brakujących klas, możesz:

    a) Dodaj ręcznie brakujące klasy, na przykład:

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

    lub:

    b) Spróbuj wyłączyć te wadliwe moduły contrib (np. profile2, reguły) poprzez:

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

    i powtórz kroki od 4.

  6. Jeśli coś jest bardziej zepsute niż było, możesz przywrócić tabele do pierwotnego punktu (co zostało zrobione w 1. kroku) poprzez:

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

    i spróbuj ponownie.

Zobacz także: Jak przenieść zainstalowane moduły z / witryn / wszystkich / modułów / * do / witryn / wszystkich / contrib / modułów / *


registryTabelę odbudowy można również osiągnąć za pomocą następującego skryptu uruchomionego w katalogu głównym 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

Dzięki pomocy Mike'a z regex.

kenorb
źródło
4
dzięki - krok 3 uratował mnie tam, gdzie się drush rrnie udało
ErichBSchulz