Indizes sorgen in Magento öfter für Ärger – speziell wenn der Neuaufbau mit einem undefinierten Fehler stoppt. Die Indizes beschleunigen Magento deutlich – leider sorgen sie auch öfter für Probleme:
Eine vernünftige Fehlermeldung, mit der man auf Fehlersuche gehen könnte, gibt es im Administrationsbereich leider nicht. Es gibt aber dennoch eine Möglichkeit, eine Fehlermeldung zu erhalten: Über die Shell bzw. Konsole, sofern man darauf Zugriff hat. Das Indexer-Skript befindet sich im Verzeichnis /shell/ direkt unterhalb des Magento-Hauptverzeichnis und wird, je nach Serverkonfiguration, wie folgt aufgerufen:
1 |
php indexer.php |
Den Status der Indizes erhält man über:
1 |
php indexer.php --status |
Der Indizierungsprozess wird angestoßen über den Aufruf
1 |
php indexer.php --reindex |
Soll nur ein Index angestoßen werden, kann man als Parameter noch den Code des Index angeben, z.B.
1 |
php indexer.php --reindex catalog_category_product |
Den passenden Code erhält man über die Datenbanktabelle "index_process".
Hilfreiche Fehlermeldung bei Indexfehlern
Eine Fehlermeldung wird hierbei ausgegeben, mit der man auf Fehlersuche gehen kann.
Häufig liegt das Problem in inkonsistenten Daten in der Datenbank. Aktuelles Beispiel ist der folgende Fehler mit dem Index "Kategorie Artikel".
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (catalog_category_product_index
, CONSTRAINT FK_CATALOG_CATEGORY_PROD_IDX_CATEGORY_ENTITY
FOREIGN KEY (category_id
) REFERENCES catalog_category_entity
(entity_id
)
Der Fehler sagt aus, dass eine so genannte Constraint, eine zwingende Beziehung zwischen den Daten zweier Datenbanktabellen, verletzt ist. In diesem Fall ist es eine Kategorie-Id in der Verknüpfungstabelle catalog_category_product, für die keine passende Kategorie in der Tabelle catalog_category_entity mehr existiert. Hier hilft folgende SQL-Abfrage, die in der Shell oder z.B. in phpMyAdmin eingegeben werden kann:
1 2 3 4 |
SELECT cp.category_id FROM catalog_category_product cp LEFT JOIN catalog_category_entity c ON cp.category_id = c.entity_id WHERE ISNULL( c.entity_id ) |
Ergebnis dieser Abfrage sind die IDs der fehlenden Kategorien. Die zugehörigen Datensätze in catalog_category_product können bedenkenlos gelöscht werden. Analog funktioniert das auch, falls nicht Kategorien, sondern Produkte nicht (mehr) vorhanden sind:
1 2 3 4 |
SELECT cp.product_id FROM `catalog_category_product` cp LEFT JOIN catalog_product_entity p ON cp.product_id = p.entity_id WHERE ISNULL( p.entity_id ) |
Anschließend lässt sich der Index üblicherweise problemlos wieder aufbauen.
Vielen Dank an dieser Stelle an Damian Luszczymak, der den Anstoß hierzu gegeben hat.

Autor: Andreas von Studnitz
Andreas von Studnitz ist Diplom-Informatiker, Magento-Entwickler und Geschäftsführer von integer_net. Seine Schwerpunkte sind Entwicklung, Beratung und die Durchführung von Schulungen. Er ist Magento 2 Certified Professional Developer Plus und hat darüber hinaus weitere Magento Zertifizierungen für Magento 1 und Magento 2. Sowohl im Jahr 2019 als auch 2020 wurde Andreas als Magento Master in der Kategorie „Mentor“ ausgezeichnet.