Magento Certified Developer

Kurzinfo


Andreas von Studnitz

  • Diplom-Informatiker
  • 6 Jahre Entwicklungs- und Projektleitungserfahrung in einer Internet-Agentur
  • Magento-Freelancer
  • Magento Certified Developer
  • 4 Jahre Magento-Erfahrung

mehr »

Kontakt

Telefon:
02408 937 965 1 oder
0170 486 0 464

E-Mail:
avs(at)avs-webentwicklung.de 

Twitter: twitter.com/avstudnitz

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

Vinai Kopp, 28.08.11 03:33:
Hey Andreas,
vielen Dank, ich denke der Post ist sehr hilfreich! So ein Fehler ohne Begründung kann einem ja echt den Spaß verderben :)
Grüße!
abase , 31.08.11 13:12:
Hab es mal ausprobiert,
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)'
Andreas von Studnitz, 31.08.11 13:50:
Hallo abase,
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 )
abase , 31.08.11 14:27:
..bin Dir zu großen Dank verpflichtet! Das Problem ist gelöst. Wenn Du einen Linkwunsch hast, lass es mich wissen, werde gerne einen Link zu deinen Blog setzen!
Jens , 21.11.11 10:56:
Hallo Andreas,
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
Andreas von Studnitz, 21.11.11 11:45:
Hallo 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?
Jens , 21.11.11 12:55:
Vielen Dank für die schnelle Antwort und Hilfe.

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
Andreas von Studnitz, 21.11.11 13:11:
Ich würde die entsprechenden Datenbankeinträge in der catalog_product_flat_1 löschen und anschließend neu indizieren. Mit etwas Glück ist das Problem anschließend behoben.
Jens , 21.11.11 13:36:
Super! Hat geklappt :-)

Schönen Dank für die schnelle Hilfe.

Gruß

Jens
Jürgen , 03.01.12 09:20:
Hallo Andreas,

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
Andreas von Studnitz, 03.01.12 09:27:
Hallo Jürgen,
der (das? die?) Query sieht korrekt aus. Wo tritt der Fehler denn auf? Einen Index gibt es dazu ja nicht...
Jürgen , 03.01.12 10:06:
Danke, Andreas, für die schnelle Antwort!

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
Jürgen , 03.01.12 11:09:
noch vergessen: die Exception beginnt nicht mit einem Index-Hinweis, sondern mit:

exception 'PDOException' with message 'SQLSTATE[23000]: ...

Gruss
Jürgen
Jürgen , 03.01.12 12:23:
falls jemand mit ähnlichem Problem nach Lösung sucht:
Leerung der Tabellen: sales_flat_quote und sales_flat_quote_item hat in meinem Fall erst mal geholfen...

Gruß
Jürgen
Andreas Nickl, 03.01.12 16:48:
Hallo,

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
Roland , 09.01.12 19:26:
Hallo!

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
Roland , 10.01.12 00:10:
Hallo nochmal :-)

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.
Roland , 10.01.12 13:41:
Und schon wieder :-)

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.
Roland , 14.01.12 21:37:
FYI: Nach einem erneuten Import, bzw. diesmal einem Update sind wieder die beiden benannten Indizes nicht mehr funktionstüchtig. :(
Roland , 15.01.12 13:12:
Ich habs mal im Forum gepostet, sonst mülle ich noch weiter Deinen Blog zu :D

http://www.magentocommerce.com/boards/viewchild/70/

Danke dennoch, der Artikel hier und der für den Magento-Adventskalender hat mir schon sehr geholfen ;-)
Alexander Menk, 07.02.12 09:46:
>> Den passenden Code erhält man über die Datenbanktabelle "index_process" <<

das ist etwas kompliziert. Man kann auch ganz einfach "php indexer.php info" aufrufen um eine Liste der verfügbaren Indexer zu sehen.
Nick F, 15.02.12 12:30:
>> ALTER TABLE `catalog_category_flat_store_2`
>> 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

* - Pflichtfeld

*




*