Як відновити таблицю реєстру?


9

У мене врізана registryтаблиця через інші проблеми, але тепер у мене є проблема відновлення registryтаблиці на основі файлів, перелічених у базі даних.

Я дзвоню registry_update(), _registry_update()або registry_rebuild()зробити це:

drush eval "registry_rebuild();"

Але тоді у мене з’являється така помилка:

Фатальна помилка: Клас "SelectQueryExtender" не знайдено в include / pager.inc у рядку 15

За замовчуванням (при systemвстановленні модуля) registryтаблиця порожня, тож як Drupal заповнює цю таблицю належними даними за замовчуванням?

Відповіді:


15

Абсолютно найпростіший спосіб зробити це - включити будь-який модуль, оскільки це зробить це за вас. Звичайно, якщо вам потрібно відновити реєстр, загалом кажучи, інтерфейс може бути недоступним, але це drush en [modulename]може бути все, що вам потрібно.

Якщо цього недостатньо, відновлення реєстру дозволяє тривіально легко відновити реєстр. Найпростіший спосіб зробити це - встановити його як розширення барабана.

Встановіть розширення та запустіть drush rr.

На сторінці модуля є детальні інструкції щодо встановлення, а також показано, як запустити його, якщо не потрібно.


9

Це можна виправити, перевстановивши Drupal або скопіювавши таблицю з ідеально свіжої установки Drupal у ваш розбитий екземпляр.

Або ви можете спробувати наступне рішення (робіть це лише тоді, коли ваш екземпляр Drupal вже зламаний):

  1. Спершу створіть резервну копію старої таблиці реєстру (про всяк випадок):

    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. Очистіть кеш завантажувальної системи та таблицю реєстру.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Вставте основні дані в таблицю реєстру:

    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. Очистити кеші:

    drush -y cc all
  5. Якщо очищення кешів у програмі 4. не вдалося, через деякі інші відсутні класи, ви можете:

    а) Додайте пропущені класи вручну, наприклад:

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

    або:

    b) Спробуйте вимкнути ці несправні модулі внеску (наприклад, profile2, правила) за допомогою:

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

    і повторіть кроки, починаючи з 4.

  6. Якщо щось більш зламане, ніж було, ви можете відновити свої таблиці до початкової точки (що було зроблено за 1 крок):

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

    і спробуйте ще раз.

Дивіться також: Як перемістити встановлені модулі з / сайтів / всіх / модулів / * до / сайтів / всіх / contrib / модулів / *


Перебудову registryтаблиці можна досягти також за допомогою наступного сценарію, запущеного в Drupal webroot:

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

Завдяки допомозі Майка з регулярним виразом.


4
thx - крок 3 врятував мене там, де drush rrне вдалося
ErichBSchulz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.