[Sql] Char Db Aufräumen

Hi

ich suche ein aktuelles sql script was die char und account datenbank aufräumt nach X tage, weil irgendwie räumt er bei mir nicht auf die Char DB, was in der Config drinne steht. ( nach 30 tage soll er alte chars löschen die inaktive sind, spricht kein login hatten )

Die scripte die ich hier fand, waren alle nicht brauchbar die im Forum sind

würde mich freuen wenn einer sowas schreiben könnte

danke im vorraus

Lies nochmal genau was das bewirkt, was da in der Config steht. Ganz bestimmt nicht das was du da zu verlangen scheinst

ja darum möchte ich ja gerne das es via sql gelöst wird, wie bestimmt viele andere auch

Sorry, aber da wirst du lange suchen können. Denn ein Charakter ist in fast jede Tabelle in der Datenbank Characters verankert. Da musst du alle Einträge löschen die die Charakter GUID haben. Dann lerne lieber etwas mysql bsw und php und schreibe dir ein Script das allen Chars die länger als X Tage nicht mehr online wahren und lösche nicht die Charakter selbst sondern setzte in der Tabelle Characters einfach ein Löschdatum etc. Dann wird der Server den Char als gelöscht ansehen und nach deinen 30 tagen löschen!

Hoffe das war jetzt irgendwie verständlich /emoticons/default_biggrin.png

Ich suche auch nach solch einer Möglichkeit. Also das ich zb sage alle accounts und Chars sollen von Datum x an gelöscht werden oder halt das sie nach 30 Tagen inaktivität automatisch gelöscht werden.

Dies hier ist doch die lösung oder habe ich das falsch verstanden?

/*

  • Clean Auth/Characters DB (REMEMBER TO BACKUP!)
  • Set date to remove all accounts made BEFORE that time
  • Example shown will remove all accounts made before 2010
  • Remember to replace “auth” and “characters” with the names of your databases
    */

SET @date := “2010-01-01 00:00:00”; – Set date and time here

SET @timestamp := (SELECT UNIX_TIMESTAMP(@DATE));
DELETE FROM auth.account WHERE last_login < @date;
DELETE FROM characters.account_data WHERE NOT EXISTS (SELECT NULL FROM auth.account WHERE account.id = account_data.accountId);
UPDATE characters.characters SET deleteDate=@timestamp WHERE NOT EXISTS (SELECT NULL FROM auth.account WHERE account.id = characters.account);

Stammt von diesem Forum Post. Klick mich

Aber der löscht ja alle account vor dem Datum X

Ich möchte aber alle accounts und chars ab dem datum X löschen bzw alle die länger als 100 Tage offline waren.

Ein Script, dass die Charactere sauber löscht, müsste aber wesentlich mehr beinhalten. Dein Beispiel löscht die Charactere selbst, aber nicht deren “Überbleibsel” wie Eintragungen in Gilden, Gruppen, Arenateams usw., deren Items und was sonst noch so von denen in der Datenbank rum keucht und fleucht.

Besser wäre eine Umsetzung in CPP bei der die bereits vorhandenen Funktionen genutzt werden, um einen Char zu löschen. Such doch mal im Code, an welcher Stelle gehandelt wird, wenn ein Char gelöscht wird. Nimm dir diesen Code und bringen ihn beispielsweise an den Startup des Servers und versieh ihn mit einem Check nach dem Datum.

ja okay danke

aber ich verstehe die Char delete funktion die schon in der Core eingebaut ist nicht.

Was macht die denn nun genau? Und wie aktiviert man diese denn wenn ich das so Teste und die anschalte passiert rein garnichts.

Vielen Dank.

Meinst du die, die in der Config aktiviert werden kann?

ja genau die meine ich :wink:

Sollten wir von der gleichen reden, dann geht es bei der nur darum was passiert wenn ein Spieler auf normalem Weg seinen Character löscht. Dabei gibt es einmal die Möglichkeit, dass sollte ein Character gelöscht werden, dieser direkt aus der Datenbank verschwindet und zum anderen die Möglichkeit das dieser in der Datenbank verbleibt und erst nach x eingestellten Tagen tatsächlich gelöscht wird.

Das hat nichts mit einer Bereinigung zu tun. Das dient aus meiner Sicht nur dazu einen gelöschten Char wieder herzustellen.

Okay nun habe ich es endlich verstanden.

Vielen Dank Micha.

Man kann über ein externes Script, in meinem Fall php über die Webseite, per SOAP und dem entsprechenden GM Befehle recht simpel alte Accounts löschen.

Also z.B. mit php in der Datenbank die alten Accounts rausfiltern und dann mit einem Loop per SOAP die Accounts löschen.

