In diesem Artikel geben wir Dir Hinweise zur Migration und wie Du bei der Fehleranalyse weiter vorgehen kannst.
Neben den großen Log-Dateien gibt es noch weitere Datenbanktabellen, in welchen Fehler und Fehlerhinweise zur Migration aufgeführt werden. So lässt sich zum Beispiel innerhalb der Tabelle "swag_migration_logging" anhand der Fehler-Level und/oder der Entität, bei der es Probleme gibt, filtern.
Weitere interessante Tabellen sind:
`swag_migration_mapping`
`swag_migration_media_file`
`swag_migration_data`
Beinhaltet Dein Quellshop sehr große Datenmengen oder Du möchtest die Migration im Hintergrund laufen lassen, so empfehlen wir Dir die Migration per Konsole (CLI). Der Start der Migration per CLI lässt sich nach dem Schritt "Datencheck" starten.
Wichtig ist, dass Du die Migration zunächst normal über die Administration startest und nach dem Schritt Datencheck abbrichst. Navigiere dann in der Konsole in das Hauptverzeichnis des Zielshops. Du solltest Dich jetzt oberhalb des Ordners public befinden.
Führe hier folgenden Befehl aus:
php bin/console migration:migrate Argument
Die Variable Argument kann folgende Werte enthalten:
basicSettings: Grundeinstellungen und Kategorien (SalesChannel Anlage etc.) Wird automatisch beim Import anderer DataSelections ausgeführt.
cms: Layouts.
customersOrders: Alle Kunden, Bestellungen und Dokumente.
media: Alle Medien und Ordner.
newsletterRecipient: Newsletter-Empfänger.
products: Alle Produktdaten und dazugehörigen Entitäten. Ebenfalls dazugehörige Entitäten aus "media".
productReviews: Produktbewertungen.
promotions: Rabatte & Aktionen.
seoUrls: SEO URLs.
customerWishlists: Merklisten.
Bei sehr großen Datenmengen kann die Migration direkt über eine lokal liegende Datenbank sinnvoll sein, da sich dadurch die Last auf ein System begrenzt. Bei einer Anzahl von mehreren Millionen Datensätzen, insbesondere Varianten, kann die Migration einiges an Zeit benötigen.
Es wird nicht nur eine Information ausgelesen, sondern die Daten werden beim Lesevorgang bereits für den anschließenden Schreibvorgang vorbereitet. Natürlich soll der Assistent eine möglichst reibungslose Migration ermöglichen, aber derart große Datenmengen sind immer eine Herausforderung und nicht der Haupteinsatzzweck der Erweiterung. In solchen Edge Cases kann daher auch Nacharbeit nötig sein.
Ob die Migration lokal oder per API / Shop-Domain erfolgen soll, kann innerhalb des Migrations-Assistenten (Verbindung bearbeiten) definiert werden.
Die folgende Fehlermeldung kann erscheinen, wenn Du Dich zum Beispiel bei der Eingabe der Shop-Domain/API-Schlüssels verschrieben hast. Solltest Du Dir sicher sein, dass die Domain richtig ist, so kann die Ursache auch daran liegen, dass Du nicht die aktuelle Version der Migrations-Erweiterung im Einsatz hast. Bitte überprüfe daher die Version der Erweiterung und führe das zur Verfügung stehende Update durch.
Vollständige Fehlermeldung:
Keine Verbindung hergestellt
Es konnte keine Verbindung zum angegebenen Server hergestellt werden. Bitte überprüfe die angegebene Shop-Domain.
Ein nicht vollständig aufgebauter Index kann dazu führen, dass die Migration "stecken" bleibt. Ein Beleg dafür können folgende Benachrichtigungen sein, welche allesamt eine nicht abgeschlossene Indizierung andeuten:
Circa 1395350 Produkte verbleibend ...
Circa 1400 Kategorien verbleibend ...
[...]
Damit die Indexierung vollständig abgeschlossen werden kann, muss folgendes sichergestellt sein:
Genügend Ressourcen am Server, ein ausreichend hohes Memory Limit (mind. 2GB)
Es dürfen vom Server keine langandauernden Prozesse beendet werden
Die Message Queue muss zurückgesetzt werden:
Das Zurücksetzen der Message Queue kann wie folgt durchgeführt werden:
dead_message
CREATE TABLE backup_dead_message LIKE dead_message;
INSERT INTO backup_dead_message SELECT * FROM dead_message;
DELETE FROM dead_message;
enqueue
CREATE TABLE backup_enqueue LIKE enqueue;
INSERT INTO backup_enqueue SELECT * FROM enqueue;
DELETE FROM enqueue;
messsage_queue_stats
CREATE TABLE backup_message_queue_stats LIKE message_queue_stats;
INSERT INTO backup_message_queue_stats SELECT * FROM message_queue_stats;
DELETE FROM message_queue_stats;
backup_increment
CREATE TABLE backup_increment LIKE increment;
INSERT INTO backup_increment SELECT * FROM increment;
DELETE FROM increment;
Im Anschluss stelle bitte sicher, dass die Message Queue über die CLI abgearbeitet wird:
https://docs.shopware.com/de/shopware-6-de/tutorials-und-faq/message-queue-und-scheduled-tasks#admin-worker-deaktivieren-und-cli-worker-einrichten
Die Neuindizierung über die Message Queue kannst Du nun mittels folgendem CLI Befehl auslösen:
bin/console dal:refresh:index --use-queue
Die Indizierung wird dann über die Message Queue abgearbeitet, was mehrere Stunden in Anspruch nehmen kann. Sobald dies abgeschlossen wurde, sollte abschließend der Cache via FTP geleert werden (alle Unterordner aus /var/cache/* löschen).
Wurde die Migration zum Beispiel zu Testzwecken bereits durchgeführt, so hat sich die Shopware Installation die bereits übertragenen Artikel gemerkt. Alle gelesenen Daten erhalten eine Prüfsumme, mit der bei späteren Migrationen überprüft wird, ob die Daten schon einmal migriert wurde. So wird verhindert, dass Daten doppelt migriert und ggf. überschrieben werden
Um die angesprochene Prüfsumme zu erzeugen, legt Shopware eine neue Tabelle namens "swag_migration_mapping" an. Das Zurücksetzen der Prüfsumme und auch eine erneute Migration ohne das Zurücksetzen der Prüfsumme ist beliebig oft durchführbar. Dies geschieht über die Migrations-Erweiterung und wird in folgendem Artikel genauer beschrieben:
https://docs.shopware.com/de/migration-de/shopware6-Migrationsprozess#migration-erneut-durchfuehren
Innerhalb der Tabelle "swag_migration_mapping" lassen sich manuell auch einzelne Daten löschen, um z.B. nur die Übertragung bestimmter Entitäten nochmals durchzuführen. Durch folgenden SQL Befehl würden zum Beispiel lediglich die Newsletter Empfänger erneut migriert werden. Die Entität kann entsprechend verändert werden:
UPDATE swag_migration_mapping
SET checksum = null
WHERE entity = "newsletter_recipient"