NEWS
Frage : Migrate MySQL nach Influxdb
-
@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]) -
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: 0Das ganze passiert innerhalb einer Sekunde .
Die Influxdb habe ich über den iobroker Adapter angelegt.
-
@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: 0Das 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
ALLgroßgeschrieben werden.
Hab das Script angepasst, einfach neu herunterladen oder dasALLgroßschreiben. -
Hi @simatec, hab einen mini Fehler im Script gefunden. Durch einen BUG musste das
ALLgroßgeschrieben werden.
Hab das Script angepasst, einfach neu herunterladen oder dasALLgroß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.
-
@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
-
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. -
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 was für eine python version nutzt du?
Bei mir läuft das script ohne probleme durch.

-
@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?
-
@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 ... -
@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
-
@base Ja, genau, dann sollte er alle nötigen module installieren.
Hm, muss ich mir mal mit python 3.9 anschauen ...@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' -
@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?
-
@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' -
@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 -
@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 -
@base teste doch mal in einer powershell folgendes:
Test-NetConnection 192.168.1.100 -p 3307@JackGruber PS C:\Users\Base> Test-NetConnection 192.168.1.100 -p 3306 ComputerName : 192.168.1.100
RemoteAddress : 192.168.1.100
RemotePort : 3306
InterfaceAlias : WiFi
SourceAddress : 192.168.1.72
TcpTestSucceeded : TruePS C:\Users\Base>
-
@JackGruber PS C:\Users\Base> Test-NetConnection 192.168.1.100 -p 3306 ComputerName : 192.168.1.100
RemoteAddress : 192.168.1.100
RemotePort : 3306
InterfaceAlias : WiFi
SourceAddress : 192.168.1.72
TcpTestSucceeded : TruePS C:\Users\Base>
@base oh stimt, MySQL standard port ist 3306 :)
Hm also der port ist erreichbar, aber das script kann sich ned verbinden ...
Hast du Verschlüsselung für MySQL aktiviert?änder mal folgende Zeilen
try: MYSQL_CONNECTION = pymysql.connect(host = db['MySQL']['host'], port = db['MySQL']['port'], user = db['MySQL']['user'], password = db['MySQL']['password'], db = db['MySQL']['database']) except pymysql.OperationalError as error: print (error) sys.exit(1) except Exception as ex: print("MySQL connection error") print(ex) sys.exit(1)in nur das ab:
MYSQL_CONNECTION = pymysql.connect(host = db['MySQL']['host'], port = db['MySQL']['port'], user = db['MySQL']['user'], password = db['MySQL']['password'], db = db['MySQL']['database'])Achte darauf, das vor den
MYSQL_CONNECTIONkeine lehrzeichen sind!
Danach post mal die ganze Fehlerausgabe.