ubuntuusers.de

Sql-abfrage soll script ausführen

Status: Ungelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

maveman

Anmeldungsdatum:
24. Februar 2019

Beiträge: Zähle...

Hallo zusammen, ich bin auf der Suche nach etwas, was eine Datenbank abfragt und wenn das Ergebnis 5x das gleiche ist, soll ein Script gestartet werden. Um mal etwas Licht rein zu bringen, noch ein paar Infos. Die Datenbank die abgefragt wird, wird jede Minute mit neuen Daten befüllt. Sollte dabei ein bestimmter Wert sich nicht verändern, bzw einen bestimmten Wert erreichen, soll ein Script ausgeführt werden. Diese Abfrage wird also alle 5 Minuten ausgeführt. Woran ich scheiter ist, wie ich die Abfrage so lenke, das bei geforderten Ergebnis ein Script gestartet wird. Wie ich die Abfrage starte bekomme ich wohl hin, nur nicht wie sie aussehen muss.

mysql -u user -e "use Datenbankxyz; select  Keine Ahnung wie es weiter geht;"

Der User der die DB abfragt hat übrigens nur lesenden Zugriff auf die eine Datenbank. Das ganze wird später in ein Shellscript verpackt. Ich hoffe ich konnte verdeutlichen was ich vor habe. Goolge habe ich auch schon bemüht, mir fehlen aber irgendwie dir richtigen Stichworte wonach ich eigentlich suche. Gruß maveman

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

Herzlich willkommen hier im Forum!

Ich würde so etwas ja eher in einer Skriptsprache wie Python oder Ruby machen, die Anbindung an MySQL hat. Das macht die Sache in meinen Augen leichter. Du müsstest dann halt immer den zuletzt abgefragten Wert irgendwo auf Platte speichern, so dass Du ihn dann für den Vergleich mit dem aktuellen Wert zur Verfügung hast.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Ich denke das SQL müsste ungefähr so aussehen:

1
2
3
4
5
6
SELECT a, b, c, count(*) ANZ
FROM tbl1, tbl2
WHERE tbl1.key = tbl2.foreignkey
AND otherrestrictions 
GROUP BY a, b, c
HAVING ANZ >= 5;

Ob man ANZ so bei mysql als alias einführen und später benutzen kann weiß ich nicht.

Überhaupt habe ich "... HAVING ... " selten bei SQL benutzt. Außerdem fragt das Script größer gleich 5 ab, nicht exakt gleichi 5 - nicht klar, was von beidem Du willst.

Sollte dabei ein bestimmter Wert sich nicht verändern

Die konkrete Abfrage und Situation zu kennen wäre doch hilfreich.

Wäre es 3x und nicht 5x würde ich denken, es geht um etwas wie einen Sensor oder GPS-Koordinaten, wo man bei unveränderter Messung nur den ersten und letzten Wert + Zeitstempel braucht, nicht die Zeitstempel dazwischen.

Man kann natürlich auch nur COUNT(*) abfragen, und das != 5 im Script (ob Python, Bash oder was immer - da sehe ich den großen Unterschied nicht) prüfen, also ohne HAVING.

maveman

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 3

Hallo und Danke schon mal für dir Tipps. Ich werde mal etwas weiter ausführen was das Problem ist. Es wird von 15 Clients auf 3 Datenbanken mit PHP Daten eingepflegt. Diese 3 Datenbanken werden von einen PHP-Script jede Minute ausgelesen und neu berechnet und wieder bestückt. In dem Script wird auch fest gehalten, wie lange das Script braucht um den Vorgang abzuschließen. Die normale Dauer liegt bei 3-50 Sekunden. Nun kommt es ab und an mal vor, das das Script aus irgendeinem Grund nicht fertig wird, was dazu führt das der nächste Aufruf von dem Script auch nicht fertig wird. Wenn man dann in die Zeitstempel schaut, kommen da 0.00 Sekunden bei raus. Ein neustarten des Sql-Servers beendet dann das ganze und alles läuft wieder. Die fehlenden Aufrufe werden auch korrekt nach gearbeitet. Der Normalfall ist, das das ganze über Wochen durch läuft ohne Probleme. Solche Zwischenfälle ereignen sich halt nur sporadisch, was die Suche nach dem Fehler echt schwierig macht (wurde mir zumindest so gesagt). Die Lösung die ich jetzt sehe, um dem ganzen jetzt erstmal ein Pflaster zu verpassen ist, die Zeitstempel aus der Tabelle zu holen und wenn 5x in Folge 0.00 raus kommt, ein Script anzustoßen welches den Sql-server neu startet und mir eine Mail sendet. Ich hatte dann als Idee, das das Miniscript die Datenbank ausliest, und bei 5x 0.00 eine Datei anlegt. Sobald diese Datei dann existent ist, würde ein anderes Script den Sql-server neu starten. Für andere Lösungen bin ich natürlich auch zu haben:)

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 577

Wohnort: bochum, germany

Habe sowas mal in Java programmiert.
Wenn dich das interessiert, kannst du den Quellcode bekommen.
P.S.:
Findet man hier: http://5.45.110.229/MyOggRadio/v_download.jsp
Unter FillUtils

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

Das klingt mir, als ob Du ein Problem mit Sperren in der DB hast. Es scheint mir, eine bessere Lösung als der DB-Server-Neustart ist es, das PHP-Skript so auszulegen, dass es immer die Daten verarbeitet, die seit dem letzten erfolgreichen Durchlauf neu gekommen sind. Dann kann man nämlich auch mal längere Pausen überstehen. Und wenn das Skript beim Start gerade läuft, dann sollte es sich ohne Aktion terminieren, so dass dann der nächste Durchlauf die Daten verarbeiten kann.

maveman

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 3

Hallo, Java ist keine Option. Das System soll nicht erweitert werden, bzw mit dem minimalen was da ist auskommen. Längere Pausen sind auch nicht drin, deswegen ja erstmal die Pflasterlösung bis man dem Problem auf die Schliche gekommen ist.

Ich werd mal auf dem Testserver weiter experimentieren. Werde Google mal etwas weiter löchern. Ich glaube das naheliegenste ist, wenn man das auch über PHP löst.

Antworten |