如何重建注册表?


9

registry由于其他问题,我已经将表截断了,但是现在我在registry基于数据库中列出的文件重建表时遇到了问题。

我正在打电话registry_update()_registry_update()或者registry_rebuild()要这样做:

drush eval "registry_rebuild();"

但是然后出现以下错误:

致命错误:在第15行的includes / pager.inc中找不到类“ SelectQueryExtender”

默认情况下(在system模块安装时)registry表为空,那么Drupal如何用适当的默认数据填充该表?

Answers:


15

绝对最简单的方法是启用任何模块,因为这样做会为您完成。当然,如果您需要重建注册表,通常来说UI可能不可用,但drush en [modulename]可能仅是您所需要的。

如果这还不够,则通过注册表重建可以很轻松地重建注册表。最简单的方法是将其安装为drush扩展程序。

安装扩展,然后运行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.缺少其他类而导致4.中的清除缓存失败,则可以执行以下任一操作:

    a)手动添加缺少的类,例如:

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

    然后再试一次。

另请参阅:如何将已安装的模块从/ sites / all / modules / *移至/ sites / all / contrib / modules / *


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

感谢Mike对正则表达式的帮助。


4
THX - 3步中保存我在哪里drush rr失败
ErichBSchulz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.