Neu tbesucherarchiv manuell verschlanken

hii

Gut bekanntes Mitglied
6. Januar 2009
126
8
NRW
Hallo zusammen,

da wir nach dem Update vom JTL Shop 3 (3.18) auf JTL Shop 4 (4.06 – Build: 12) derzeit sporadisch Performance Probleme haben, sind wir auf die Suche nach der Ursache.

Nun wurde (experimentell) die „Automatische Shop Bereinigung (GarbageCollector)“ (Einstellung 1522) aktiviert, was zu „too many connections“ führte.
Ich nehme an, das die Tabelle „tbesucherarchiv“ dafür verantwortlich ist, da sie inzwischen auf stolze 1,2 GB angewachsen ist.
Nun ist der Gedanke das „erste Aufräumen“ zumindest von dieser Tabelle manuell zu machen und erst danach wieder den GarbageCollector zu aktivieren.

Allerdings wollen wir die letzten 12 Monate immer vorhalten.

Kann mir jemand freundlicherweise einen passenden SQL Befehl für dieses Vorhaben zur Verfügung stellen und mir auch sagen, ob bei der Datenmenge das Löschen auch wieder den Server „Down gehen lässt“?

Eine weitere Frage wäre ob man, ohne Probleme erwarten zu müssen, die Zeiten (cInterval) in der „/classes/class.JTL-Shop.GarbageCollector.php“ anpassen kann.

Vielen Dank für Eure Mithilfe!
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Hallo,
Allerdings wollen wir die letzten 12 Monate immer vorhalten.
Dann dürft ihr den GarbageCollector nicht aktivieren! Dieser löscht alle Einträge, die älter als 180 Tage, also ca. 6 Monate sind.

Kann mir jemand freundlicherweise einen passenden SQL Befehl für dieses Vorhaben zur Verfügung stellen und mir auch sagen, ob bei der Datenmenge das Löschen auch wieder den Server „Down gehen lässt“?
Der Löschbefehl, den der GarbageCollector verwenden würde, würde so aussehen:
SQL:
DELETE tbesucherarchiv, tbesuchersuchausdruecke
FROM tbesucherarchiv
LEFT JOIN tbesuchersuchausdruecke ON tbesuchersuchausdruecke.kBesucher = tbesucherarchiv.kBesucher
WHERE DATE_SUB(now(), INTERVAL 180 DAY) >= tbesucherarchiv.dZeit
Um damit nicht die DB in die Knie zu zwingen, sollte man das zu einer "verkehrsschwachen" Zeit und am besten direkt auf der Konsole (kein Web-Frontend) machen. Durch Anpassen des Intervalls kann man das auch in mehreren Schritten machen. Also statt der 180 mit z.B. 3650 anfangen, um zuerst alles was älter als 10 Jahre ist zu löschen, und dann diesen Wert sukzessive (um zb. 365) bis zur 180 reduzieren. Damit werden immer nur "ein paar" Datensätze gelöscht und die DB weniger belastet.

Eine weitere Frage wäre ob man, ohne Probleme erwarten zu müssen, die Zeiten (cInterval) in der „/classes/class.JTL-Shop.GarbageCollector.php“ anpassen kann.
Von der Veränderung von Shop-Core-Dateien rate ich generell ab! Solange ihr die Daten fristgemäß anonymisiert oder generell nur anonymisiert speichert, sollte das jedoch kein Problem sein. Rechtlich sicher kann euch das aber nur der Datenschutzbeauftragte eures Vertrauens sagen. ;)
 
  • Gefällt mir
Reaktionen: hula1499

hii

Gut bekanntes Mitglied
6. Januar 2009
126
8
NRW
Guten Morgen,

vielen Dank für die Wertvollen Tipps!

Um damit nicht die DB in die Knie zu zwingen, sollte man das zu einer "verkehrsschwachen" Zeit und am besten direkt auf der Konsole (kein Web-Frontend) machen.
Also am besten per SSH und nach Möglichkeit nicht im phpmyadmin?

Ist es korrekt, dass der Befehl dann so aussehen muss:
SQL:
mysql –user=“[DBUSER]“ –password=“[DBPASS]“ –database=“[DB]“ –execute=“DELETE tbesucherarchiv, tbesuchersuchausdruecke FROM tbesucherarchiv LEFT JOIN tbesuchersuchausdruecke ON tbesuchersuchausdruecke.kBesucher = tbesucherarchiv.kBesucher WHERE DATE_SUB(now(), INTERVAL 180 DAY) >= tbesucherarchiv.dZeit“
 

FPrüfer

Moderator
Mitarbeiter
19. Februar 2016
1.878
518
Halle
Also am besten per SSH und nach Möglichkeit nicht im phpmyadmin?
Genau das meinte ich damit. Wenn die Ausführung wirklich länger dauert und die maximale Scriptlaufzeit im Web-Frontend erreicht wird, sieht man sonst ggfs. nicht ob es geklappt hat oder Fehler aufgetreten sind.

Ist es korrekt, dass der Befehl dann so aussehen muss:
Syntaktisch dürfte das korrekt sein. Ich persönlich bin jedoch kein Freund davon, DB-Passwörter als Befehlsparameter in die Kommandozeile zu tippen. Ich würde das lieber interaktiv abfragen lassen, also nur -p statt --password="[DBPASS]". Und wie gesagt, wenn es wirklich viele Datensätze über mehrere Jahre sind, dann in kleineren Schritten.
 

networker-007

Aktives Mitglied
16. Dezember 2010
27
0
DELETE tbesucherarchiv, tbesuchersuchausdruecke
FROM tbesucherarchiv
LEFT JOIN tbesuchersuchausdruecke ON tbesuchersuchausdruecke.kBesucher = tbesucherarchiv.kBesucher
WHERE DATE_SUB(now(), INTERVAL 180 DAY) >= tbesucherarchiv.dZeit
Wie gebe ich das Schritt für Schritt ein?

mysql -u USER -p
PASSWORD (enter)
dann bin ich in der mysql-Konsole

wie gehts dann konkret weiter?

Danke für die Hilfestellung


Hier kommt bei mir eine Fehlermeldung
Bash:
mysql –user=“[DBUSER]“ –password=“[DBPASS]“ –database=“[DB]“ –execute=“DELETE tbesucherarchiv, tbesuchersuchausdruecke FROM tbesucherarchiv LEFT JOIN tbesuchersuchausdruecke ON tbesuchersuchausdruecke.kBesucher = tbesucherarchiv.kBesucher WHERE DATE_SUB(now(), INTERVAL 180 DAY) >= tbesucherarchiv.dZeit“

Bash:
-bash: Syntaxfehler beim unerwarteten Wort `('
 
Zuletzt bearbeitet: