¿Cómo reconstruir la tabla de registro?

9

He truncado la registrytabla debido a otros problemas, pero ahora tengo problemas para reconstruir la registrytabla en función de los archivos enumerados en la base de datos.

Estoy llamando registry_update(), _registry_update()o registry_rebuild()para hacerlo:

drush eval "registry_rebuild();"

Pero luego tengo el siguiente error que aparece:

Error fatal: la clase 'SelectQueryExtender' no se encuentra en incluye / pager.inc en la línea 15

Por defecto (en la systeminstalación del módulo) la registrytabla está vacía, entonces, ¿cómo Drupal llena esa tabla con los datos predeterminados adecuados?

kenorb
fuente

Respuestas:

15

La forma más fácil de hacerlo es habilitar cualquier módulo, ya que eso lo hará por usted. Por supuesto, si necesita reconstruir el registro, en general, la interfaz de usuario podría no estar disponible, pero drush en [modulename]podría ser todo lo que necesita.

Si eso no es suficiente, la reconstrucción del registro hace que sea trivialmente fácil reconstruir el registro. La forma más fácil de hacerlo es instalarlo como una extensión drush.

Instale la extensión y corra drush rr.

La página del módulo tiene instrucciones de instalación detalladas y también muestra cómo ejecutarlo sin drush si es necesario.

Letharion
fuente
9

Esto se puede solucionar reinstalando Drupal o copiando la tabla de una instalación idealmente nueva de Drupal en su instancia rota.

O puede probar la siguiente solución (solo hágalo cuando su instancia de Drupal ya esté rota):

  1. Copia de seguridad de la tabla de registro anterior primero (por si acaso)

    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. Borre el caché de bootstrap y la tabla de registro.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Inserte los datos básicos en la tabla de 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. Borrar los cachés:

    drush -y cc all
  5. Si las memorias caché claras en 4. fallaron, debido a que faltan algunas otras clases, puede:

    a) Agregue las clases que faltan manualmente, por ejemplo:

    $ 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) Intente deshabilitar estos módulos de contribución que fallan (por ejemplo, profile2, reglas):

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

    y repita los pasos a partir de 4.

  6. Si algo está más roto de lo que estaba, puede restaurar sus tablas al punto original (que se hizo en el paso 1.):

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

    e intenta de nuevo.

Consulte también: Cómo mover módulos instalados de / sites / all / modules / * a / sites / all / contrib / modules / *


La reconstrucción de la registrytabla también se puede lograr mediante el siguiente script ejecutado en 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

Gracias a la ayuda de Mike con regex.

kenorb
fuente
44
gracias - el paso 3 me salvó donde drush rrfalló
ErichBSchulz