PHP/MySQL Datenbank temporär sperren

Hi!

Ich weiß nicht, ob das PHP-Forum das Richtige für mein Anliegen ist, aber ich probier’s einfach mal:

Ich habe eine etwas umfangreicherer Anwendung mit PHP und MySQL-DB geschrieben (ca. 20 Dialoge und etwa 50 Tabellen). Ich suche jetzt nach einem Mechanismus, den Zugriff von den PHP-Programmen auf die Datenbank für eine kurze Zeit zu unterbinden. Während dieser Zeit soll ein Administrator die Datenbank auswerten können, ohne das während dieser Zeit Veränderungen durch die Anwender vorgenommen werden können. Wie macht man das?

Die User müssen sich über ein Log-In identifizieren und haben dann ein Menü mit Verzweigungen zu den diversen Dialogen zur Verfügung. Die Dialoge wiederum gehen bis zu drei Ebenen tief.

Meine erste Idee war, vom Admin ein Flag in die Datenbank setzen zu lassen, was die Menüsteuerung beeinflusst (verhindert dann den Aufruf der nachfolgenden Dialoge). Was mache ich aber mit einem User, der vor Setzen des Sperr-Flags in einem Dialog ist? Muss ich in jeden Dialog eine Prüfung auf das Sperrflag einbauen, um DB-Zugriffe zu verhindern? Oder gibt es in PHP eine bessere Methode?

Grüße
Heinrich

Hi!

Ich weiß nicht, ob das PHP-Forum das Richtige für mein
Anliegen ist, aber ich probier’s einfach mal:

Ich habe eine etwas umfangreicherer Anwendung mit PHP und
MySQL-DB geschrieben (ca. 20 Dialoge und etwa 50 Tabellen).
Ich suche jetzt nach einem Mechanismus, den Zugriff von den
PHP-Programmen auf die Datenbank für eine kurze Zeit zu
unterbinden. Während dieser Zeit soll ein Administrator die
Datenbank auswerten können, ohne das während dieser Zeit
Veränderungen durch die Anwender vorgenommen werden können.
Wie macht man das?

Professionell würde ich sagen mit .htaccess…
dadurch kann kein Script mehr angesteuert werden und somit sind auch nurnoch die Aufrufe per cronjob oder von jemand mit Zugang zum htaccess-geschützten Bereich möglich…

Eine zweite Möglichkeit wäre die temporäre Änderung des Datenbankpasswortes. Ein nettes Beispiel dazu ist phpmybackup.
Wenn man das nicht richtig konfiguriert sprich das richtige Passwort einträgt in die config datei, dann schiesst es Dir mehr oder weniger Deine Datenbank ab - phpmyadmin und co können dann nicht mehr rein…
was phpmybackup da genau macht hab ich noch nicht untersucht aber mit eintrag des korrekten Passwortes und erneutem aufruf gings bei mir dann auch wieder…

die dritte Möglichkeit beschreibst Du selbst…

Meine erste Idee war, vom Admin ein Flag in die Datenbank
setzen zu lassen, was die Menüsteuerung beeinflusst
(verhindert dann den Aufruf der nachfolgenden Dialoge). Was
mache ich aber mit einem User, der vor Setzen des Sperr-Flags
in einem Dialog ist? Muss ich in jeden Dialog eine Prüfung auf
das Sperrflag einbauen, um DB-Zugriffe zu verhindern? Oder
gibt es in PHP eine bessere Methode?

ich weiss nicht ganz, was Du mit einem Dialog meinst… aber Du musst halt vor jeder Ausführung eines Queries prüfen, ob das Query auch durchgeführt werden darf. Dazu brauchts nicht in ner Datenbank stehen, es kann auch ein Textfile im root-directory sein wo Du dann halt in etwa prüfst
if (file_exists(„adminmode.txt“))
{
if ($user == „admin“) executequery($querystring);
else die („Adminmode gesetzt. Keine Datenbankanweisungen möglich!“);
}

HTH
Munich

Hallo Heinrich,

du kannst das ganz einfach lösen. Du hast doch sicher die Verbindung zur Datenbank in ein separate Datei (z.B. verbindung_inc.php zum Includen) geschrieben. Wenn nicht, würde ich dies in jedem Fall mal tun. Dort kannst du ja vor jeder Verbindung standardmäßig abfragen, ob eine bestimmte Variable (z.B. $db_status) auf 1 oder 0 steht. Diesen Parameter könntest du in einer 1-Feld-Tabelle speichern und von dort abrufen. Bevor der Admin dann die DB auswertet, kann er ganz einfach per Mini-Formular oder PHPMyAdmin etc. diesen Parameter auf 0 setzen. Die verbindung_inc.php (oder wie immer die heißt) kann in diesem Fall eine Meldung generieren und den Zugriff stoppen. Das ist ohne großen Aufwand machbar und der Admin bräuchte hinterher ggf. keine PHP-Kenntnisse. Anschließend könnte über dasselbe Miniformular die Variable wieder auf 1 gesetzt werden.

