Geloggte Daten per Skript löschen?

Hallo Leute,

ich habe hier im Forum einiges zu Datenbankauswertungen gefunden, aber leider nichts zum Löschen von Daten per Skript.

Ist es möglich, die Datenbank per Skript in regelmäßigen Abständen von „Altdaten“ zu befreien, so wie man es im Archive Handler manuell machen kann?

Joachim

Hallo,

ich habe dazu folgendes Skript geschrieben und lasse es einmal am Tag triggern.

<?
    /*****
    *
    * Archive Handler Cleanen
    *
    * Dieses Skript hält die Datenbank sauber. Hier werden die Daten in der Datenbank auf
     * den jeweiligen Tageszeitraum beschänkt. Sodass die Datenbank nicht zugemüllt wird mit Daten die
     * eh nicht lange geloggt werden sollen.
     * Es wird bis zu einem Jahr zurückgegangen zum löschen!
     *
     *
     *
     *       Bitte diesem Skript ein Ereignis zuweisen. 1 mal am Tag!
    *****/
    
// ID des Archivhandlers eingeben
$archiveID = 55837 /*[Archive Handler]*/;



// Hier die IDs eintragen die nur bis zu 2 Tage geloggt werden sollen!
$zweitage = array(
28379 /*[Info\Datenerfassung\Stromzähler Digital\Current]*/,
43606);

    // Hier die IDs eintragen die nur bis zu 7 Tage geloggt werden sollen!
    $siebentage = array(
    12285 /*[Info\Datenerfassung\Stromzähler Digital\Verbrauch von Gestern]*/,
    33460,
    43606 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Holzofen\Temperatur]*/,
    14500,
    57778 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Pufferspeicher - unten\Temperatur]*/);

        // Hier die IDs eintragen die nur bis zu 30 Tage geloggt werden sollen!
        $dreinulltage = array(
        19069 /*[Aussenbereich\Aussentemperatur\Temperatur]*/,
        38455,
        43480 /*[Keller / Dachgeschoss\Heizungsraum\Temperaturen\Heizungsvorlauf\Temperatur]*/);




                                /***********************************
                              *                                  *
                                * Ab hier nichts mehr ändern.      *
                                *                                  *
                             ************************************/


foreach($zweitage as $item){
    $objectID = ($item);
    //echo $objectID. "
";

            // Zeitraum eintragen die noch in Database erhalten bleiben sollen!
            $starttime = time()-(2*24*60*60);

            // Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
            $starttime_del = time()-(365*24*60*60);
            // Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
            $endtime_del = $starttime;
            AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}


foreach($siebentage as $item){
    $objectID = ($item);
    //echo $objectID. "
";

            // Zeitraum eintragen die noch in Database erhalten bleiben sollen!
            $starttime = time()-(7*24*60*60);

            // Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
            $starttime_del = time()-(365*24*60*60);
            // Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
            $endtime_del = $starttime;
            AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}

foreach($dreinulltage as $item){
    $objectID = ($item);
    //echo $objectID. "
";

            // Zeitraum eintragen die noch in Database erhalten bleiben sollen!
            $starttime = time()-(30*24*60*60);

            // Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
            $starttime_del = time()-(365*24*60*60);
            // Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
            $endtime_del = $starttime;
            AC_DeleteVariableData($archiveID, $objectID, $starttime_del, $endtime_del);
}



?>

Die ID 43606 haste bei 2 und bei 7 Tagen drin :wink:

Hallo Hollowmen,

vielen Dank für den „Früheinsatz“!:wink:
Das sieht schon sehr nach dem aus, was ich gesucht habe, von daher werde ich es heute abend mal versuchen bei mir zu integrieren…

Eine Frage noch dazu: Als ich gestern diverse Daten „manuell“ über den Archiv Handler gelöscht habe, konnte ich nicht erkennen, dass die logging.db kleiner geworden ist (mag mich täuschen…). Bei Access gibt es dazu eine Funktion, die Datenbanken nach dem Löschen von Datenmengen wieder „komprimiert“ (aber extra ausgeführt werden muss unter Extras|Datenbank-Dienstprogramme|Datenbank komprimieren und reparieren…).

Ist so etwas hier bei der SQLite-Datenbank auch sinnvoll bzw. erforderlich und möglich?

Joachim

Hallo Leute,

die Möglichkeit zum komprimieren gibt es wohl auch bei SQLite-Datenbanken (SQLite Query Language: VACUUM).

Kann mir jemand erklären, wie ich diese Funktion von IPS aus aktivieren bzw. nutzen könnte?

Joachim

Hallo,

Danke @muckel für die Information. Hab ich wohl beim Wechsel vergessen eine zu löschen.

@JPaeper
Zur Datenbankkomprimierung kann ich nix sagen, weil ich das noch nie angewandt hatte.

Hallo Leute,

