Kurzinfo


Andreas von Studnitz

mehr »

Andreas von Studnitz arbeitet seit 2012 als Geschäftsführer und Entwickler für die Magento-Agentur integer_net GmbH. Aktuelle Informationen finden Sie unter www.integer-net.de

Kontakt

Bitte kontaktieren Sie mich über die Website von integer_net.

mehr »

< Magento: Versandkosten im Warenkorb anzeigen

Magento: Fehler beim Index-Aufbau - Sofortmaßnahmen

24.08.2011 16:37

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:

php indexer.php

Den Status der Indizes erhält man über:

php indexer.php --status

Der Indizierungsprozess wird angestoßen über den Aufruf

php indexer.php --reindex

Soll nur ein Index angestoßen werden, kann man als Parameter noch den Code des Index angeben, z.B.

php indexer.php --reindex catalog_category_product

Den passenden Code erhält man über die Datenbanktabelle "index_process".

Eine Fehlermeldung wird hierbei ausgegeben, mit der man auf Fehlersuche gehen kann.

 

Häufig liegt das Problem in inkosistenten Daten in der Datenbank. Aktuelles Beispiel: 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:

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:

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 auch an Damian Luszczymak, der den Anstoß hierzu gegeben hat.

Kommentare