可以通过重新安装Drupal或将表从理想的全新Drupal安装复制到损坏的实例中来解决。
或者,您可以尝试以下解决方法(仅在Drupal实例已损坏时才这样做):
首先备份旧的注册表表(以防万一):
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;"
清除引导程序缓存和注册表表。
drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
将基本数据插入注册表中:
drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("SelectQueryExtender", "class", "includes/database/select.inc"), ("DrupalDefaultEntityController", "class", "includes/entity.inc");'
drush eval "registry_update();"
清除缓存:
drush -y cc all
如果由于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开始的步骤。
如果发生的故障比以前更严重,可以通过以下方法将表还原到原始点(在步骤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对正则表达式的帮助。
drush rr失败