NEWS
Frage : Migrate MySQL nach Influxdb
-
Web Admin bei influxdb auf Port 8086 gibt es nicht mehr.
Am Ende ist das ein Service und den musst du als Service starten und nicht Manuell. systemctl enable/start influxdb
Ggf hast du mit dem sudo start rechte kaputt gemacht. Eigentlich läuft das unter User influxdb. Schau mal in /var/lib/influxdb. Und am besten nochmal alles löschen was da drin ist falls irgendwas root gehört.
Gesendet vom Handy …
-
ich bekomme ja nicht mal einen user angelegt:
influx -username iobroker -password xxxxxx
Failed to connect to http://localhost:8086: Get http://localhost:8086/ping: dial tcp [::1]:8086: getsockopt: connection refused
muss ich das "localhost" in der config abändern wegen der VM, denke aber nicht… ich finde unter http auch nichts, nur den PORT
Installiert habe ich eigentlich alles unter dem USER, was nicht ohne sudo ging, halt mit sudo
edit: vielleicht hilft es:
hb@influxDB:~$ systemctl status influxdb
● influxdb.service - InfluxDB is an open-source, distributed, time series database
Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2018-10-11 22:43:28 CEST; 7min ago
Docs: https://docs.influxdata.com/influxdb/
Process: 1793 ExecStart=/usr/bin/influxd -config /etc/influxdb/influxdb.conf $INFLUXD_OPTS (code=exited, status=1/FAILURE)
Main PID: 1793 (code=exited, status=1/FAILURE)
muss der user wirklich influxdb heißen ? ich habe meine initialien benutzt… ggf ein grund
-
Nochmal: Der Port 8086 ist eine HTTP API und keine Webseite! Aber wenn Du gar keine Verbindung bekommst ist es komisch. Läuft denn ein influxd prozess(ps auwxx|grep influx) ?
ANsonsten frage ich mal frech: https://docs.influxdata.com/influxdb/v1 … tallation/ hast Du gelesen und abgearbeitet?
-
Danke nochmal für die Tipps…
hab alles nochmal frisch aufgesetzt und genau nach der offizuellen Anleitung gearbeitet. Muss irgendwo ein tippfehler oder so drin gewesen sein und wenn man dann nach weiteren Anleitungen im Netz sucht, findet man jede Menge alten Müll und macht alles schlimmer.
Nun läuft zumindest influx auch mit neuem User usw.
Nun mach ich mich mal an Grafana... das Telegraf ist nicht notwendig oder ?
-
Telegraf nope
Sent from my iPhone using Tapatalk
-
Hallo Dutchman,
hast du die Daten von MySQL nach Influxdb emigriert bekommen. Wie sieht dein Skript dazu aus?
Viele Grüße
Jens
-
Hi Jens,
Ja aber ohne Script.
SQL Daten exportiert nach Commando seperaten, dabei muss man 2 Tabellen kombinieren um den object Namen zu bekommen.
Dan per CSV Import eingespeist in influxdb per Command line
Sent from my iPhone using Tapatalk
-
Hallo Dutchman,
danke für die schnelle Antwort!
Davon habe ich leider keine Ahnung. Werde dann wohl doch erstmal bei MySQL und Flot bleiben (statt wie angedacht zu influxdb und Grafana zu wechseln).
-
@Dutchman
könntets du vielleicht den export/import etwas genauer erklären ? -
@ehome sagte in Frage : Migrate MySQL nach Influxdb:
@Dutchman
könntets du vielleicht den export/import etwas genauer erklären ?influxdb kan man einen import machen mit CSV, die Schwierigkeit : SQL arbeitet mit Tabellen, InfluxDB mit measurements.
Du musst also aus den SQL Tabellen die werte extrahieren, in measurements separieren, die richtigen Datensätze zusammenbringen (dabei den timestamp umrechnen) und dan importieren in influxdb.
@arteck hattest du nicht etwas dafür oder letztendlich auch gelassen ?
Dutch
-
@Dutchman ne ich habs gelassen... war mir nicht wert die Zeit da zu inverstieren..
-
@Dutchman
ah, ok - jetzt habe ich es verstanden.
Hier mal ein Beispiel für die mysql Abfrage:SELECT (ts_number.ts*1000000) as 'time', ts_number.ack as 'ack', datapoints.name as 'from', ts_number.q as 'q', ts_number.val as 'val' from ts_number left join datapoints on ts_number.id=datapoints.id where datapoints.name="wrapper.0.Temperatur.temp_ab" order by ts_number.ts desc limit 10;
-
Da ich auch vor dem Problem stand, die SQL-Daten in Influxdb zu importieren, möchte ich hier einmal meinen Workarround darstellen (da ich doch einen ganzen Nachmittag rumprobieren musste, bis es endlich geklappt hat).
1. SQL Daten für CSV-Datei-Export abfragen:
SELECT (ts_string.ts*1000000) as 'time', ts_string.ack as 'ack', datapoints.name as 'from', ts_string.q as 'q', ts_string.val as 'value' from ts_string left join datapoints on ts_string.id=datapoints.id where datapoints.name="mqtt.0.Stromzaehler_Gesamt" AND q=0
Danke an @ehome
2. Ergebnis als "Delimted Text" und mit Feldbegrenzer , exportieren (habe ich mit HeidiSQL gemacht, geht sicher auch mit anderen Programmen)
3. Mithilfe von Python bzw. dem Script "csv_to_line.py" die CSV-Datei nach InfluxDB-CommandLine-Vorgabe in eine txt-Datei importieren.
Also python csv_to_line.py
(kann dauern: Ich habe 2 Millionen Einträge gewandelt - hat ca. 10 Minuten gedauert).Hier das Python-Script: csv_to_line.py
(hierfür muss pandas in Python installiert sein!!!). In der Datei muss der "Measurement"-Bezeichner sowie der Name eurer CSV-Datei angepasst werden.
Außerdem habe ich das "ack"-Value fest auf true gesetzt. In der SQL-Datenbank ist das eigentlich 1. Problem ist jedoch, dass Influx diese Spalte dann beim Importieren nicht als Boolean ansieht... der Influx-Adapter in Iobroker dieses Field aber nicht als 1 sondern als True einträgt und man sonst keine weiteren Daten über IoBroker in die Datenbank schreiben kann. Das wäre natürlich ungünstig.4. Unbedingt darauf achten, dass die Textdatei im Unix (LF) - Format ist (ggf. mit bspw. NotePad ändern)
5. In den Kopf der Txt-Datei
# DDL CREATE DATABASE NameDatabase # DML # CONTEXT-DATABASE: NameDatabase
schreiben.
Der obere Teil kann weggelassen werden, falls die Daten in eine vorhandene Datenbank importiert werden sollen.6. In der Console mit dem Befehl
influx -import -path=import.txt
die Import-Datei importieren.
Wenn alles klappt, zeigt er alle 100000 Einträge eine Erfolgsmeldung an.
Ich weiß nicht, ob es auch einfacher geht (da die anderen das hier nur knapp beschrieben haben), aber so geht es in jedem Fall, wenn auch viele Schritte nötig sind.
-
@gender Danke für diese näheren Info's.... Wenn ich deinen Select ausführe über alle Datenpunkte komme ich so auf ca. 800000 Datensätze, davon werden aber nach Aufbereitung nur 400000 importiert... Sollte man das staffeln oder an was kann das liegen? Umlaute o.ä?
2019/12/31 00:29:10 Processed 0 commands 2019/12/31 00:29:10 Processed 425000 inserts 2019/12/31 00:29:10 Failed 428620 inserts ERROR: 428620 points were not inserted
Bei 1000000 Datensätze werden immer nur wie folgt importiert. Gibt es einen Parameter um die Batchsize zu umgehen oder welcher anderer Ansatz würde funktionieren? Telegraf?
2019/12/31 15:26:46 Processed 1000000 lines. Time elapsed: 10.569888124s. Points per second (PPS): 94608 2019/12/31 15:26:46 Processed 0 commands 2019/12/31 15:26:46 Processed 360000 inserts 2019/12/31 15:26:46 Failed 640000 inserts
-
Also ich habe wie beschrieben ca. 2 Millionen Datensätze in einem Rutsch importieren können. Da gab es keine Fehlermeldung... und alle Hunderttausend Datensätze immer eine Konsolenausgabe. Hat ca. 2 1/2 Minuten gedauert.
Ob es an Umlauten liegt, kann ich dir nicht sagen. Ich hatte auf jeden Fall keine in meinen Datensätzen drin.Kriegst du in der Konsole keine Fehlermeldung für einzelne Datensätze? Das war bei mir jedenfalls so, sodass ich genauer gucken konnte, wenn er etwas nicht importiert hat.
-
@gender In der ini von influx bzw. von der Doku dazu hatte ich nur was gelesen das man die Files splitten sollte bei 10000. Vielleicht liegt es auch an der neuen Version 1.7
„If your data file has more than 5,000 points, it may be necessary to split that file into several files in order to write your data in batches to InfluxDB. We recommend writing points in batches of 5,000 to 10,000 points. Smaller batches, and more HTTP requests, will result in sub-optimal performance. By default, the HTTP request times out after five seconds. InfluxDB will still attempt to write the points after that time out but there will be no confirmation that they were successfully written.“
Fehlermeldung ist folgende:
2020/01/01 17:00:44 error writing batch: {"error":"partial write: points beyond retention policy dropped=5000"}
-
Ja, das hatte ich in der Doku auch mal gelesen.... und mich dann einfach gefreut, dass es auch so ging (zumal das Hochladen von Millionen Daten in 10000er-Schritten dann doch ne Zumutung wäre.
Deine Fehlermeldung sagt mir leider nichts und ist mir auch unbekannt (mal abgesehen davon, dass ich auch noch nicht verstanden habe, was es mit dieser retention policy bei influx auf sich hat, die man ja irgendwie optional angeben/einstellen kann, soweit ich das verstanden habe.
Ich habe die Datenbank auf jeden Fall einfach von Iobroker beim erstem Sammeln von Daten erstellen lassen.
-
@gender Influx DB wurde bei mir auch beim ersten Sammeln automatisch erstellt. Kann mir auch nicht vorstellen, das man es einzeln machen muss. Komisch ist ja das er immer bei 360000 aufhört. Ist bestimmt irgendeine neue Grenze. Welche Version nutzt Du bzw. in welcher Version klappte dein Import? Vielleicht kennt jemand noch einen anderen Ansatz z.B Telegraf? Wäre schon Schade, wenn ich die Daten von ca. 2 Jahren verlieren würde (bittl mehr als 8 GB)
-
Ich habe Version 1.7.9, installiert im Docker.
Habe das auch erst vor ein paar Tagen alles installiert bzw. umgestellt auf Influxdb, daher sollte die Version aktuell sein.Ich hatte auf jeden Fall Probleme mit den "ack"-Werten, da die in meinen MariaDB-Tabellen aus 0en oder 1en bestehen und Influx daraus dann einen Zahlenwert und keinen Boolean gemacht hat.
Daher wird oben im Python-Skript einfach alles auf true gesetzt (und die Zeilen mit 0er-Werten hatte ich ausgeschlossen). -
@gender Bei mir auch die neueste nur in einem Container unter Proxmox... Dann verstehe ich das ja gar nicht mehr... Trotzdem danke und vielleicht hat jemand ja noch eine andere Idee bzw. kann mal kurz aufzeigen wie er die Migration großer DB's vorgenommen hat...
Könnte mir ja auch vorstellen ne Batchverarbeitung zu schreiben nur fehlt mir dazu erst der Ansatz/Knowhow... Idee wäre jeden Datenpunkt einzeln in eine Datei zu schreiben (geht sowas mit dem Javascript Adapter getHistory etc.?) und dann einzeln per Bash etc. in Influx einzulesen...