Manuelles Entfernen von Drupal-Modulen

So entfernen Sie defekte oder fehlende Drupal-Module manuell aus der Datenbank.

Reste von Modulen, die nicht korrekt aus einer Drupal-Installation entfernt wurden, können auf lange Sicht Probleme mit Ihrer Drupal-Site verursachen.

Diese Modulreste bleiben möglicherweise lange Zeit unerkannt, da sie oft nicht auf der Modulseite (/admin/modules) oder beim Ausführen von drush pml  über die Kommandozeile angezeigt werden. Möglicherweise werden diese Modulreste sogar durch ein größeres Upgrade in Ihrer Datenbank mitgerissen. Ich erzähle Ihnen weiter unten eine lustige Geschichte dazu.

Doch wo verstecken sich diese Reste? Sie finden diese Relikte alter/ungenutzter Module möglicherweise in Ihrem Verzeichnis config/sync/. Dort finden sich möglicherweise YML-Dateien mit dem Namen des alten Moduls oder Konfigurationen, die auf dieses Modul verweisen. Sie finden diese verlassenen Module auch, wenn Sie Ihre Datenbank durchsuchen. Ein guter Ort, um Modulreste zu finden, sind die Tabellen

  • config / config_export
  • key_value
  • locales_location / locales_source
  • and sometimes the cache tables.

Sie können phpMyAdmin verwenden, um alle Tabellen Ihrer Datenbank nach dem Modulnamen zu durchsuchen. Einige Screenshots finden Sie weiter unten.

Eine weitere Möglichkeit – falls Sie lieber über die Kommandozeile arbeiten –, Verweise auf fehlende oder beschädigte Module zu finden, besteht darin, Ihre Drupal-Datenbank (drush sql-dump > mysite.sql) zu exportieren  und anschließend mit grep nach dem Modulnamen (grep module_system_name mysite.sql) zu suchen . Falls etwas gefunden wird, öffnen Sie den Datenbank-Dump in einem Texteditor und suchen Sie nach dem Systemnamen des Moduls, um zu sehen, welche Tabellen Relikte alter Module enthalten.

Normalerweise stoße ich auf solche Probleme, wenn ich ein Drupal-Update durchführe und anschließend ein Datenbank-Update (  drush updb) ausführe oder wenn ich versuche, Konfigurationen (drush cim)  zu importieren . Die Fehlermeldung bei einem fehlgeschlagenen Import oder Datenbank-Update besagt in der Regel, dass ein Modul oder ein Entity-Typ fehlt. Die schnelle Lösung wäre, das fehlende Modul vorübergehend herunterzuladen und zu aktivieren ( composer require drupal/module_name , drush en module_name ), anschließend das Update oder den Konfigurationsimport durchzuführen und anschließend das unerwünschte Modul wieder zu deinstallieren und zu entfernen ( drush pmu module_name , composer remove drupal/module_name ).

Was aber, wenn Sie das Modul nicht einfach installieren können? Es ist möglicherweise nicht mit Ihrem aktuellen Setup oder Ihrer Drupal-Version kompatibel, oder es handelt sich um ein benutzerdefiniertes Modul, das Sie nicht erhalten können. Oder es handelt sich sogar um ein Modul mit einer fehlerhaften Deinstallationsroutine. In jedem Fall müssen Sie selbst Hand anlegen und alle Spuren des Moduls manuell aus Ihrer Datenbank und/oder Ihrem Dateisystem entfernen.

Lassen Sie uns ein Beispiel genauer betrachten, das mir heute begegnet ist ...

Ich habe kürzlich eine Drupal-8-Site komponiert (eine ausführliche Anleitung zum Hinzufügen von Composer zu einer bestehenden Site finden Sie in der Drupal-Dokumentation ). Die Site wurde manuell aus einem Tarball ohne Composer installiert. Nachdem ich Composer in die alte Drupal-8-Site integriert hatte, aktualisierte ich von der neuesten Drupal-8-Version auf Drupal 9.3.6 oder eine ähnliche Version. Während des gesamten Vorgangs bemerkte ich nicht, dass ich einen blinden Passagier hatte. Erst beim Update auf 9.4.2 stieß ich auf ein Problem, das durch das fehlende Modul user_points verursacht wurde.