Dank des Beispiels von Hollowman habe ich mir jetzt folgendes Skript „zusammengestrickt“:

<?
/*****
*
* Archive Handler Cleanen
*
* Dieses Skript hält die Datenbank sauber. Hier werden die Daten in der Datenbank auf
* den jeweiligen Tageszeitraum beschänkt. Sodass die Datenbank nicht zugemüllt wird mit Daten die
* eh nicht lange geloggt werden sollen.
* Es wird bis zu einem Jahr zurückgegangen zum löschen!
*
*
*
*       Bitte diesem Skript ein Ereignis zuweisen. 1 mal am Tag!
*****/

// ID des Archivhandlers eingeben
$archiveID = 58740 /*[Archive Handler]*/ ;

// $GV=GeloggteVariable; [x][0] = ID der geloggten Variable; [x][1]= Dauer verbleibenden Daten in Tagen
$GV[0][0]= 44864 /*[Sonstige Daten\Heizung\Zirkulation Vorlauf\Temperatur]*/ ; $GV[0][1]= 7;
$GV[1][0]= 53002 /*[Sonstige Daten\Heizung\Zirkulation Rücklauf\Temperatur]*/ ; $GV[1][1]= 7;
$GV[2][0]= 33934 /*[Sonstige Daten\Heizung\Wärme Vorlauf\Temperatur]*/ ; $GV[2][1]= 7;
$GV[3][0]= 25888 /*[Sonstige Daten\Heizung\Warmwasserspeicher\Temperatur]*/ ; $GV[3][1]= 7;
// usw...



If (GetValueBoolean(10900 /*[Sonstige Daten\Einstellungen\Datenbank-Bereinigung\Automatische Datenbank-Bereinigung]*/ ) == true)
{
	for ($i = 0; $i < count($GV); $i++)
	{
   	// Zeitraum ab dem gelöscht wird! Von heute bis zum 1 Jahr zurück an wird gelöscht.
   	$starttime_del = time()-(365*24*60*60);

		// Gespeicherte Werte, die älter sind als zur Bewertung relevant (bis 21 Tage zurück) aus DB löschen
   	$endtime_del = time()-($GV[$i][1]*24*60*60);

AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
		$Datum = GetValueString(23632 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelles Datum]*/ );
		$Uhrzeit = GetValueString(37001 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelle Uhrzeit]*/ );
		SetValueString(20744 /*[Sonstige Daten\Einstellungen\Datenbank-Bereinigung\Letzte Datenbank-Bereinigung]*/  , $Datum." ".$Uhrzeit);
	}
}

?>

Vielen Dank!

Leider verändert sich aber die Größe der logging.db nicht. Wenn da also noch jemand einen Tipp hätte…:wink:

Joachim

Hallo,

vielen Dank für Euer Script. Funktioniert super. Habe noch eine geänderte Version (s.u.).

Die Datenbankverkleinerung mache ich mit dem SQLite Administrator (Menü Datenbank => Säubern) (SQLite Administrator - International Milestone Beta). Dazu muss allerdings der IPS-Dienst gestoppt werden.

Meine abgewandelte Version bereinigt ALLE geloggten Daten automatisch mit einem Alterswert. Hatte keine Lust alle einzutippen ;). Spezielle Aufbewahrungsdauer können für die Variablen eingetragen werden.

// ID des Archivhandlers eingeben
$archiveID = 44065 /*[Archive Handler]*/ ;

// alle geloggten Variablen
$var = AC_GetAggregationVariables($archiveID,True);
$z=0;
foreach($var as $key)
{
	 $GV[$z][0] = $key['VariableID'];
	 
	 //Standard verbleibende Tage (dieser Wert ist für alle Variablen gültig)
	 $GV[$z][1] = 365; 
	 
	 //abweichende Daten
	 If ($GV[$z][0] == 20790 /*[Zentral\Server\PC Daten\CPU_0]*/) {$GV[$z][1] = 60;}
	 If ($GV[$z][0] == 36571 /*[Zentral\Server\PC Daten\HDD0]*/) {$GV[$z][1] = 90;}
	 
	 $z=$z+1;
}

// geloggte Daten werden bereinigt
 for ($i = 0; $i < count($GV); $i++)
 {
    // Zeitraum ab dem gelöscht wird! Von heute bis zu 400 Tage zurück an wird gelöscht.
    $starttime_del = time()-(400*24*60*60);

     // Gespeicherte Werte, die älter als vorgebener Wert aus DB löschen
    $endtime_del = time()-($GV[$i][1]*24*60*60);
    
    // Löschvorgang
    AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
 }

Viele Grüße
Thorsten

Hallo Thorsten,

komprimiert Dein Tool auch die Datenbank nach dem Löschen oder sind „nur“ die Daten verschwunden? (siehe auch meine Fragestellung etwas weiter oben)

