Как восстановить таблицу реестра?

9

Я усек registryтаблицу из-за других проблем, но теперь у меня проблема с перестройкой registryтаблицы на основе файлов, перечисленных в базе данных.

Я звоню registry_update(), _registry_update()или registry_rebuild()сделать это:

drush eval "registry_rebuild();"

Но тогда у меня появляется следующая ошибка:

Неустранимая ошибка: класс «SelectQueryExtender» не найден в include / pager.inc в строке 15

По умолчанию (при systemустановке модуля) registryтаблица пуста, так как Drupal заполняет эту таблицу правильными данными по умолчанию?

kenorb
источник

Ответы:

15

Самый простой способ сделать это - включить любой модуль, так как он сделает это за вас. Конечно, если вам нужно перестроить реестр, вообще говоря, пользовательский интерфейс может быть недоступен, но drush en [modulename]может быть все, что вам нужно.

Если этого недостаточно, перестройка реестра позволяет легко перестроить реестр. Самый простой способ сделать это - установить его как расширение для рисования.

Установите расширение и запустите drush rr.

На странице модуля есть подробные инструкции по установке, а также показано, как запустить его без промывки, если это необходимо.

Letharion
источник
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.
    

    или:

    б) Попробуйте отключить эти неисправные модули contrib (например, profile2, rules):

    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;"
    

    и попробуй еще раз.

См. Также: Как переместить установленные модули из / sites / all / modules / * в / sites / all / contrib / modules / *


Восстановление registryтаблицы также может быть достигнуто с помощью следующего скрипта, запущенного в web-корне 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

Благодаря помощи Майка с регулярным выражением.

kenorb
источник
4
THX - шаг 3 спас меня там, где drush rrне удалось
ErichBSchulz