» MySQL Timeout für einzelne SELECT Queries

Einfaches MySQL Benchmark PHP Skript (SELECT BENCHMARK)Neuen Thread eröffnenNeue Antwort erstellenText Diff / Merge / Compare: Welches ist das beste Programm
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52420
Wohnort: Lohmar


Meine eBay-Auktionen:
06.02.2017, 21:09
zitieren

Erst MySQL 5.7.4 macht es möglich in Datenbankabfragen ein Timeout zu definieren:
SELECT 
MAX_STATEMENT_TIME = 1000 --in milliseconds
*
FROM table;

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_statement_time
Zitatmax_statement_time applies as follows:

The global max_statement_time value provides the default for the session value for new connections. The session value applies to
SELECT
statements executed within the session that include no MAX_STATEMENT_TIME = N option or for which N is 0.

max_statement_time applies to read-only
SELECT
statements. Statements that are not read only are those that invoke a stored function that modifies data as a side effect.

max_statement_time is ignored for
SELECT
statements in stored programs.

This variable was added in MySQL 5.7.4 and renamed to max_execution_time in MySQL 5.7.8.

Leider kann ich daraus nicht erkennen, ob ein Setzen von
MAX_STATEMENT_TIME
nur für den einen
SELECT
gilt oder für die gesamte Session. Wenn es letzteres ist, dann ist das gefährlich, da alle darauf folgenden
SELECT
z.B. in einem Seitenaufruf ebenfalls unterbrochen würden.

Ich nutze jedenfalls diesen Code im Footer der Seite:
// guard the mysql database
$mysql_guard_lock = 'locks/mysql_guard_lock';
if (!file_exists($mysql_guard_lock) && @mkdir($mysql_guard_lock)) {
$sql = 'SHOW FULL PROCESSLIST';
$result = $db->sql_query($sql, false, __LINE__, __FILE__);
while ($row = $db->sql_fetchrow($result)) {
if ($row['Command'] == 'Query' && $row['Time'] > 5 && strpos($row['Info'], 'BOOLEAN') !== false) {
$sql = 'KILL QUERY ' . intval($row['Id']);
$db->sql_query($sql, false, __LINE__, __FILE__);
}
}
$db->sql_freeresult($result);
rmdir($mysql_guard_lock);
}

Dadurch löst jeder Besucher der Seite eine Prüfung der
PROCESSLIST
aus und wenn eine MySQL Abfrage dabei ist, die das Schlagwort
BOOLEAN
enthält und dieser
SELECT
länger als 5 Sekunden ausgeführt wird, dann wird der dazugehörige Prozess gekillt, also die Abfrage datenbankseitig beendet.

Wie man sieht setze ich ein "Lock-Verzeichnis" ein. Damit werden Race Conditions, also die parallele Ausführung dieses Checks durch mehrere Besucher gleichzeitig, verhindert. Das Prinzip hatte ich hier erklärt:
http://www.programmierer-forum.de/flock-alternative-mkdir-optimiert-t225288.htm

Das Schlagwort
BOOLEAN
habe ich übrigens gewählt, damit ich nur
SELECT
-Abfragen erwische, die eine Volltextsuche in der Datenbank auslösen. Denn eigentlich sind nur diese Abfragen langsam und es spricht nichts dagegen dessen Beendigung zu erzwingen. Man sollte nur eben für den Besucher eine passende Fehlermeldung ausgeben und zusätzlich am besten einen HTTP Status 503 um zu zeigen, dass der Server überlastet ist.

Kombiniert man nun diesen Ansatz mit weiteren Datenbankabfragen und
sys_getloadavg()
, also der aktuellen CPU-Last, kann man damit einen effektiven Schutz gegen die Überlastung der Datenbank bauen, der eben nur dann greift, wenn der Server bereits eine hohe Auslastung besitzt.


