Autor Thema: Datenbankabfrage um alle PNs vor 2010 zu löschen ?  (Gelesen 1488 mal)

0 Benutzer und 1 Gast betrachten dieses Thema.

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« am: 04. März 2010, 12:00 Uhr »
Hallo zusammen,

ich möchte alle älteren PNs löschen weil diese doppelt so viel Platz brauchen wie die Inhalte in den öffentlichen Boards...

Bei der "Konkurenz" hab ich das in diesem Board gesehen:

Zitat
select * from smf_personal_messages pm, smf_pm_recipients pmr
where pm.id_pm=pmr.id_pm
and pm.id_member_from=12345
and pmr.id_member=54321


In der Tabelle smf_personal_messages gibt es das Feld:  msgtime. Mustereintrag: "1148074670".

Somit wäre ich für nen Tipp dankbar wie das SQL Statement auszusehen hat, und vor allem einen Hinweis dazu, ob mir das die SMF-Software übelnehmen wird. (Die neueren PNs möchte ich ja erhalten...)

Danke im Vorraus.


Edit: Was mich wundert ist, dass SMF dazu keine Funktion mitbringt (oder ich bin blind)...

Christian Land

  • Mitglied
  • *
  • Beiträge: 24
    • tagdocs.de
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #1 am: 04. März 2010, 16:33 Uhr »
Ich übernehme keinerlei Garantien, da ich wirklich ziemlich aus dem Thema raus bin aber

DELETE FROM smf_personal_messages WHERE msgtime <= UNIX_TIMESTAMP('2010-01-01 00:00:00');
sollte alle PMs löschen die älter als der 1.1.2010 sind. Problematisch wird die Sache dadurch, dass dann die pm_recipients-Tabelle Murks enthält.

Die aufzuräumen ist ein wenig Tricky... aber wozu gibt es Subqueries in SQL :-)

DELETE FROM
                smf_pm_recipients AS r2
WHERE
        r2.ID_PM IN(
                        SELECT
                                r.ID_PM
                        FROM
                                smf_pm_recipients AS r
                        LEFT JOIN
                                smf_personal_messages AS p ON (r.ID_PM = p.ID_PM)
                        WHERE
                                ISNULL(p.ID_PM)
                )
               
sollte alle Datensätze aus der pm_recipients-Tabelle löschen zu denen keine Nachricht mehr existiert.

Am sinnvollsten wäre wohl wenn jemand mit Testforum das Ganze ausprobieren könnte damit ich keine Katastrophe anrichte ;D

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #2 am: 05. März 2010, 18:16 Uhr »
Kann ich gut verstehen, dass das keiner für mich testen will.

Ich hab auch nen lokalen Server und hab das erst mal mit ner quasi leeren Foren-DB versucht:

Zitat
Fehler

SQL-Befehl: Dokumentation

DELETE FROM smf_pm_recipients AS r2 WHERE r2.ID_PM IN (
SELECT r.ID_PM
FROM smf_pm_recipients AS r
LEFT JOIN smf_personal_messages AS p ON ( r.ID_PM = p.ID_PM )
WHERE ISNULL( p.ID_PM )
)

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS r2
WHERE
        r2.ID_PM IN(
                        SELECT
         ' at line 2

Somit macht es vermutlich erst dann Sinn das mit ner Kopie der Foren-DB zu testen wenns generell läuft. Der gepackte Dump der Foren DB ist etwas größer und noch nicht auf meiner Platte...

Für Hinweise wäre ich Dankbar !

Meine lokale Umgebung:
Zitat
# Server Version: 5.0.51a-24+lenny2
« Letzte Änderung: 05. März 2010, 19:15 Uhr von ranseyer »

xduugu

  • Ehrenmitglied
  • **
  • Beiträge: 3764
  • hat auch schon mal ein SMF installiert...
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #3 am: 06. März 2010, 13:53 Uhr »
Es sollte auch reichen, wenn du die erste Query ausführst und dann nachher eine Reparatur anstößt (ACP→Forenwartung→Fehler finden und reaparieren oder so etwas).
Rette deine Freiheit

PHP ist wie das Schnabeltier. - Von allem ein bisschen.

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #4 am: 06. März 2010, 17:32 Uhr »
@xduugu: Danke: So hab ich das auf meiner test-DB erfolgreich getestet. Da waren es zwei PNs die gelöscht würden, und bei der Repartur gabs auch ne Meldung dass zwei Einträge in der passenden Tabelle repariert wurden 


Trotzdem Mist !

jetzt hab ich das auf die Produktive DB angewendet, und ne Menge Platz gewonnen. Problem: Die Reparaturfunktion findet keine Fehler. Dierse läuft nur so gute 5 Minuten und meldet dann keine Fehler gefunden...

Somit hab ich nun ne inkonsistente DB produktiv und keine Lösung. Umso froher wäre ich deshalb über Tipps  :[
(Und möglichst nicht in beiden Tabellen alle Einträge löschen...)

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #5 am: 06. März 2010, 17:46 Uhr »
Problem glöst. Nur kann ich nicht zu 100% sagen wie !

Ich habe jetzt nochmals laufen gelassen:

1) Alle totalen Forumswerte und Statistiken neu auszählen
und dann erst nochmal: 2) Fehler finden und reparieren


