mikrocontroller.net

Forum: PC-Programmierung rrdtool to mysql


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von linuxnewbi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe über eine andere Anwendungen eine rrd Datenbank.
Mit dem Befehl
rrdtool lastupdate *.rrd 
1574521961: 717

bekomme ich den letzen Wert. Diesen möchte ich nun in eine mysql 
datenbank bekommen. Wie kann ich dies regelmässig machen sobald sich der 
wert ändert?

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Früher haben wir immer 'insert' genommen.
https://en.wikipedia.org/wiki/Insert_(SQL)

von Zeno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Genau so wie man jeden anderen Wert in die MySQL bekommt. Wo ist da das 
Problem?

von Linuxnewbe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das es Automatisch gehen soll also Brauch ich ein Skript

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Di gibt es doch auch etwas von Wikipedia
https://en.wikipedia.org/wiki/Bash_(Unix_shell)

von Christobal M. (c_m_1)


Bewertung
0 lesenswert
nicht lesenswert
Ich gehe mal davon aus, dass sich die RRD nicht von alleine füllt.
Der günstigste Ansatz wäre den SQL insert zum gleichen Zeitpunkt zu 
machen wie den in die RRD - das löst auch das Problem das "die rrd" beim 
insert was triggern soll, was imho nicht geht.

von Zeno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Linuxnewbe schrieb:
> Das es Automatisch gehen soll also Brauch ich ein Skript

Dann schreib Dir eins.

von Zeno (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christobal M. schrieb:
> Der günstigste Ansatz wäre den SQL insert zum gleichen Zeitpunkt zu
> machen wie den in die RRD - das löst auch das Problem das "die rrd" beim
> insert was triggern soll, was imho nicht geht.

Könnte man so machen, aber wenn man wirklich den letzten Eintrag der RRD 
haben will muß man die RRD abfragen, da RRD nicht unbedingt mit dem 
update Befehl die Daten einschreibt. Das Einschreiben passiert nur beim 
"Herzschlag" (+einer maximalen Wartezeit) der RRD-Datenbank.

von cppbert3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@linuxnewbie

Du musst leider viel mehr Details schreiben sonst hilft dir hier niemand

Willst du nur den letzten wert?
Kannst/kennst du mysql?
Kannst/kennst du rrd?
Willst du was programmieren (programmiersprache?) oder suchst du 
Bordmittel?
Automatisch oder von Hand?
Wer schreibt in die rrd und warum muss das in eine mysql?
Zyklisch updaten oder wie?

Deine Frage ist viel zu unklar um richtige tips geben zu koennen

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Ein cron-job im Takt vom Heartbeat der RRD kann das machen.
Evtl. mit einem kleinen Offset.

von Linuxnewbe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich benötige ein bash script welches das erledigt. Also
1.rrd Last updated ausliest
2.den ausgelesen wert in eine MySQL Datenbank einfügt ggf. überprüft ob 
der Wert schon existiert bevor er eingefügt wird

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Linuxnewbe schrieb:
> Ich benötige ein bash script welches das erledigt.

warum bash?
warum nicht perl, tcl oder python oder eine andere Scriptsprache?

Welcher Interpreter benutzt wird steht doch in der ersten Zeile vom 
Script (Shebang)

Und Cron ruft dieses Script ja nur auf

: Bearbeitet durch User
von cppbert3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und was davon kannst du nicht? Oder fragst du nach einer komplettlösung?

Mysql kannst du problemlos per bash aufrufen: google bash mysql
Du brauchst nur die rddtool ausgabe einlesen/parsen und in ein replace 
statement (ist wie "update or insert") umwandel

von cppbert3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Probier doch schon mal aus ob du ein replace-statement mit fixen werten 
ausgefuert bekommst oder bekommst du das auch schon nicht hin

Oder wie dudas rddtool ergebnis parsen kannst

Wie gesagt: wir wissen nicht was du kannst/kennst (schon mal ein bash 
script geschrieben?, mit mysql gearbeitet) und du wirst garantiert keine 
fertige lösung hier als antwort bekommen

Du könntest 5 jahre alt sein und das erste mal am computer sitzen oder 
seit 40 jahren im computerbusiness aber leider ohne shell kentnisse, wir 
wissen absolut nichts

von bashfrickler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Auf die schnelle als Denkanstoß
echo "insert into table (c1,c2) values ($(rrdtool lastupdate *.rrd|tail 
-1|sed 's/:/,/g'));"|mysql -u user -p pw meinedb

Ne DB und entsprechende Tabelle musst Dir schon vorher anlegen

