NEWS
[gelöst] Zugriff auf eine MariaDB
-
Hallo, ich habe den SQL Adapter installiert und eine MariaDB auf meinem Synology NAS laufen.
Hierzu nutze ich im ioBroker das in der MariaDB angelegte Passwort (und unser ist wohl root).
Der ioBroker schreibt auch schön seine Daten.
Will ich nun allerdings eine Verbindung zu Grafana herstellen, da sagt er mit bei einer Testverbindung:ERROR[01-16|06:34:39] Query error logger=tsdb.mysql error="Error 1130: Host '172.17.0.3' is not allowed to connect to this MariaDB server"
Hat jemand eine Idee, was das sein kann?
Ps. Grafana läuft im Docker Container
-
@ben1983
Wie sehen Deine Verbindungseinstellungen in Grafana aus?
Die IP dürfte falsch sein. Das sieht nach einer IP eines Docker-Containers aus. Da muss die IP des NAS rein. -
@ben1983 sagte in Zugriff auf eine MariaDB:
Hat jemand eine Idee, was das sein kann?
Du kannst feststellen, von wo aus auf die MariaDB zugegriffen werden darf, indem du
SELECT User, Host FROM mysql.user WHERE User='root';
auf der MariaDb ausführst. Da wird wohl das Netz 172.17.0.0 fehlen. Das kannst du so aktivieren:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.%' IDENTIFIED BY '<Passwort>'; FLUSH PRIVILEGES;
@Codierknecht: wo sollte die IP geändert werden?
EDIT: Typo
-
@marc-berg sagte in Zugriff auf eine MariaDB:
wo sollte die IP geändert werden?
In den Verbindungseinstellungen von Grafana.
Aber wenn ich die Fehlermeldung nochmal mit Sinn und Verstand lese, dürftest Du Recht haben
-
@codierknecht in der einstellung steht die des NAS. Die Fehlermeldung zeigt die des Bridged Containers
-
@marc-berg Bin da vollkommen unbeholfen drin.
Muss ich das im phpmyAdmin eintragen? -
@ben1983 sagte in Zugriff auf eine MariaDB:
Muss ich das im phpmyAdmin eintragen?
Ich mache das über die Kommandozeile, sollte aber in phpmyAdmin auch gehen. Siehe hier:
https://www.hostgator.com/help/article/how-to-run-sql-queries-in-phpmyadmin
-
@ben1983 Wenn due den MySQL in Grafana drin hast und die ersten Werte visualisierst, mach doch gerne hier mal einen Showcase über das genaue vorgehen.
Mir war das seinerzeit zu kompliziert - die History der Datenpunkte in MySQL besteht ja auch mehreren Tabellen, einer mit den Namen der Datenpunkte und je einer für die verschiedenen Werttypen (Zahl, Text, Rest weis ich gerade aus dem Kopf nicht).
Ich habe das über den ioBroker.simpe-api Adapter gelöst bekommen: https://forum.iobroker.net/topic/75701/grafana-diagramme-und-werte-per-simple-api-adapter
Da fragt dann also Grafana iobroker nach den Daten und erhält diese als JSON.
Wenn du das direkt von der Datenbank machst ist das natürlich theoretisch schneller. -
@bananajoe
Meinst Du sowas hier?Man muss sich lediglich die passenden ID's aus der Tabelle
datapoints
raussuchen.
Ein Subselect war mir an der Ecke zu aufwändig - auch wenn sich das besser lesen ließe. Sähe dann so aus:SELECT ts AS "time", val AS "kWh" FROM ts_number WHERE id = (SELECT id FROM datapoints WHERE name = '0_userdata.0.Strom.tagesverbrauch') AND val > 0 AND ts >= ${__from} AND ts <= ${__to}
Oder alternativ als JOIN
SELECT N.ts AS "time", N.val AS "kWh" FROM ts_number N INNER JOIN datapoints P ON P.id = N.id AND P.name = '0_userdata.0.Strom.tagesverbrauch' WHERE N.val > 0 AND N.ts >= ${__from} AND N.ts <= ${__to}
Sinnvolle Werte für Charts stehen eh nur in
ts_number
. Strings oder Boolean-Werte zu visualisieren ist wohl eher unüblich. -
@marc-berg Also, ich wüsste jetzt nicht, wo ich da ne Adresse eintragen sollte.
-
@ben1983 sagte in Zugriff auf eine MariaDB:
Also, ich wüsste jetzt nicht, wo ich da ne Adresse eintragen sollte.
Der Link, den ich gefunden habe, ist schon ein paar Jahre alt. Dann wird es jetzt etwas anders aussehen.
Ich nutze phpMyAdmin nicht. Aber wie schwer kann es sein, "*SQLQueries in phpMyAdmin" in eine Suchmaschine einzugeben? -
@ben1983 sagte in Zugriff auf eine MariaDB:
Also, ich wüsste jetzt nicht, wo ich da ne Adresse eintragen sollte.
Das ist doch in der Anleitung ziemlich eindeutig:
-
Du hast geschrieben grafana läuft im docker Container? Die Datenbank dann auch? Würde ich mal auf Basis der ip Adresse vermuten.
Die 172. Adressen sind eigentlich die Container internen Adressen, die ich nicht verwenden würde, da sie sich auch ändern können.Wenn jetzt dein Datenbank Container im Host Mode läuft, dann ist er unter der ip Adresse des Hosts erreichbar
Wenn kein Hostessen, dann würde ich beide Container (grafana und Marias) beide ein zusätzliches gemeinsames Netz zuordnen.
Dann sind beide Container jeweils unter ihrem Hostnamen oder Images als hostname erreichbar und du musst dich mit irgendwelchen ip Adressen nicht rumärgern, da docker.Wenn du solche Abhängigkeiten aufbaust, wäre es besser auch Services per docker-compose zu definieren. Je nach Verwaltungsteil nennt sich das immer wieder mal anders (bei portainer stacks)
Darüber kann man über eine yaml Definition relativ einfach und übersichtlich neue Services definieren.Hier mal so ein Beispiel direkt von grafana
https://github.com/tiredofit/docker-grafana/blob/main/examples/docker-compose.yml
In diesem ist grafana und Maria über ein eigenes Netzwerk namens Services verschaltet und gegenseitig unter dem servicenamen als hostname erreichbar.
Das lässt sich auch in separaten Dateien verwalten, wenn man bspw die Datenbank auch noch in anderen Container nutzen möchte.So das zur Erreichbarkeit.
MySQL und Maria haben zur authorisierung eines Nutzers auch noch die Sicht von wo man zugreifen darf. Das lässt sich hierüber konfigurierenhttps://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/
Je nachdem was für ein Image du verwendest kann es sein das der image maintainer da auch schon defaults setzt oder entsprechende Environment variablen zur Konfiguration des Containers bereitstellt.
Wie gesagt, bei Doktor bezogenen Konfiguration, keine IP Adresse verwenden, sondern den Hostnamen
-
@oliverio sagte in Zugriff auf eine MariaDB:
Ist ja alles richtig, was du schreibst. Aber auch nach diesem fancy Umbau stünde @Ben1983 vor dem gleichen Problem wie jetzt, da die MariaDB im default nur localhost zulässt.
-
Im Letzten Teil hab ich den link zur Konfigurierung von für Remote Hosts geschrieben?
Das macht man dann über den Grant Befehl. Der pflegt dann eine Tabelle in der man nachsehen kann wer von welcher ip zugriffsberechtigt ist. Ich glaube man kann auch 0.0.0.0 oder % nehmen um diese zugriffsbeschränkung für einen User auszuschalten.Hier nochmal eine detailliertere Anleitung
https://docs.bitnami.com/virtual-machine/infrastructure/lamp/administration/connect-remotely-mariadb/In der dB Konfiguration muss die bind-address noch auskommentiert werden und wie gesagt der Grant Befehl ausgeführt werden
-
@codierknecht Danke
-
So. Und jetzt komme ich zwar drauf, aber stehe da und weiß nicht, wie ich auf nem Dashboard per Query Builder an die Daten komme
Wo finde ich den hier bspw. die ids, die ich auswählen kann? -
@oliverio sagte in [gelöst] Zugriff auf eine MariaDB:
Im Letzten Teil hab ich den link zur Konfigurierung von für Remote Hosts geschrieben?
Das macht man dann über den Grant Befehl. Der pflegt dann eine Tabelle in der man nachsehen kann wer von welcher ip zugriffsberechtigt ist. Ich glaube man kann auch 0.0.0.0 oder % nehmen um diese zugriffsbeschränkung für einen User auszuschalten.Ja, ich weiß. Das hatte ich ihm aber schon hier https://forum.iobroker.net/post/1239064
konkret beschrieben. Ich wollte nur nicht noch mehr verwirren
-
@ben1983 sagte in [gelöst] Zugriff auf eine MariaDB:
So. Und jetzt komme ich zwar drauf, aber stehe da und weiß nicht, wie ich auf nem Dashboard per Query Builder an die Daten komme
Wo finde ich den hier bspw. die ids, die ich auswählen kann?Es ist eine relationale Datenbank, darum ist das nicht so einfach. Deshalb ja auch das Beispiel von @Codierknecht: https://forum.iobroker.net/post/1239129 , welches du unter "Code" eingeben musst.
-
@ben1983 sagte in [gelöst] Zugriff auf eine MariaDB:
Wo finde ich den hier bspw. die ids, die ich auswählen kann?
Siehe meine Antwort an @BananaJoe weiter oben.
In der DB besteht das Ganze beim SQL-Adapter aus mehreren Tabellen.
Indatapoints
steht nur die Übersetzung von States in id's.
Die eigentlichen Werte stehen (im Fall von Zahlenwerten) ints_number
.