Joachim

Hallo Joachim,

die Daten werden vom Script gelöscht (kleine Abwandlung Deiner Version) und sind damit verschwunden.

Mit dem SQLite Administrator kannst Du die Dateigröße der Datenbank logging.db verkleinern, vorausgesetzt es wurden auch Daten gelöscht. Also: Erst löschen, dann komprimieren.

Gruß
Thorsten

Hallo Thorsten,

das Tool hatte ich bereits auf der Festplatte, die Funktion habe ich habe noch nicht gekannt und daher nicht genutzt. Vielen Dank für den Tipp!:slight_smile:

Vor Anwendung bzw. Komprimierung hatte die logging.db 451MB nun sind es (fast unglaubliche) 58MB!:cool:

Joachim

Hallo Leute,

damit man die DB-Größe im Auge behält habe ich mir dieses Skript „zusammengebastelt“:

<?

// Datei auswählen deren Grösse festgestellt werden soll
$filename = IPS_GetKernelDir()."db\logging.db";

// Grösse herausfinden und formatieren
$groesse = number_format(filesize($filename)/ pow(1024, 2), 2, ',', '.').' MB';

// Ergebnis ausgeben
SetValueString(10446  /*[Sonstige Daten\Server\IPS-Server\logging.db-Größe]*/, $groesse);

?>

(Ich hoffe die Umrechnung ist korrekt!)

Joachim

Hallo Thorsten,

probiere dein Script gerade, erhalte aber leider folgende Fehlermeldung:

[u]
Warning: Wrong parameter count for ac_getaggregationvariables() in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 7

Warning: Invalid argument supplied for foreach() in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 9

Notice: Undefined variable: GV in C:\Programme\IP-Symcon_2_0\scripts\15338.ips.php on line 24[/u]

Mein Script sieht so aus:

// ID des Archivhandlers eingeben
$archiveID = 13953 /*[Archive Handler]*/;

// alle geloggten Variablen
$var = AC_GetAggregationVariables($archiveID);
$z=0;
foreach($var as $key)
{
     $GV[$z][0] = $key['VariableID'];

     //Standard verbleibende Tage (dieser Wert ist für alle Variablen gültig)
     $GV[$z][1] = 1825;

     //abweichende Daten
     If ($GV[$z][0] == 16135 /*[System\Server Infos\CPU Last]*/) {$GV[$z][1] = 160;}
 //    If ($GV[$z][0] == 36571 /*[Objekt #36571 existiert nicht]*/) {$GV[$z][1] = 190;}

     $z=$z+1;
}

// geloggte Daten werden bereinigt
 for ($i = 0; $i < count($GV); $i++)
 {
    // Zeitraum ab dem gelöscht wird! Von heute bis zu 400 Tage zurück an wird gelöscht.
    $starttime_del = time()-(400*24*60*60);

     // Gespeicherte Werte, die älter als vorgebener Wert aus DB löschen
    $endtime_del = time()-($GV[$i][1]*24*60*60);

    // Löschvorgang
    AC_DeleteVariableData($archiveID, $GV[$i][0], $starttime_del, $endtime_del);
 }
 

Hast Du, oder jemand anderes eine Idee woran es liegen könnte?

Könnte da mal jemand was dazu sagen?

Ich würde aufgrund der erschreckenden Größe meiner logging.db diese auch gerne individuell kürzen aber stoße auf gleiche Probleme.
Leider finde ich auch in der Doku keinen Ansatz.

Danke

Habe gerade selber die Fehlermeldung entdeckt. Die Funktion AC_GetAggregationVariables hat wohl irgendwann einen zusätzlichen Parameter erhalten. Kenne zwar die Bedeutung von „QueryDatabase:Boolean“ noch nicht (in der Doku auch noch nichts gefunden), aber mit folgendem Befehl funktioniert es wieder:

$var = AC_GetAggregationVariables($archiveID,true);

Viel Erfolg. Vielleicht kennt jemand ja die Bedeutung?

Gruß
Thorsten

hab heute auch damit rumgespielt, ich vermute „true“ bedeutet: zeige alle Vars die Daten beinhalten/ oder das Flag „logging aktiv“ haben … oder so ähnlich

Danke euch. Klasse. Es hätte sich um ein Haar erledigt aber die DB ist echt zäh.

Nachtrag

Wie findet ihr so etwas. Ich habe echt viel gesucht und keinen Hinweis dazu finden können. Hochachtung

Im Script-Editor der Verwaltungskonsole kannst Du mit „STRG und Leertaste“ die Funktionen mit ihren Parametern anzeigen lassen.:wink:

Man lernt immer dazu. Danke für die Nachhilfe. :loveips:

Dann helfe ich auch noch.

Tastenkombinationen: IP-Symcon :: Automatisierungssoftware

Sind auch immer wieder hilfreich.