NEWS
Frage : Migrate MySQL nach Influxdb
-
@MezzoDO ok, das ack feld ist bereits als boolen angelegt, kommt nun aber als int.
Ihc könnte es anpassen, dass dies beim import convertiert wird. -
@JackGruber said in Frage : Migrate MySQL nach Influxdb:
@MezzoDO ok, das ack feld ist bereits als boolen angelegt, kommt nun aber als int.
Ihc könnte es anpassen, dass dies beim import convertiert wird.Das wäre grandios
Mein Script, was ich einsetze:### MySQL DB info ### #import MySQLdb import pymysql conn = pymysql.connect(host="localhost", # your host, usually localhost user="xxx", # your username passwd="xxx", # your password db="iobroker") # name of the data base ### PostgreSQL DB info ### import psycopg2 import psycopg2.extras ##### # connection data for PostgreSQL #conn = psycopg2.connect("dbname=xxx user=xxx password=xxx host=xxx.xxx.xxx.xxx port =5432") ##### # InfluxDB info # from influxdb import InfluxDBClient # #####connection data for InfluxDB##### influxClient = InfluxDBClient(host='localhost', port=8086, username='xxx', password='xxx', database='iobroker') ##### #influxClient.delete_database(influx_db_name) #influxClient.create_database(influx_db_name) # dictates how columns will be mapped to key/fields in InfluxDB schema = { "time_column": "time", # the column that will be used as the time stamp in influx "columns_to_fields" : ["ack","q", "from","value"], # columns that will map to fields # "columns_to_tags" : ["",...], # columns that will map to tags "table_name_to_measurement" : "name", # table name that will be mapped to measurement } ''' Generates an collection of influxdb points from the given SQL records ''' def generate_influx_points(records): influx_points = [] for record in records: #tags = {}, fields = {} #for tag_label in schema['columns_to_tags']: # tags[tag_label] = record[tag_label] for field_label in schema['columns_to_fields']: fields[field_label] = record[field_label] influx_points.append({ "measurement": record[schema['table_name_to_measurement']], #"tags": tags, "time": record[schema['time_column']], "fields": fields }) return influx_points # query relational DB for all records #curr = conn.cursor('cursor', cursor_factory=psycopg2.extras.RealDictCursor) curr = conn.cursor(cursor=pymysql.cursors.DictCursor) # curr = conn.cursor(dictionary=True) ##### # SQL query for PostgreSQL, syntax for MySQL differs # query provide desired columns as a view on the sql server # request data from SQL, adjust ...from <view name> curr.execute("Select * from InfluxData;") ##### row_count = 0 # process 1000 records at a time while True: print("Processing row #" + str(row_count + 1)) selected_rows = curr.fetchmany(1000) influxClient.write_points(generate_influx_points(selected_rows)) row_count += 1000 if len(selected_rows) < 1000: break conn.close()
-
Ersetze in deinem Script Zeile 47 mit folgenden zwei zeilen. Auf das einrücken achten!:
if field_label == "ack": record[field_label] = bool(record[field_label])
-
@JackGruber
Ich komme leider auch nicht weiter ...
Habe deinen Script von Github installiert und bekomme folgende Ausgabe:pi@raspberrypi:~/iobroker_mysql_2_influxdb $ python3 migrate.py all Migrate 'all' datapoint(s) ... Total metrics in ts_number: 0 Total metrics in ts_bool: 0 Total metrics in ts_string: 0 Migrated: 0
Das ganze passiert innerhalb einer Sekunde .
Die Influxdb habe ich über den iobroker Adapter angelegt.
-
Hi @simatec, hab einen mini Fehler im Script gefunden. Durch einen BUG musste das
ALL
großgeschrieben werden.
Hab das Script angepasst, einfach neu herunterladen oder dasALL
großschreiben. -
@JackGruber
Danke für den Tipp ... Ich hatte es auch einzeln versucht und dann auch jedes Objekt einzeln importiert.
War zwar etwas Aufwand aber ging super -
Wie und wo kann ich das Script benutzen? In iobroker javascript oder Konsole? iobroker läuft bei mir im Docker Container....
-
@base python auf deinem PC installieren, das script wie auf der git seite beschrieben installieren und benutzen.
-
ich bekomme in diese Zeile einen Syntax Error:
print(f"Processing row {processed_rows + 1:,} to {processed_rows + len(selected_rows):,} from LIMIT {start_row:,} / {start_row + query_max_rows:,} " + table + " - " + metric['name'] + " (" + str(metric_nr) + "/" + str(metric_count) + ")")
er meckert die Anführungsstriche vor table an
-
@base
So war es bei mir auch.
Hast du mal versucht, die Daten einzeln pro Objekt zu importieren? Das half bei mir. -
@simatec habe dein Script von oben ausprobiert, dass holt aber nicht alle Objekte...
was muss ich da ändern?ok, habs gefunden. Muss natürlich die SQL Abfrage anpassen. Jetzt klappts
-
@base was für eine python version nutzt du?
Bei mir läuft das script ohne probleme durch.
-
@JackGruber hab jetzt Version 3.7.9, hatte vorher 3.9, da ging gar nichts.
Den Befehl pip install -r requirements.txt habe ich in der Eingabeaufforderung im entsprechenden Ordner durchgeführt, war das so richtig?
-
@base Ja, genau, dann sollte er alle nötigen module installieren.
Hm, muss ich mir mal mit python 3.9 anschauen ... -
@JackGruber wie gesagt, 3.9 hat gar nicht funktioniert bei mir und bei der 3.7.9 bekomme ich die Fehlermeldung
-
@JackGruber Habe gerade festgestellt, dass die Fehlermeldung nur bei der 64bit Version kommt.
Bei der 32èr gehts.
Leider bekomme ich jetzt noch einen:MySQL connection error
'192.168.1.100' -
@base hm komisch grad mit Python 3.9 64 bit getetet und geht 1a.
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)]
Das ist die ganze Fehlerausgabe?
-
@JackGruber ja
RESTART: C:\Users\Base\Downloads\iobroker_mysql_2_influxdb-master\iobroker_mysql_2_influxdb-master\migrate.py
MySQL connection error
'192.168.1.100' -
@base teste doch mal in einer powershell folgendes:
Test-NetConnection 192.168.1.100 -p 3307
-
@JackGruber Lernen Sie das neue plattformübergreifende PowerShell kennen – https://aka.ms/pscore6 PS C:\Users\Base> Test-NetConnection 192.168.1.100 -p 3307 WARNUNG: TCP connect to (192.168.1.100 : 3307) failed
ComputerName : 192.168.1.100
RemoteAddress : 192.168.1.100
RemotePort : 3307
InterfaceAlias : WiFi
SourceAddress : 192.168.1.72
PingSucceeded : True
PingReplyDetails (RTT) : 6 ms
TcpTestSucceeded : False