ich denke, dass die beschriebene Methode langfristig einfacher ist als die .htaccess-Methode, da sie das zweimalige Überschreiben der .htaccess pro Auswertung überflüssig macht. Es gibt hier auch mehr potentielle Fehlerquellen. Das erwähnte Mini-Formular würde ich dann aber schon in einem separaten Verzeichnis speichern und dieses dann per .htaccess mit einem Passwort schützen. Das bräuchtest du ja dann nur ein einziges Mal zu machen und dann wäre Ruhe. Das Ganze kann in maximal einer Stunde erledigt sein:

Tabelle anlegen (1 Feld), verbindung_inc.php schreiben (Verbindung zur DB, Abfrage des Status, ggf. Ausgabe der Meldung), Seite mit Mini-Formular (1 Feld + Submit-Button) erstellen, .htaccess erstellen, alles am richtigen Ort speichern, fertig. Schlimmstenfalls musst du in allen Dateien, die eine Verbindung zur DB aufbauen, die Zeile mit der Verbindungsherstellung durch einen include-Befehl (verbindung_inc.php) ersetzen. Dann dauert’s eine halbe Stunde länger.

Gruß
Didi

Eine zweite Möglichkeit wäre die temporäre Änderung des
Datenbankpasswortes. Ein nettes Beispiel dazu ist phpmybackup.
Wenn man das nicht richtig konfiguriert sprich das richtige
Passwort einträgt in die config datei, dann schiesst es Dir
mehr oder weniger Deine Datenbank ab - phpmyadmin und co
können dann nicht mehr rein…
was phpmybackup da genau macht hab ich noch nicht untersucht
aber mit eintrag des korrekten Passwortes und erneutem aufruf
gings bei mir dann auch wieder…

HTH
Munich

Kannst du mir verraten von welcher phpmybackup version du redest? Es gibt mindestens 2-3 Programme mit dem Namen phpmyback von verschiedenen Authoren. Einige werden aber nicht mehr weiterentwickelt…
Das wuerde mich naemlich genauer interessieren. Was passiert, wenn in phpmybackup Fehler auftreten? Bleibt dann die db gesperrt?


Gruss
Dirk
http://www.phpmybackuppro.net/mozilla_search_plugins/

Ich suche jetzt nach einem Mechanismus, den Zugriff von den
PHP-Programmen auf die Datenbank für eine kurze Zeit zu
unterbinden. Während dieser Zeit soll ein Administrator die
Datenbank auswerten können, ohne das während dieser Zeit
Veränderungen durch die Anwender vorgenommen werden können.
Wie macht man das?

na eigentlich mit „LOCK TABLE“

Was
mache ich aber mit einem User, der vor Setzen des Sperr-Flags
in einem Dialog ist?

ist denn die datenbank dann in einem konsistenten zustand?
deine auswertung sollte so schnell gehen, dass er davon nix mitbekommt, bzw:
lock table
kopie/auszug anfertigen
unlock table

/************************************************************************/
/* phpMyBakcup */
/* =========== */
/* */
/* Copyright © 2002 by Audun Larsen */
/* http://www.phpmybackup.com */
/* */
/* This program is free software. You can redistribute it and/or modify */
/* it under the terms of the QPL License, */
/* included in this package(QPL.txt). */
/************************************************************************/

.

/************************************************************************/
/* phpMyBakcup
*/

hehe, heisst ja gar nicht phpMyBackup :wink:
peinlich, peinlich fuer den Author…

Hi!

Ich suche jetzt nach einem Mechanismus, den Zugriff von den
PHP-Programmen auf die Datenbank für eine kurze Zeit zu
unterbinden. Während dieser Zeit soll ein Administrator die
Datenbank auswerten können, ohne das während dieser Zeit
Veränderungen durch die Anwender vorgenommen werden können.
Wie macht man das?

na eigentlich mit „LOCK TABLE“

Kann ich denn auf 55 Tabellen in einem Rutsch eine „Lock Table“ absetzen? Ich will ja nicht eine Tabelle einzeln oder eine Tabelle nach der anderen sperren, sondern die gesamte Datenbank sowohl gegen lesende wie auch schreibende Zugriffe sperren, aber für eine Anwendung durch den Admin verfügbar halten. Die Frage ist eben, was es das systemseitig gibt oder ob die Sperre explizit in den PHP-Modulen der Anwender abgefragt werden muss.

Was
mache ich aber mit einem User, der vor Setzen des Sperr-Flags
in einem Dialog ist?