pn email
Gast 
06.02.2017, 21:09
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "MySQL Timeout für einzelne SELECT Queries" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Ausgabe von MySQL-Daten (SELECT) mit echo() klappt nicht
Hallo Leute, bin Anfänger im Bereich PHP MYSQL. Habe ein DB mit einer Tabelle die heißt stellen mit id ( auto_increment ) und beschreibung ( varchar ) ! Mach ein kleines Adminseite mit INSERT ( DATEN über Forlumalr einfügen ), SELECT ( DATEN anzeigen...
Seite 2 [PHP]von Viktormk
10
1.549
21.07.2013, 11:15
Viktormk
 Einfaches MySQL Benchmark PHP Skript (SELECT BENCHMARK)
Einfaches Skript um MySQl zu benchmarken: <?php $link = mysqli_connect&#40;"localhost", "root", ""&#41;; /&#x2A; check connection &#x2A;/ if &#40;mysqli_connect_errno&#40;&#41;&#41;...
[Allgemein]von mgutt
0
271
19.01.2017, 12:19
mgutt
1.26.2 Update: Notice: Undefined index: queries in includes/profiler/TransactionProfiler.php
Hallo, Ich habe ein Media Wiki laufen. Ich wollte es von 1.24.1 auf 1.26.2 updaten. Ich bin nach Anleitung vorgegangen. 1. Alle Dateien und Datenbank gesichert 2. Das aktuelle Wiki hochgeladen und alle Dateien ersetzt 3. Meine alte LocalSettings.php...
von Brender
1
100
26.03.2016, 12:52
mgutt
Wie geht das mit SELECT / FROM / WHERE?
mysql_fetch_array(mysql_query("SELECT * FROM benutzerdaten WHERE id = '$user1'")); wie geht das mit select from where ??ich checks net :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:...
[PHP]von Tutor-2000
5
1.151
13.02.2011, 18:32
zuckonit
A'PEXi S-AFC Select und was wegen Felgen :P
Hi Leute, Ich hab vor mir das A'PEXi S-AFC Select für meinen EP2 holen. Jetzt wollt ich wissen ob schon jemand damit erfahrung gemacht hat, was es wirklich bringt und welche vorbereitungen ich vor dem Einbau machen sollte ?! (Lieber erstmal in der...
von Joker
1
231
01.07.2008, 13:31
Joker
Sky+ Select ab sofort mit Aufnahme?! Seit Sky Anytime Update
Hi, ich hab gestern einen Film bei Sky Select bestellt und auf Aufnahme gedrückt. Normal kommt dann eine Fehlermeldung von wg. nicht erlaubt oder sowas. Aber der Film (Der Plan) wurde tatsächlich aufgenommen. Bisher ging ja wenn nur Pause/Play...
von mgutt
1
11.578
26.08.2011, 07:41
mgutt
17-04-09 | US Socks / Timeout 5 (282)
282 fast US Socks: [URL=http://socks24.blogspot.com/2009/04/17-04-09-us-socks-timeout-5-282.html] Download Proxies [/URL] ....
von proxor
0
1.513
16.04.2009, 19:24
proxor
14-04-09 | US Socks / Timeout 5 (339)
339 Fast US Socks: [URL=http://socks24.blogspot.com/2009/04/14-04-09-us-socks-timeout-5-339.html] Download Proxies [/URL] ....
von proxor
0
224
13.04.2009, 18:58
proxor
24-03-09 | Special: US Socks / Timeout 5 (412)
412 fast & fresh US Socks: [URL=http://proxy-heaven.blogspot.com/2009/03/24-03-09-special-us-socks-timeout-5-412.html] Download Proxies [/URL] ....
von proxor
0
696
23.03.2009, 19:52
proxor
20-03-09 | Special: US Socks / Timeout 5 (314)
314 US Socks: [URL=http://proxy-heaven.blogspot.com/2009/03/20-03-09-special-us-socks-timeout-5-314.html] Download Proxies [/URL] ....
von proxor
0
503
19.03.2009, 19:54
proxor
© 2004 - 2024 www.programmierer-forum.de | Communities | Impressum |