Bei Punkt 2 kam dann "Fehler gefunden: "???" reparieren ja/nein"
Das hat das Thema dann gelöst.

Danke !

Christian Land

  • Mitglied
  • *
  • Beiträge: 24
    • tagdocs.de
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #6 am: 06. März 2010, 17:55 Uhr »
Meh... und ich hab extra neue SQL-Queries gebastelt *lol* Da warst Du wohl schneller *g*

Das Problem hätte man vermutlich auch mit

UPDATE smf_pm_recipients AS t1 LEFT JOIN smf_personal_messages AS t2 ON t1.ID_PM = t2.ID_PM SET t1.ID_PM = 0 WHERE t2.ID_PM IS NULL;

DELETE FROM smf_pm_recipients WHERE ID_PM = 0;

gelöst ;) Die erste Query hätte alle herrenlosen PMs auf ID = 0 verbogen und die zweite hätte die dann gelöscht...

Keine Ahnung warum die andere Query nicht ging.

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #7 am: 07. März 2010, 11:23 Uhr »
Danke an alle für euren Beistand  :!.!:


@Christian, ich werde das beim nächsten Mal testen !

Jorin

  • Gründervater
  • Administration
  • ****
  • Beiträge: 12344
    • Das Textual
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #8 am: 07. März 2010, 15:05 Uhr »
Wurde dein Problem gelöst, markiere das Thema bitte dementsprechend. Eine Anleitung hierzu findest du hier. Danke.
Themen als gelöst markieren | Bitte keine Supportfragen per PM - Nutze bitte unser Forum!
Das SMFPortal.de bei Facebook | Das SMFPortal.de immer dabei

So geht Hybrid - schau es Dir doch einmal an! | Ich im Netz | Die HYBRID-Piloten | SMFPortal.de | 21 ist nur die halbe Wahrheit!

Neakro

  • Ehrenmitglied
  • **
  • Beiträge: 4499
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #9 am: 07. März 2010, 17:58 Uhr »
jetzt hab ich das auf die Produktive DB angewendet, und ne Menge Platz gewonnen. Problem: Die Reparaturfunktion findet keine Fehler. Dierse läuft nur so gute 5 Minuten und meldet dann keine Fehler gefunden...

Warum macht eigentlich niemand Backups vor so riesigen Eingriffen?!
Für mehr Gelb im Logo!          [Notizen]

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #10 am: 07. März 2010, 18:02 Uhr »
Backup hab ich schon, nur mag ich das nicht restoren, weil das 30 Minuten Downtime bedeuten würde... Dann lieber 2-3 Tage auf die Reparatur warten...

ranseyer

  • Mitglied
  • *
  • Beiträge: 16
Re: Datenbankabfrage um alle PNs vor 2010 zu löschen ?
« Antwort #11 am: 10. Juli 2010, 12:45 Uhr »
geht auch nicht. Ich werd es wieder manuell reparieren...


Zitat
#1062 - Duplicate entry '0-132' for key 1

Meh... und ich hab extra neue SQL-Queries gebastelt *lol* Da warst Du wohl schneller *g*

Das Problem hätte man vermutlich auch mit

UPDATE smf_pm_recipients AS t1 LEFT JOIN smf_personal_messages AS t2 ON t1.ID_PM = t2.ID_PM SET t1.ID_PM = 0 WHERE t2.ID_PM IS NULL;

DELETE FROM smf_pm_recipients WHERE ID_PM = 0;

gelöst ;) Die erste Query hätte alle herrenlosen PMs auf ID = 0 verbogen und die zweite hätte die dann gelöscht...

Keine Ahnung warum die andere Query nicht ging.