$ composer outdated drupal/*
Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
Info from https://repo.packagist.org: #StandWithUkraine
drupal/captcha                1.2.0        1.3.0        The CAPTCHA module provides this feature to virtually any user facing web form on a Drupal site.
drupal/content_access         1.0.0-alpha3 1.0.0-alpha4 Provides flexible content access control.
drupal/core                   9.3.9        9.4.2        Drupal is an open source content management platform powering millions of websites and applications.
drupal/core-composer-scaffold 9.3.9        9.4.2        A flexible Composer project scaffold builder.
drupal/core-recommended       9.3.9        9.4.2        Locked core dependencies; require this project INSTEAD OF drupal/core.
drupal/image_captcha          1.2.0        1.3.0        Provides an image based CAPTCHA.
drupal/matomo                 1.17.0       1.19.0       Adds Matomo javascript tracking code to all your site's pages.
drupal/metatag                1.19.0       1.21.0       Manage meta tags for all entities.
drupal/metatag_dc             1.19.0       1.21.0       Provides the fifteen <a href="https://dublincore.org/documents/dces/">Dublin Core Metadata Element Set 1.1</a> meta tags from...
drupal/metatag_dc_advanced    1.19.0       1.21.0       Provides forty additional meta tags from the <a href="https://dublincore.org/">Dublin Core Metadata Institute</a>.
drupal/metatag_google_cse     1.19.0       1.21.0       Provides support for meta tags used for Google Custom Search Engine.
drupal/metatag_verification   1.19.0       1.21.0       Verifies ownership of a site for search engines and other services.
drupal/metatag_views          1.19.0       1.21.0       Provides views integration for metatags.

Gemäß der Drupal-Anleitung „  Aktualisieren des Drupal-Kerns über Composer“ führe ich Folgendes aus:

$ composer update "drupal/core-*" --with-all-dependencies
Loading composer repositories with package information
Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies (including require-dev)
Package operations: 0 installs, 43 updates, 0 removals
  - Updating drupal/core-composer-scaffold (9.3.9 => 9.4.2): Loading from cache
  - Updating symfony/polyfill-php72 (v1.25.0 => v1.26.0): Loading from cache
  - Updating symfony/polyfill-ctype (v1.23.0 => v1.25.0): Loading from cache
  - Updating symfony/polyfill-mbstring (v1.23.1 => v1.25.0): Loading from cache
  - Updating twig/twig (v2.14.11 => v2.15.1): Loading from cache
  - Updating symfony/yaml (v4.4.34 => v4.4.43): Loading from cache
  - Updating symfony/polyfill-php80 (v1.23.1 => v1.25.0): Loading from cache

[...]

Writing lock file
Generating autoload files
46 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Scaffolding files for drupal/core:
  - Copy [web-root]/.htaccess from assets/scaffold/files/htaccess
  - Copy [web-root]/sites/default/default.settings.php from assets/scaffold/files/default.settings.php

Soweit alles gut. Datenbank-Updates ausführen:

$ drush updb
 -------- ------------------- ------------- ---------------------------------- 
  Module   Update ID           Type          Description                       
 -------- ------------------- ------------- ---------------------------------- 
  image    image_loading_att   post-update   Add the image loading attribute   
           ribute                            setting to image field formatter  
                                             instances.                        
  system   enable_provider_d   post-update   Enable the modules that are       
           atabase_driver                    providing the listed database     
                                             drivers.                          
  update   add_view_update_n   post-update   Add 'view update notifications'   
           otifications_perm                 to roles with 'administer site    
           ission                            configuration'.                   
  views    image_lazy_load     post-update   Add lazy load options to all      
                                             image type field configurations.  
  views    provide_revision_   post-update   Clear caches due to adding a      
           table_relationshi                 relationship from revision table  
           p                                 to base table.                    
 -------- ------------------- ------------- ---------------------------------- 


 Do you wish to run the specified pending updates? (yes/no) [yes]:
> yes

>  [notice] Update started: image_post_update_image_loading_attribute
>  [error]  The "user_points" entity type does not exist. 
>  [error]  Update failed: image_post_update_image_loading_attribute 
 [error]  Update aborted by: image_post_update_image_loading_attribute 
 [error]  Finished performing updates. 

Der Entitätstyp "user_points" existiert nicht. Na ja, ich denke, das klingt nach einem fehlenden Modul. Ich installiere das fehlende Modul einfach schnell. Aber auf der Projektseite des Moduls stelle ich fest, dass ich ein Problem habe:  https://www.drupal.org/project/user_points

 

Drupal Project Information

Ich tauche in die Datenbank ein, um die Version des Moduls zu finden, die ursprünglich auf der Site installiert wurde, und beschließe, die Quelle in mein Modulverzeichnis zu klonen und zu versuchen, sie zu aktivieren:

$ git clone https://git.drupalcode.org/project/user_points.git
Klone nach 'user_points' …
remote: Enumerating objects: 128, done.
remote: Total 128 (delta 0), reused 0 (delta 0), pack-reused 128
Empfange Objekte: 100% (128/128), 25.35 KiB | 8.45 MiB/s, fertig.
Löse Unterschiede auf: 100% (53/53), fertig

Aber wenn ich das Modul aktiviere, schwindet meine Hoffnung auf eine schnelle und einfache Lösung:

$ drush en user_points

In ModuleInstaller.php line 123:
                                                                                                     
  Unable to install modules: module 'user_points' is incompatible with this version of Drupal core.

Entfernen der Modulreste aus der Datenbank

Nachdem ich versucht habe, den einfachen Ausweg zu finden, beschließe ich, dass es an der Zeit ist, in der Datenbank zu graben und das verlassene Modul manuell zu entfernen.

Ich verwende phpMyAdmin, um alle Verweise auf das Modul user_points in allen Tabellen zu finden:

Phpmyadmin Screenshot

Dies erzeugt eine lange Liste von Tabellen mit verworfenen Einträgen des Moduls user_points. Ich muss zugeben, ich habe mich nicht besonders intensiv mit Drupal-Datenbankschemata beschäftigt, aber mit meinem Zen-Gespür kann ich alle Cache-Tabellen problemlos überspringen und mich auf die Konfigurations- und Schlüsselwerttabellen konzentrieren. Ich beginne mit dem Entfernen der Einträge aus der Konfigurationstabelle:

 

Phpmyadmin Table View Screenshot
Phpmyadmin Table View Screenshot Selection

Versuchen wir es noch einmal. Entfernen Sie die Caches und führen Sie das Datenbankupdate erneut durch.

$ drush cr
 [success] Cache rebuild complete.

$ drush updb
 -------- ------------------- ------------- ---------------------------------- 
  Module   Update ID           Type          Description                       
 -------- ------------------- ------------- ---------------------------------- 
  image    image_loading_att   post-update   Add the image loading attribute   
           ribute                            setting to image field formatter  
                                             instances.                        
  system   enable_provider_d   post-update   Enable the modules that are       
           atabase_driver                    providing the listed database     
                                             drivers.                          
  update   add_view_update_n   post-update   Add 'view update notifications'   
           otifications_perm                 to roles with 'administer site    
           ission                            configuration'.                   
  views    image_lazy_load     post-update   Add lazy load options to all      
                                             image type field configurations.  
  views    provide_revision_   post-update   Clear caches due to adding a      
           table_relationshi                 relationship from revision table  
           p                                 to base table.                    
 -------- ------------------- ------------- ---------------------------------- 


 Do you wish to run the specified pending updates? (yes/no) [yes]:
 > yes

>  [notice] Update started: image_post_update_image_loading_attribute
>  [notice] Update completed: image_post_update_image_loading_attribute
>  [notice] Update started: system_post_update_enable_provider_database_driver
>  [notice] Update completed: system_post_update_enable_provider_database_driver
>  [notice] Update started: update_post_update_add_view_update_notifications_permission
>  [notice] Update completed: update_post_update_add_view_update_notifications_permission
>  [notice] Update started: views_post_update_image_lazy_load
>  [notice] Update completed: views_post_update_image_lazy_load
>  [notice] Update started: views_post_update_provide_revision_table_relationship
>  [notice] Update completed: views_post_update_provide_revision_table_relationship
>  [warning] No configuration objects have been updated.
 [success] Finished performing updates.

Uuuuund … das Datenbankupdate wurde durchgeführt, die Site läuft auf Drupal 9.4.2.

Der faule Site-Admin könnte hier aufhören. Aber für zukünftige Upgrades suchen wir alle anderen Verweise auf das Modul in unseren Datenbanktabellen und entfernen sie ebenfalls. Wiederholen Sie die Suche mit z. B. phpMyAdmin, bis keine user_points mehr auftreten. Kürzen Sie Ihre Cache-Tabellen, erstellen Sie Ihren Cache neu (drush cr) und hoffen Sie auf das Beste, wenn Sie Ihre Site im Browser öffnen.

Gute Nacht!