Como reconstruir a tabela do Registro?

9

Truncei a registrytabela por causa de outros problemas, mas agora tenho problemas para reconstruir a registrytabela com base nos arquivos listados no banco de dados.

Eu estou chamando registry_update(), _registry_update()ou registry_rebuild()fazê-lo:

drush eval "registry_rebuild();"

Mas então eu tenho o seguinte erro que aparece:

Erro fatal: Classe 'SelectQueryExtender' não encontrada em includes / pager.inc na linha 15

Por padrão (na systeminstalação do módulo), a registrytabela está vazia, então como o Drupal preenche essa tabela com os dados padrão adequados?

kenorb
fonte

Respostas:

15

A maneira absolutamente mais fácil de fazer isso é ativar qualquer módulo, pois isso fará isso por você. Obviamente, se você precisar reconstruir o registro, a UI normalmente estará indisponível, mas drush en [modulename]poderá ser tudo o que você precisa.

Se isso não for suficiente, reconstrução de registo faz com que seja tão fácil de reconstruir o registo. A maneira mais fácil de fazer isso é instalá-lo como uma extensão drush.

Instale a extensão e execute drush rr.

A página do módulo possui instruções detalhadas de instalação e também mostra como executá-lo sem drush, se necessário.

Letharion
fonte
9

Isso pode ser corrigido reinstalando o Drupal ou copiando a tabela de uma instalação idealmente nova do Drupal para sua instância quebrada.

Ou você pode tentar a seguinte solução alternativa (somente faça isso quando a instância do Drupal já estiver quebrada):

  1. Faça backup da tabela de registro antiga primeiro (apenas no caso):

    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. Limpe o cache de autoinicialização e a tabela do registro.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Insira os dados básicos na tabela do 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. Limpe os caches:

    drush -y cc all
  5. Se os caches limpos do 4. falharem, devido a outras classes ausentes, você pode:

    a) Adicione as classes ausentes manualmente, por exemplo:

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

    ou:

    b) Tente desativar esses módulos de contribuição com falha (por exemplo, perfil2, regras):

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

    e repita os passos a partir de 4.

  6. Se algo estiver mais quebrado do que estava, você pode restaurar suas tabelas para o ponto original (que foi feito na 1. etapa):

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

    e tente novamente.

Consulte também: Como mover os módulos instalados de / sites / all / modules / * para / sites / all / contrib / modules / *


A registrytabela de reconstrução também pode ser obtida pelo seguinte script executado no webroot do 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

Graças à ajuda de Mike com regex.

kenorb
fonte
4
thx - etapa 3 me salvou onde drush rrfalhou
ErichBSchulz