Bagaimana cara membangun kembali tabel registri?

9

Saya sudah memotong registrytabel, karena masalah lain, tapi sekarang saya punya masalah membangun kembali registrytabel berdasarkan file yang tercantum dalam database.

Saya menelepon registry_update(), _registry_update()atau registry_rebuild()melakukannya:

drush eval "registry_rebuild();"

Tapi kemudian saya memiliki kesalahan berikut yang muncul:

Kesalahan fatal: Kelas 'SelectQueryExtender' tidak ditemukan di include / pager.inc on line 15

Secara default (pada systempemasangan modul) registrytabel kosong, jadi bagaimana Drupal mengisi tabel itu dengan data default yang benar?

kenorb
sumber

Jawaban:

15

Cara termudah untuk melakukannya, adalah mengaktifkan modul apa pun, karena itu akan melakukannya untuk Anda. Tentu saja, jika Anda perlu membangun kembali registri, secara umum UI mungkin tidak tersedia, tetapi drush en [modulename]mungkin semua yang Anda butuhkan.

Jika itu tidak cukup, membangun kembali Registry membuatnya mudah untuk membangun kembali registri. Cara termudah untuk melakukannya, adalah menginstalnya sebagai ekstensi drush.

Instal ekstensi, dan jalankan drush rr.

Halaman modul memiliki instruksi instalasi yang terperinci dan juga menunjukkan cara menjalankannya tanpa drush jika perlu.

Pelajaran
sumber
9

Ini dapat diperbaiki baik dengan menginstal ulang Drupal atau dengan menyalin tabel dari instalasi Drupal yang ideal ke instance rusak Anda.

Atau Anda dapat mencoba solusi berikut (hanya lakukan ketika instance Drupal Anda sudah rusak):

  1. Cadangkan tabel registri lama terlebih dahulu (untuk berjaga-jaga):

    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. Bersihkan cache bootstrap dan tabel registri.

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. Masukkan data dasar ke dalam tabel registri:

    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. Bersihkan cache:

    drush -y cc all
  5. Jika menghapus cache dalam 4. gagal, karena beberapa kelas yang hilang, Anda dapat:

    a) Tambahkan kelas yang hilang secara manual, misalnya:

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

    atau:

    b) Cobalah untuk menonaktifkan modul contrib yang gagal ini (misalnya profil2, aturan) dengan:

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

    dan ulangi langkah-langkah mulai dari 4.

  6. Jika ada sesuatu yang lebih rusak daripada itu, Anda dapat mengembalikan tabel Anda ke titik semula (yang dilakukan pada langkah 1.) dengan:

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

    dan coba lagi.

Lihat juga: Cara memindahkan modul yang diinstal dari / sites / all / modules / * ke / sites / all / contrib / modules / *


registryTabel pembangunan kembali juga dapat dicapai dengan skrip berikut dijalankan di 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

Terima kasih atas bantuan Mike dengan regex.

kenorb
sumber
4
thx - langkah 3 menyelamatkan saya jika drush rrgagal
ErichBSchulz