Posts by meute

    Von 21 GB nach 4,3 GB verkleinern der samples-Tabelle, das kann man erfolgreich nennen.

    Da hat sich ein intensiveres Beschäftigen mit der MariaDB schon gelohnt.

    Wie viele Rows waren vorher und sind jetzt noch in der samples-Tabelle drin?

    Tabelle samples (4,3 GB) enthält jetzt 32.097.395 Datensätze.

    Wie viele es vorher waren, keine Ahnung. Habe ich leider nicht notiert.


    SolarEngel

    Es wäre gut, wenn Du Deinen SQL-Code in ein Code-Fenster einfügen könntest.

    Dann kann man den SQL-Code besser lesen.

    Ich habe mich heute drüber gemacht, die Tabelle samples zu verkleinern.

    Ich bin so vorgegangen, wie hier schon mal erwähnt:

    - p4d-backup.sh ausgeführt

    - Tabelle samples gelöscht

    - Tabelle samples neu erstellt

    - samples-Backup importiert


    Die Datenbankdatei samples.ibd ist jetzt nur noch 4,3 GB groß, vorher waren es 21 GB.


    Zur Sicherheit habe ich natürlich zusätzliche Vorarbeit geleistet.

    Man weiß ja nie, ob was schief geht.

    - Snapshot-Sicherung des Proxmox p4d LXC-Container

    - Datenbank beendet und alle p4 Datenbank-Files gesichert


    Hier nochmal die Zusammenfassung der eigentlichen Tabellen-Neuerstellungs-Aktion:




    ich würde die Methode OPTIMIZE TABLE samples; bevorzugen. Vorher natürlich den p4d-Dienst beenden und die Daten sichern.

    MariaDB verkleinern optimieren defragmentieren

    Info habe ich mir angeschaut.


    Folgende Problematik sehe ich da.

    Quote

    OPTIMIZE TABLE samples;

    Dieser Befehl reorganisiert den physischen Speicher der Tabelle und ihrer Indizes.

    Bei InnoDB-Tabellen wird im Hintergrund eine neue, kompakte Datei erstellt und die alte danach gelöscht.

    Dann muss ich vor OPTIMIZE TABLE samples; die Partition noch größer machen.

    Genau das wollte ich vermeiden.

    Ich wollte ja erreichen, nach der Aktion mehr freien Plattenplatz zu haben ohne die Partiton zu vergrößern.


    Was spricht gegen Tabelle löschen, Tabelle neu erstellen und Restore des Backups?

    Hallo,


    Aggregate läuft nun wie es soll.

    Es werden täglich alle Daten älter als 365 Tage aggregiert.


    Dadurch sind nun die Daten in der Tabelle samples massiv geschrumpft.

    Die Tabelle samples enthält nur noch 13 GB Daten.

    Die Datenbankdatei samples.ibd ist aber 21 GB groß.


    Deshalb wollte ich die Datenbankdatei samples.ibd verkleinern.

    Hat das schon mal jemand gemacht und kann dazu was sagen?


    Ich vermute, das geht vermutlich am Besten so:

    - Tabelle samples löschen

    - Tabelle samples neu erstellen

    - Backup samples importieren


    Hier habe ich mal notiert, wie ich es machen würde.

    Kann da bitte mal jemand drüberschauen, ob das so passen kann oder ob ich was vergessen habe.


    Code
    #
    # Linux
    #
    
    # Dienst p4d – stoppen
    sudo systemctl stop p4d.service
    
    # Anmelden an Datenbank p4
    mysql -u p4 -pp4 p4



    Perfekt! :thumbup:


    OffGridICF

    Bist Du Amerikaner oder ausgewandert?

    Du darfst hier auch duzen und musst nicht siezen, falls Dir der Unterschied bekannt ist.

    Hallo,


    ich wollte mit DBeaver remote auf die p4-Datenbank zugreifen.

    Das funktioniert leider nicht.


    Fehler bei Test Connection:

    Code
    Socket fail to connect to 192.168.23.85. Connection refused: getsockopt
    Connection refused: getsockopt


    Fehler bei Anmeldung:

    Code
    Communications link failure
    
    
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    Connect timed out


    Welche Einstellung ist noch notwendig für einen Remote-Zugriff auf die p4-Datenbank?


    Folgendes hab ich bisher gemacht:


    In der MariaDB einen zweiten Benutzer angelegt:

    Code
    CREATE USER 'p4dremote'@'%' IDENTIFIED BY 'Pa55w0rd';
    GRANT ALL PRIVILEGES ON p4.* TO 'p4dremote'@'%' IDENTIFIED BY 'Pa55w0rd';
    flush privileges;
    exit


    In DBeaver eine neue Verbindung erstellt:

    Server: 192.168.23.85

    Port: 3306

    Database: p4

    User: p4dremote


    Am p4d-Server sind folgende Ports offen:

    meute,


    ich finde es echt super, wie du dich in eine (vermutlich) vorher unbekannte Thematik reinwühlst! 8)

    Danke, aber so ganz unbekannt ist mir SQL nicht. ;)


    Übrigens hat Jürgen SolarEngel in seiner sehr gut gemachten Erläuterung ebenfalls auf den 15-Minuten-Offset verzichtet. Andernfalls wären in seiner selektierten Teilmenge ebenfalls die ersten 15 Minuten nicht aggregiert worden. :thumbup:


    Wäre es mein Projekt, dann würde ich das SQL-Script entsprechend abändern (und dadurch vereinfachen), auch wenn das "Problem" normalerweise nur bei den allerersten Daten in der Tabelle samples auftritt (oder eben in selektierten Teilmengen).

    Solange sich horchi nicht dazu äußert, warum er die 15 Minuten eingebaut hat, können wir nur mutmaßen.


    Ansonsten könnte man auch einen Pull request stellen:

    linux-p4d/scripts/aggregate-samples-manual.sh at master · horchi/linux-p4d
    Deamon which fetch sensor data of the 'Lambdatronic s3200' and store to a MySQL database - horchi/linux-p4d
    github.com

    Und noch ein (etwas kleinlicher) Hinweis:

    Dein erster manueller Versuch der Aggregierung für "2020-09-09 12:00:00 bis 18:00:00" hat zwar (teilweise) "A"-Sätze erzeugt, diese waren aber nicht aggregiert, sondern nur dupliziert. Das betrifft zwar nur 6 Stunden, aber ich hätte diese Daten ebenfalls (korrekt) zusammengefasst haben wollen (vielleicht hast du ja auch schon darüber nachgedacht)?

    Doch, auch diese Zeiten passen jetzt. ;)

    Das war ja der erste Versuch.

    Und zu dem Zeitpunkt wurde noch auf Sekunden und nicht auf Minuten aggregiert.

    Da kannte ich den Faktor 60 (Sekunden zu Minuten umrechnen) noch nicht.

    Die Daten habe ich wieder gelöscht. :S


    Aber gut aufgepasst. ^^


    Für mich ist es eh' unlogisch, das "Aggregate Intervall" per Parameter einstellen zu können, der dazu passenden Offset jedoch fest hinterlegt ist (+ INTERVAL 15 MINUTE). Bei anderen Einstellungen als 15 Minuten bzw. 900 Sekunden, führt das zu unschönen Nebeneffekten.


    Warum dieser Offset von 15 Minuten überhaupt eingeführt wurde ist mir auch unklar.


    Das habe ich auch noch nicht verstanden, warum der Offset 15 Minuten ist und für was er gebraucht wird.

    Ja, OK, so funktioniert es natürlich auch.

    Aber der Intervall wird ja in Minuten und nicht Sekunden angegeben. Zumindest in der GUI ist das so.


    Ich habe im Skript /usr/local/bin/aggregate-samples-manual.sh nichts angepasst.

    Ich habe das SQL-Statement manuell ausgeführt.

    Danke erst Mal für Eure Unterstützung und Denkanstöße.


    Ich habe jetzt folgendes gemacht.

    Das erste halbe Jahr time < "2021-01-01" habe ich manuell mit meiner angepassten Syntax bearbeitet.

    Das hat funktioniert.


    Dann hat aber über Nacht p4d automatisch begonnen, alle Daten von 2021-01-01 bis Mai 2025 (Mai 2026 minus 365 Tage) mit Aggregate zu bearbeiten.

    Damit lief aber meine Partition voll und Aggregate ist abgebrochen.

    Das MYSQL-Datenbankfile samples.ibd ist sehr groß geworden.


    Danach habe ich die neuen Aggregate-Werte alle wieder gelöscht.

    Code
    delete from samples
    where aggregate = 'A'
      and time >= "2021-01-01";

    Dann die Partition um 2 GB vergrößert

    Dann den Parameter "Historie [Tage]" = 1500 gesetzt.


    Am nächsten Tag waren alle alten Werte bis Anfang 2022 als Aggregate-Werte vorhanden.

    Das hat also schon mal funktioniert.


    Jetzt ist der Parameter "Historie [Tage]" = 1200 gesetzt.

    Mal sehen, was heute Nacht passiert.

    Es müssten morgen Aggregate-Werte bis Ende 2022/Anfang 2023 vorhanden sein.

    In meinem Aggregationsskript (/usr/local/bin/aggregate-samples-manual.sh) ist der Wert 15 nicht fest einprogrammiert (hard-coded); es handelt sich um eine Variable, die an das Skript übergeben wird.


    Bei mir steht im Skript /usr/local/bin/aggregate-samples-manual.sh natürlich auch die Variable ${INT} drin.

    Aber wie oben geschrieben, erfolgt damit Aggregate auf 15 Sekunden und nicht 15 Minuten.

    Es fehlt der Faktor 60



    Kann ich nicht, weil meine Daten noch nicht älter als 365 Tage sind.

    OK, schade.

    Vll. meldet sich ja noch jemand anderes.

    Ich würde es gerne verifizieren, bevor ich das von mir auf 15 Minuten Aggregate angepasste Skript /usr/local/bin/aggregate-samples-manual.sh loslaufen lasse.


    Mein p4d läuft jetzt 6 Jahre und ich habe festgestellt, dass noch kein einziger Datensatz mit Aggregate bearbeitet wurde.

    pellet-heizer


    Kannst Du mir mal bitte ein paar ältere Daten zeigen, bei denen Aggregate bereits lief.

    Gerne von der Außentemperatur.

    Hier das SQL-Statement dazu, Datum ggf. anpassen:

    Code
    select * from samples
    where address = 4 and type = "VA"
      and time > "2024-10-09 12:00:00"
      and time < "2024-10-09 18:00:00"
    order by time asc;


    Ich habe vermutlich den Fehler im Skript /usr/local/bin/aggregate-samples-manual.sh gefunden.

    Das Skript fasst die Datensätze alle 15 Sekunden zusammen und nicht alle 15 Minuten.

    Es fehlt die Umrechnung von Sekunden auf Minuten (x 60).


    SELECT-Syntax aus dem Skript (Mit Fehler, weil Aggregate 15 Sekunden):

    Code
    select address, type, 'A' as aggregate,
      CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 15) * 15)) + INTERVAL 15 MINUTE time,
      unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp,
      round(sum(value)/count(*), 2) as value, text, count(*) samples
    from samples
    where aggregate != 'A'
      and time > "2020-10-09 12:00:00"
      and time < "2020-10-09 18:00:00"
      and address = 4 and type = "VA"
    group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 15) * 15)) + INTERVAL 15 MINUTE, address, type;


    SELECT-Syntax angepasst auf Aggregate 15 Minuten:

    Code
    select address, type, 'A' as aggregate,
      CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV (15 * 60)) * (15 * 60))) + INTERVAL 15 MINUTE time,
      unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp,
      round(sum(value)/count(*), 2) as value, text, count(*) samples
    from samples
    where aggregate != 'A'
      and time > "2020-10-09 12:00:00"
      and time < "2020-10-09 18:00:00"
      and address = 4 and type = "VA"
    group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV (15 * 60)) * (15 * 60))) + INTERVAL 15 MINUTE, address, type;

    Es gibt aber unter "/usr/local/bin" auch ein Skript "aggregate-samples-manual.sh", welches die gleiche Funktionalität beinhaltet. Das könntest Du nutzen.

    Ich habe mir das Skript /usr/local/bin/aggregate-samples-manual.sh angeschaut.


    Die SQL-Statements darin habe ich erst mal direkt in der Datenbank ausgeführt.

    Und auch nur für Daten älter als 01.01.2021. p4d läuft bei mir seit ca. Juli 2020.

    Also hätte es ca. 6 Monate betroffen.

    Aber es kam ein Fehler, weil die Partition zu klein war und die MariaDB keinen Platz hatte, um tmp-Daten zu erstellen.

    Also wurde die Partition vergrößert, jetzt sind 6 GB frei.


    Nun habe ich den Zeitbereich erst mal verkleinert auf 6 Stunden von 09.09.2020 12:00 Uhr bis 09.09.2020 18:00 Uhr

    time > "2020-09-09 12:00:00"

    time < "2020-09-09 18:00:00"


    Hier vorab mein Fazit:

    Die Aggregate-Funktion in der Datei /usr/local/bin/aggregate-samples-manual.sh scheint nicht zu funktionieren.



    Ausführliche Beschreibung ab hier.

    Das Ergebnis aller SQL-Statements ist zusätzlich in der separaten Datei "p4d_Aggregate_samples_Ergebnis.sql" zu sehen.


    Es wurden folgende SQL-Statement ausgeführt.


    1. SQL-Statement

    Vor Aggregate ermitteln, wie viele Datensätze der Außentemperatur für den Zeitraum vorhanden sind.

    Ergebnis sind 240 Datensätze Außentemperatur.

    Code
    select * from samples
    where address = 4 and type = "VA"
    and time > "2020-09-09 12:00:00"
    and time < "2020-09-09 18:00:00"
    order by time asc;
    
    
    240 rows in set (0,005 sec)


    2. SQL-Statement

    Datensätze für Aggregate ermitteln und mit aggregate='A' markieren.


    3. SQL-Statement

    Nach dem Markieren der Datensätze für Aggregate ermitteln, wie viele Datensätze der Außentemperatur für den Zeitraum vorhanden sind.

    Ergebnis sind plötzlich 470 Datensätze Außentemperatur.

    Code
    select * from samples
    where address = 4 and type = "VA"
    and time > "2020-09-09 12:00:00"
    and time < "2020-09-09 18:00:00"
    order by time asc;
    
    
    470 rows in set (0,005 sec)


    4. SQL-Statement

    Datensätze löschen, die nicht für Aggregate benötigt werden.

    Bedingung: aggregate != 'A'

    Code
    delete from samples
    where aggregate != 'A'
    and time > "2020-09-09 12:00:00"
    and time < "2020-09-09 18:00:00";
    
    
    Query OK, 11040 rows affected (0,568 sec)


    5. SQL-Statement

    Nach Aggregate ermitteln, wie viele Datensätze der Außentemperatur für den Zeitraum vorhanden sind.

    Ergebnis sind 230 Datensätze Außentemperatur.

    Es wurden also nur 10 Datensätze innerhalb von 6 Stunden gelöscht.

    Das ist sicher viel zu wenig.

    Code
    select * from samples
    where address = 4 and type = "VA"
    and time > "2020-09-09 12:00:00"
    and time < "2020-09-09 18:00:00"
    order by time asc;
    
    
    230 rows in set (0,002 sec)
    Der "Aggregate Intervall" funktioniert bei mir nicht.

    Ich weiß natürlich nicht, wie Aggregate umgesetzt wurde.

    Es gibt in MariaDB "Aggregate Functions".

    Aber das ist mir im Moment zu hoch.


    Man kann sich vorhandene "Functions" anzeigen lassen.

    Da scheint aber keine "Aggregate Function" dabei zu sein.

    MariaDB [mysql]> SHOW FUNCTION STATUS\G


    Mal sehen, ob mir hier jemand weiterhelfen kann. :/

    Kannst ja mal Deine Werte anschauen und prüfen, ob ältere Werte tatsächlich nur noch im "Aggregate Intervall" vorliegen. Ich finde die Größe Deiner Datenbank ziemlich hoch.

    Danke für den Tipp.

    Und ja, Du hast Recht. Der "Aggregate Intervall" funktioniert bei mir nicht.


    Wie kann ich das lösen bzw. das Zusammenfassen der alten Daten neu starten?


    Hier mal zwei Beispiele der Außentemperatur aus Januar 2025 und Januar 2024.