von cppbert3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Besser ein Replace statement, er moechte ja replacen - wobei das auch 
nicht wirklich klar ist

von Linuxnewbe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich benötige ein komplettes Script welche Sprache ist prinzipiell 
egal..... Python und bash wäre von mir bevorzugt.....ich kann keine 
Programmierung deshalb Frage ich.....das Skript soll folgende Schritte 
nacheinander machen:

1.auslesen rrd Lastupdate
2.ist das Werte paar siehe oben vorhanden?
3.wenn ja nichts machen wenn nein in die Datenbank Einfügen
4.ende

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Linuxnewbe schrieb:
> Ich benötige ein komplettes Script

Hat dir bashfrickler zwei Posts weiter oben geliefert.

Wenn dir das in einer Zeile zu kompliziert ist, kannst du das auch auf 
mehrere Zeilen aufdröseln und mit Zwischenvariablen arbeiten.

Linuxnewbe schrieb:
> 2.ist das Werte paar siehe oben vorhanden?
> 3.wenn ja nichts machen wenn nein in die Datenbank Einfügen

Das kann mysql selber. Einfach einen passenden unique-Index anlegen.
Ein zweites Insert desselben Wertepaars (oder keys/timestamps) schlägt 
dann fehl. Die Fehlermeldung einfach ignorieren ==> es werden keine 
Dubletten angelegt.

Linuxnewbe schrieb:
> 4.ende

genau.

von cppbert3 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oder das REPLACE Statement von Mysql

von linuxnewbi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ich habe es nun als crontab versucht einzufügen:

*/30   * * sudo echo "insert into \`tabelle\` (\`time\`,\`value\`) 
values ($(rrdtool lastupdate tabelle.rrd |tail -1|sed 
's/:/,/g'));"|mysql -u user -ppw datenbank >>  /home/user/t.txt

allerdings passiert nichts....was ist falsch???? Ohne crontab 
funktioniert es tdellos danke dafür :)

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
wie wäre es, das Ganze in eine Datei zu schreiben (z.B. rrd2mysql.sh) 
und dann nur noch den Scriptnamen in der Crontab anzugeben.

Mit welchen Rechten läuft das ab?

von linuxnewbi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
die dateirechte sind -rwxr-xr-x 1 user gruppe 238 Nov 24 21:30 
rrd2mysql.sh

crontab zeile ist

*/30   * * sudo /home/user/rrd2mysql.sh >> /home/user/t.txt

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Die Time Spec hat zuwenig Sternchen.
du brauchst `m h dom mon dow`

also
*/30 *  * * *

und ob sudo in der crontab geht, hängt von der sudo-Config ab... Wenn 
das ein Passwort sehen will, wird cron keines eintippen.

Warum brauchst du sudo? gehört deine 'tabelle.rrd' dem user oder root?
Kannst du die nicht einfach für "user" lesbar machen?
echo, tail, sed brauchen kein root.
mysql auch nicht, das logt sich ja mit usernamen&passwort von der 
Kommandozeile beim mysql-server ein.

Dann:
Benutzt du die User-Crontab, oder die systemweite "/etc/crontab" ?
in der /etc/crontab ist nach dem "day of week"-Feld noch eine Spalte für 
den User, der das Kommando ausführen soll.

da könntest du einfach "root" angeben, und das sudo weglassen.

und was noch falsch sein könnte: Wenn du keinen absoluten Pfad zu deiner 
'tabelle.rrd' angegeben hast, sollte dein rrd2mysql.sh ganz am Anfang 
ein

cd /home/user

machen.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht ob bashfrickler das getestet hat, aber bei mir gibt 
rrd /lastupdate/ mehr Informationen raus, nämlich die Namen für die 
Einträge.

rrdtool lastupdate *.rrd
Name

1574521961: 717

von bashfrickler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Naja, das soll ja das tail -1 ausregeln, aber es sollte ja nur ein 
Denkanstoss in einer Schönwetterprogrammierung sein.

von K. J. (theborg0815) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Ist es nen eigenes Programm was die RRD Daten erzeugt oder was 
vorgefertigtes ?

Wenn es was eigenes ist wehre es wesentlich sinnvoller gleich in die DB 
zu schreiben RRD kann das problemlos und die alten Daten kannst du auch 
in die DB übernehmen

von Linuxnewbe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn ihr "bashfrickler" noch helfen könnt zu lösen wenn

Lastupdate

1574521961: 717 564

Ausgibt wie ich das in die mit sed aufteilen kann werde ich mich 
bedanken für die Hilfe hier ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.