레지스트리 테이블을 다시 작성하는 방법?


9

registry다른 문제로 인해 테이블 이 잘 렸지만 이제는 registry데이터베이스에 나열된 파일을 기반으로 테이블을 재구성하는 데 문제 가 있습니다.

내가 전화 했어 registry_update(), _registry_update()또는 registry_rebuild()그것을 할 :

drush eval "registry_rebuild();"

그러나 다음과 같은 오류가 나타납니다.

치명적인 오류 : 15 행의 contains / pager.inc에서 'SelectQueryExtender'클래스를 찾을 수 없습니다.

기본적으로 ( system모듈 설치시) registry테이블이 비어 있으므로 Drupal이 해당 테이블을 적절한 기본 데이터로 채우는 방법은 무엇입니까?

답변:


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.에서 캐시 지우기가 실패한 경우 다음 중 하나를 수행 할 수 있습니다.

    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) 다음과 같이 실패한 contrib 모듈 (예 : 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 / *로 이동하는 방법


registryDrupal 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.