ist denn die datenbank dann in einem konsistenten zustand?
deine auswertung sollte so schnell gehen, dass er davon nix
mitbekommt, bzw:
lock table
kopie/auszug anfertigen
unlock table

Die Admin-Aufgabe umfasst zwei Teile:
a) eine Sicherungskopie zu erstellen (nach dem Großvater-Vater-Sohn-Prinzip)
b) ziemlich komplexe Auswertungen zu fahren (sind, wie o.g., 55 Tabellen, wo ziemlich komplexe Datenprüfungen und -bewegungen durchgeführt werden müssen). Da wird das mit „schnell“ nicht unbedingt gehen. Ich rechne schon mit einem mehrminütigem Ausfall der DB.

Grüße
Heinrich

Hallo!
Warum machst du eigentich nicht ein Backup im laufenden Betrieb und wertest dann die Daten im Backup aus?

Gruss
Dirk

Die Admin-Aufgabe umfasst zwei Teile:
a) eine Sicherungskopie zu erstellen (nach dem
Großvater-Vater-Sohn-Prinzip)

hier haette ein m.e. mysqlhotcopy o.ä. schon gereciht.

b) ziemlich komplexe Auswertungen zu fahren (sind, wie o.g.,
55 Tabellen, wo ziemlich komplexe Datenprüfungen und
-bewegungen durchgeführt werden müssen). Da wird das mit
„schnell“ nicht unbedingt gehen. Ich rechne schon mit einem
mehrminütigem Ausfall der DB.

mit „komplexe Datenprüfungen und -bewegungen“ bist du natürlich ausgeknockt… dann nuetzt dir auch die master-slave variante von dirk nix, da kannst du nur deine applikation ausser betrieb nehmen - schlechte loesung.

Hi!

Warum machst du eigentich nicht ein Backup im laufenden
Betrieb und wertest dann die Daten im Backup aus?

Gruss
Dirk

Weil die Auswertungsergebnisse die Entscheidungsbasis darstellen für die Eingaben der Anwender zu einem bestimmten Stichtag.

Grüße
Heinrich

Naja, dann machst du genau zu diesem Zeitpunkt das Backup. Dann hast du doch genau die gewuenschten Daten!

GRuss
Dirk

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

Weil die Auswertungsergebnisse die Entscheidungsbasis
darstellen für die Eingaben der Anwender zu einem bestimmten
Stichtag.

Grüße
Heinrich

Naja, dann machst du genau zu diesem Zeitpunkt das Backup.
Dann hast du doch genau die gewuenschten Daten!

GRuss
Dirk

Gut, aber wie verhindere ich Anwendereingaben, während die Auswertung läuft? Die Anwender dürfen nichts eingeben, solange ihnen die ausgewerteten Daten nicht zur Verfügung stehen. Die Auswertung bedeuten für die Anwenderentscheidungen veränderte Grundlagen.

Grüße
Heinrich

Hi,
Die Datenbank zu sperren ist immer eine schlechte Idee.

Du sagst leider nicht ob die Auswertungen einen Einfluss auf alle User haben oder nur auf einzelne User.

Bei letzterem such dir die User raus, die gerade nicht online sind und mach die Auswertungen nur für diese User.
Eine andere Möglichkeit wäre beim Login des Users seine Auswertung zu machen und ihm solange eine „Plesae wait“ Seite zu geben.
Das hängt natürlich davon ab, wie lange die Auswertung dauert.

Gruss
Quaser

Gut, aber wie verhindere ich Anwendereingaben, während die
Auswertung läuft? Die Anwender dürfen nichts eingeben, solange
ihnen die ausgewerteten Daten nicht zur Verfügung stehen. Die
Auswertung bedeuten für die Anwenderentscheidungen veränderte
Grundlagen.

Grüße
Heinrich

Ok, jetzt hab ich kapiert was du willst.
Da, wenn du eine Db sperrst, der Anwender trotzdem noch Formulare ausfuellen kann und auf „absenden“ druecken kann und dann erst eine Fehlermeldung bekommt, wuerde ich die Seiten, von welchen relevante Db-Änderungen gemacht werden koennen, temporär ersetzen durch Hinweisseiten.
z.B. „Z.Zt. keine Eingaben möeglich!“ Dadruch hast du auch verhindert, dass Eingaben erfolgen koennen. Wenn ein User natuerlich schon eine solche Seite geöffnet hat, hat er die Daten trotzdem umsonst eingegeben. (Aber sie landen nicht in der Db, da du die Seite die die Eingabe macht schon ersetzt hast.)

Kommt alles natuerlicha uch drauf an, wie gross deine zeitliche toleranz ist. Das ueberschreiben der Hinweisseiten kann natürlich ein paar Sekunden kosten.

Gruss
Dirk