Neueste Blog-Einträge
Kurzinfo

Andreas von Studnitz
- Diplom-Informatiker
- 6 Jahre Entwicklungs- und Projektleitungserfahrung in einer Internet-Agentur
- Magento-Freelancer
- Magento Certified Developer
- 4 Jahre Magento-Erfahrung
Kontakt
Telefon:
02408 937 965 1 oder
0170 486 0 464
E-Mail:
avs(at)avs-webentwicklung.de
Twitter: twitter.com/avstudnitz
Magento: Fehler beim Index-Aufbau - Sofortmaßnahmen
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.

vielen Dank, ich denke der Post ist sehr hilfreich! So ein Fehler ohne Begründung kann einem ja echt den Spaß verderben :)
Grüße!
wie finde ich den raus, welcher Datensatz den Fehler verursachen?
Meine Fehlermeldung lautet:
Product Flat Data index process unknown error:
a foreign key constraint fails (`b_online_st
ore_de_5`.`#sql-e6c_262`, CONSTRAINT `FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENT
T_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_id`
) ON DELETE CA)'
hier handelt es sich um einen anderen Index, und zwar den Product-Flat-Index. Einem Eintrag in der Tabelle catalog_product_flat_1, Feld entity_id, fehlt die Referenz auf die Tabelle catalog_product_entity, Feld entity_id.
Die zugehörige SQL-Abfrage könnte wie folgt aussehen:
SELECT pf1.entity_id
FROM catalog_product_flat_1 pf1
LEFT JOIN catalog_product_entity p ON pf1.entity_id = p.entity_id
WHERE ISNULL( p.entity_id )
Erstmal danke für dein Tutorial.
Habe folgende Fehlermeldung zurückbekommen, mit der ich nicht so recht weiß, wie ich Sie beheben kann:
___________________
Product Flat Data index process unknown error:
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Kann Kind-Zeile nicht hinzufügen oder aktualisieren: eine Fremdschlüsselbedingung schlägt fehl (`usr_p46_1`.<result 2 when explaining filename '#sql-17b3_23d784'>, CONSTRAINT `FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity)' in /html/magento/lib/Zend/Db/Statement/Pdo.php:228
_________________________
Hast du ein Tipp für mich?
Danke und Gruß
Jens
das scheint das gleiche Problem zu sein wie bei "abase" weiter oben in den Kommentaren. Hilft evtl. auch bei dir mein Ansatz, den ich im Kommentar vom 31.8. beschrieben habe?
Was ist danach die beste Vorgehensweise um den Fehler zu reparieren? Kann man das überhaupt reparieren oder muß man die Artikel löschen? Wenn löschen dann Via Backend oder direkt in der Tabelle catalog_product_flat_1 ?
Dank und Gruß
Jens
Schönen Dank für die schnelle Hilfe.
Gruß
Jens
ich bräuchte auch mal schnell Deine Hilfe:
bei mir hat sich auch eine Inkonsitenz eingeschlichen:
Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`.../sales_flat_quote_item`, CONSTRAINT `FK_SALES_QUOTE_ITEM_SALES_QUOTE` FOREIGN KEY (`quote_id`) REFERENCES `sales_flat_quote` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE)' in .../lib/Zend/Db/Statement/Pdo.php:234
jedoch mit:
SELECT qi.quote_id
FROM sales_flat_quote_item qi
LEFT JOIN sales_flat_quote q ON qi.quote_id = q.entity_id
WHERE ISNULL( q.entity_id )
bekomme ich ein leeres Resultat...
Ist der Query falsch?
Hättest Du mir einen Rat?
Danke!
Gruß
Jürgen
der (das? die?) Query sieht korrekt aus. Wo tritt der Fehler denn auf? Einen Index gibt es dazu ja nicht...
Wahrscheinlich 'das Query' - im Süden eindeutig 'der' ;)
Aber: Ohje - ich glaube, jetzt wirds kompliziert...
Also: über einen Konfigurator entstehen bei bestimmten Artikel Custom-Options, die beim Gang in den Warenkorb, bzw. Wunschliste in die Datenbank müssen. Das wird über eine eigene Methode am Event-Observer checkout_cart_product_add_after erledigt. Das klappt auch mit fast allen Artikeln. Offensichtlich hat sich bei bestimmten diese Inkonsistenz eingeschlichen und da wird das Übernehmen in den Warenkorb/Wunschliste mit Eintrag in Exception.log verweigert. Einen besseren Überblick hab ich im Moment nicht - finde aber komisch, dass sich die Lecks mit Deiner Methode nicht finden lassen...
Gruss
Jürgen
exception 'PDOException' with message 'SQLSTATE[23000]: ...
Gruss
Jürgen
Leerung der Tabellen: sales_flat_quote und sales_flat_quote_item hat in meinem Fall erst mal geholfen...
Gruß
Jürgen
vielen Dank für den Artikel.
Allerdings hätte auch ich eine Frage:
Nach mehreren Minuten leibt der Attribute Index immer auf "Verarbeitung" stehen.
in der index_process ist auch nur der Status "working" angeben.
Kann (darf) man den Staus händisch zurücksetzen?
Woran erkenne ich ob der Index tatsächlich aktuell ist?
Vielen Dak
Andreas
Klasse Anleitung. Bin auch schon ein Stück weiter. Was mir aber noch fehlt sind drei Indizes, die sich nicht aktualisieren wollen:
php indexer.php --reindex catalog_product_price
(`00019_magento`.`catalog_product_index_tier_price`, CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`enti)'...
php indexer.php --reindex catalog_product_attribute
(`00019_magento`.`catalog_product_index_tier_price`, CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`enti)'...
php indexer.php --reindex catalog_url
An error occurred while saving the URL rewrite
Ich hab jetzt schon wie wild versucht, den Fehler zu finden. Wenn ich Deine Abfragen aber umbaue, kommt bestenfalls das Ergebnis 0. Daher weiß ich jetzt auch nicht mehr, wo ich suchen soll :-)
Viele Grüße
Roland
Das URP-Problem habe ich ganz pragmatisch durch ein leeren der Tabelle "core_url_rewrite" gelöst. Damit sind zwar meine 301-Weiterleitungen weg, aber so viele sollten das nicht gewesen sein
Bei der anderen Sache bin ich nicht weiter. Wie mir erstmal nicht aufgefallen ist, dass der Fehler immer mit der "catalog_product_index_eav" zu tun hat. Diese ist aber leer bei mir... Woran ich, glaube ich, nicht ganz unschuldig bin O:-) geändert hatte das aber am Indizierungsfehler nichts.
Die anderen beiden Fehler sind verschwunden, nachdem ich die zuvor hochgeladenen Artikel einzeln geöffnet und gespeichert habe. Das ist zwar unschön, fürs erste aber okay. Weitere Uploads muss ich erst noch fertig machen, um zu testen, ob es dann wieder normal funktioniert.
http://www.magentocommerce.com/boards/viewchild/70/
Danke dennoch, der Artikel hier und der für den Magento-Adventskalender hat mir schon sehr geholfen ;-)
das ist etwas kompliziert. Man kann auch ganz einfach "php indexer.php info" aufrufen um eine Liste der verfügbaren Indexer zu sehen.
>> ADD CONSTRAINT `FK_CATALOG_CATEGORY_FLAT_STORE_2_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES
`core_store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE,
>> ADD CONSTRAINT `FK_CAT_CTGR_FLAT_STORE_2_ENTT_ID_CAT_CTGR_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catal
og_category_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Das kommt bei der Neuzuordnung der EAV Artikel Struktur zur Flat Struktur
... Ich komme da jetzt garnicht mehr weiter. Welchen SQL Befehl soll ich da denn verwenden?
Gruß Nick
Kommentar hinzufügen