2009-04-30 5 views
1

Suchen Sie, um Daten für alle Daten, die Y Tage alt sind, aus der Tabelle A in die Verlaufstabelle B zu verschieben, und entfernen Sie dann die Daten aus der Verlaufstabelle B, die älter als Z Tage ist.Wie können Daten, die älter als 'Y' Tage sind, in eine Archiv-/Verlaufstabelle in MySQL verschoben werden?

Nur verschiedene Möglichkeiten, dies zu erreichen. So würden alle Vorschläge geschätzt werden.

Beispiel für Variablen X - 7 Tage Y - 60 Tage z - 365 Tage

Danke

Antwort

3
CREATE PROCEDURE prc_clean_tables (Y INT, Z INT) 
BEGIN 
     BEGIN TRANSACTION; 

     DECLARE _now DATETIME; 
     SET _now := NOW(); 

     INSERT 
     INTO b 
     SELECT * 
     FROM a 
     WHERE timestamp < _now - INTERVAL Y DAY; 
     FOR UPDATE; 

     DELETE 
     FROM a 
     WHERE timestamp < _now - INTERVAL Y DAY; 

     DELETE 
     FROM b 
     WHERE timestamp < _now - INTERVAL Z DAY; 

     COMMIT; 
END 
+0

Gibt es eine Möglichkeit, diese Prozedur alle 7 Tage auszuführen, oder Sie müssen ein Skript CRON ausführen, um es auszuführen? Danke nochmal –

+0

Nein, du musst Cron benutzen. – Quassnoi

+0

das ist eine coole Lösung. Eine Variante, die Sie vielleicht in Erwägung ziehen: fügen Sie dem Verlauf neue Zeilen hinzu, während sie zur Haupttabelle hinzugefügt werden (vielleicht über einen Auslöser). Dies hat den Effekt, dass es immer eine Teilmenge von b anstelle von zwei disjunkten Mengen ist, was in einigen Kontexten seine Vorteile hat. Somit wird die Bereinigung auf zwei Löschanweisungen reduziert. – yetanotherdave

0

Der einfachste Weg wäre natürlich die Zeilen aus der Online-Tabelle in die Geschichte einfügen Tabelle dann lösche. Das in einer SPROC zu verpacken, wie es Quassnoi vorschlägt, wäre perfekt.

Ein anderer potenziell besserer Weg wäre, partitioning zu nutzen. Wenn Sie Ihre Tabellen nach Datum partitioniert haben, sollten Sie in der Lage sein, mindestens die DELETE-Teile zu beschleunigen, indem Sie einfach die entsprechende Partition löschen. Der INSERT-Teil kann auch schneller sein, da alle eingefügten Zeilen von einer Partition kommen würden (wenn Sie Ihre Partitionen richtig erstellen).

Wenn die Schemas identisch sind, kann es sogar einen Trick geben, der es Ihnen ermöglicht, die Partitionen relativ schnell von einer Tabelle zur anderen zu verschieben.

+0

Ich checke das ein, danke –

1

Dies scheint geradlinig.

Sie möchten einen nächtlichen Cron-Job, um ein Skript auszuführen.

#crontab -e 

50 11 * * * $HOME/scripts/MyWeeklyArchive.sh 

Die Skriptdatei selbst ist ziemlich einfach. Wir verwenden nur mysqldump und die Now() -Funktion;

#! /bin/bash 

/usr/bin/mysqldump -uUser -pPassword Current_DB Table --where='date < NOW() - INTERVAL 7 DAY' | /usr/bin/mysql -uUser -pPassword archive_DB 

könnten Sie enthalten nur diese Zeile in der cron-Datei, aber für die Skalierbarkeit und so ich kann es empfehlen ein Skript-Datei zu machen.

+0

Danke, das hilft sehr, ich bin ziemlich neu in CRON –

+0

@Josh Je nach Konfiguration möchten Sie vielleicht exportieren Editor = vi vor dem Crontab Befehl. Es wird Ihnen erlauben, vi zu verwenden, was viel einfacher ist als der Standard-Crontab-Editor – Eddie

1

Wenn Sie MySQL 5.1 verwenden, können Sie vielleicht anstelle von cron den Event-Scheduler verwenden. Ich habe es nicht verwendet, aber ich habe etwas ähnliches in SQL Server verwendet.