Aber die gleiche Aufräumaktion innerhalb der Core wäre natürlich auch nicht zu verachten. ^^

Auf keinen Fall sollte man direkt per SQL versuchen zu löschen. Das kommt fast zu 100% schlecht :wink:

Natürlich kann man auch über ein externes Script die Daten löschen wenn man ein komplettes Script hat ist das kein Problem im Grunde macht der Core auch nichts anders als die SQL Quers zum löschen abzuarbeiten.

Also so, wie ich das oben gepostete Script verstehe, ist es schon das was er sucht. Denn wenn man sich das Script mal anguckt, löscht er alle Accounts, die seit Zeitpunkt X nicht mehr eingeloggt waren und anschließend setzt er ja in der Charactertabelle das Löschdatum, von den Charactere, zu dem kein Account mehr besteht. Somit sollten dann doch beim nächsten hochfahren der Core, an der stelle, wo er sonst auch alle gelöschten Character (älter als 30 Tage nach dem Löschdatum) aus der Datenbank schmeißt, dann auch diese Character sauber und restlos löschen.

Oder habe ich da einen Gedankenfehler?

Vielleicht funktioniert das, vielleicht aber auch nicht so richtig. Das Problem ist, dass du theoretisch nie so genau weisst, was die Core genau macht, z.B. mit verknüpften Tabellen.

Ich mach mal ein Beispiel:

Du kannst ja im RBAC System auch einzelnen Accounts besondere Rechte zuweisen. Wenn man nun wie oben nur den Account aus der account Tabelle löscht, bleiben ja die Rechte trotzdem erhalten. Du weisst nun nicht, was passiert:

a ) Die Core ist schlau und löscht die anderen Daten von alleine

b ) Die Daten bleiben erhalten als Dateileiche

c ) Am Schlimmsten, aus irgendeinem Grund wird ein neuer Account mit der alten ID erstellt (z.B. eben wieder durch direktes INSERT) und der neue Account erhält vielleicht die alten GM oder Admin Rechte des alten Accounts.

Mit SOAP hat du eine definierte Schnittstelle und du kann es der Core überlassen, das alles richtig zu handhaben.

(PS: Bin jetzt irgendwie davon ausgegangen, das man sowas von einer Webseite aus per php oder so machen möchte. Wenn man wirklich nur ein reines SQL Script haben will, muss man halt schauen wie es die Core macht. Prinzipiell geht es natürlich schon.)

Mit Soap würde dann ja auch lediglich nur die Trinity Löschfunktion angestoßen. Wenn ich nun in der Config einstelle, das bei meinen Charcteren nur die Verlinkung gelöscht werden sollen, und die Daten dann noch 30 Tage für Wiederherstellungszwecke beibehalten, macht die Core ja nichts anderes, als die ID und den Characternamen in die Felder deleteInfos_Account und DeleteInfos_Name zu verschieben. Zusätzlich wird noch das Löschdaum ins Feld DeleteDate geschrieben. Die ganzen Querverweise in den anderen Tabellen bleiben dabei ja auch erhalten. Erst wenn die 30 Tage um sind und die Core startet neu durch, werden dann die Einträge aus der Characterdatenbank gelöscht und sinnigerweise auch die Querverweise in den anderen Tabellen. Und nichts anderes macht ja im Grunde genommen das obige Script. Es setzt das DeleteDate und stößt somit die Löschroutine der Core an. Sollten dann noch Datenreste erhalten bleiben, dann wäre die Löschfunktion der Core nicht sauber und dann dürfte auch ein php-Script mit Soap nicht weiterhelfen. Es sei denn, der Delete Befehl von Soap würde eine andere Routine ausführen, als der Ingamebefehl. Was mich aber doch sehr wundern würde.

Ich hab nie gesagt, dass die paar SQL Zeilen auf keinen Fall funktionieren würden. (Ich hab das ja früher auch so ähnlich gemacht ^^)

Aber der Trinity Löschbefehl ist sozusagen der offizielle Weg einen Account zu löschen. Die Trinity Entwickler würden diesen Befehl auch bei veränderten Datenbanken und Tabellen anpassen. Er funktioniert also immer, auch bei Tabellen und Feldnamenänderungen oder Zusätzen. Das ist sozusagen eine API zur Core.

DELETE FROM auth.account WHERE last_login < @date;
Wie schaut es dann z.B. mit den Accounteinträgen in account_access, account_banned, rbac_account_permissions aus. Löscht die Core dort die Accountdaten automatisch, wenn du den User in account löschst ? Kannst du dich darauf verlassen und was ist, wenn morgen einen neue Tabelle dazu kommt ?

genau so sollte es sein.

meiner Meinung nach auch die beste Lösung!