Archiv verlassen und diese Seite im Standarddesign anzeigen : datenverlust durch mysqli?
hallo,
ich habe vor einiger zeit in meinen scripts von mysql auf mysqli funktionssatz gewechselt. läuft auch alles prima. allerdings sind jetzt doch ab und zu datenverluste aufgetreten bei der tabelle wo ein insert durchgeführt wurde. dies passiert zwar selten, aber dann doch sehr ärgerlich. jetzt frage ich mich ob das an mysqli liegt. hat jemand ähnliche probleme festgestellt?
noch eine sache. ich mache vor insert & update ein "LOCK TABLES `$table` WRITE" und danach ein "UNLOCK TABLES;". aber daran könnte es ja wohl nicht liegen, oder?
AmicaNoctis 07-07-2010, 13:20 Hallo,
garantieren kann ich es dir nicht, aber ich bin sicher, das hat nichts miteinander zu tun. Protokolliere jedes Fehlverhalten mit allem drum und dran, dann sollte sich irgendwann eine reproduzierbare Ursache herauskristallisieren.
*move* ins SQL-Forum.
Gruß,
Amica
onemorenerd 07-07-2010, 13:47 Wieso blockierst du die Tabelle überhaupt? Was machst du da genau in den INSERTs und UPDATEs?
MySQL :: MySQL 5.0 Reference Manual :: 12.3.5.1 Interaction of Table Locking and Transactions (http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)
@Amica
ich protokoliere welche aktionen der user macht. und es passiert eben hauptsächlich beim insert.
@onemorenerd
ich denke das es sicherer ist. ist es nicht so das dann die inserts nach ein ander ausgeführt werden? oder habe ich das falsch verstanden.
ein typischer insert bei mir sieht z.b. so aus:
SQL = LOCK TABLES `tabelle` WRITE
SQL = insert into tabelle (sortID, date, shortText1, shortText2, longText1, activity) values ('8', '1278453600', 'test', 'test', 'test', '1')
SQL = UNLOCK TABLES;
also ganz normal
AmicaNoctis 07-07-2010, 15:01 ein typischer insert bei mir sieht z.b. so aus
Dann ist das Locking komplett überflüssig, da dieses eine Insert in sich selbst atomar ist und auch keine anderen Tabellen beeinflusst, es sei denn, du hast noch irgendwelche Trigger gesetzt.
ne, trigger benutze ich nicht. dann kann ich das "locken" also weg machen. trotzdem frage ich mich wie es zu diesem datenverlust kommen kann.
ThemBones 09-07-2010, 12:07 Hi,
was genau meinst du mit Datenverlust? Ganze Sätze? Oder korrumpierte Daten in einzelnen Spalten in einzelnen Sätzen? etc.
die tabelle, in der zb. ein insert durchgeführt wurde, war auf ein mal leer (nur der letzte datensatz der eingetragen/geendert wurde war noch drin). das problem habe ich bis jetzt bei 3 verschiedenen projekten bei unterschiedlichen hostern.
auf meinem localhost (win7, entwicklungsrechner) hatte ich das problem noch nicht
die tabelle, in der zb. ein insert durchgeführt wurde, war auf ein mal leer
Werden z.B. zum löschen Links verwendet?
Und hat eine SUMA evtl. die Seite gefunden?
Und dann auf allen Links rumgetrampelt?
:)
1. um ins backend zu gelangen, muss man sich erst einloggen. ohne einloggen kann man keine aktion ausführen. wenn man ohne eingeloggt zu sein, einen link ausführt, landet man direkt auf die login seite.
2. das backend ist für suchmaschinen(bots) gesperrt.
3. es wurde ein insert bzw. update durchgeführt, aber KEIN delete.
4. problem ist passiert wenn ein "mensch" etwas geinsert oder geupdatet hatte. da ich die aktionen mittracke, kann ich auch ausschließen das jemand absichtlich die ganzen daten gelöscht hat.
also kann ich das ausschließen ;)
ThemBones 10-07-2010, 19:56 hm, also ich kann mir beim besten willen nicht vorstellen dass das irgendwas mit mysqli zu tun hat. kannst bugs ausschliessen? kann man ja eigentlich nie. hatte letzthin was aehnliches u nach stundenlanger suche stellte sich raus, ich hab das where vergessen. peinlich peinlich. handelts sich um sehr grosse datenmengen? welche storage engine? immer die gleiche mysql version bei den versch hostern?
also, ich verwende eine kleine lib die ich geschrieben habe. davor lief die mit den mysql befehlssatz (ohne probleme). dann habe ich diese auf mysqli umgestellt. allerdings habe ich ein paar sachen eingebaut.
1. ich mache gleich nach der connection ein $this->query("SET NAMES 'utf8'");
2. die daten werden "normalisiert" mit: $mysqlString = "'" .((strcmp(PHP_VERSION, '4.3.0') < 0) ? $this->connection->escape_string($mysqlString) : $this->real_escape_string($mysqlString)). "'";
3. die tables werden gelockt beim schreiben und updaten (das habe ich aber vor kurzem wieder entfernt, da es für meine zwecke wohl unnötig ist)
mysqli löscht keine Daten von alleine.
Ich würde mal alle Queries mitloggen, die ausgeführt werden. Wenn hier nichts ersichtlich ist würde ich noch einen Schritt weiter gehen und den Query-Log (http://dev.mysql.com/doc/refman/5.1/en/query-log.html) von MySQL sezieren.
Was natürlich auch sein könnte ist, dass bestimmte Schreibvorgänge gar nicht erfolgreich sind. Aber dies wirst du doch hoffentlich abfangen und mitloggen.
Und zu allerletzt könnte es auch sein, dass du eine Transaktion startest, diese aber nicht commitest.
AmicaNoctis 11-07-2010, 12:11 Fragst du auch nach jedem Statement eventuell aufgetretene Fehler ab?
ich sollte dann bei gelegenheit die klasse erweitern und noch mehr mitloggen
welche storage engine?
MYISAM
kann es eigentlicht sein, das auch irgend welche browser plug-ins dieses problem hervorrufen? ich kann mich früher erinnern, das die google toolbar öfters probleme gemacht hat.
wie ich grad im log gesehen habe, hat der user FunWebProducts & ZangoToolbar installiert (wohl ohne es zu wissen).
Werden irgendwo Löschoperationen per Link oder GET-Parameter gemacht? Wenn ja, dann solltest du das ändern. Löschen nur per POST erlauben.
@h3ll: Da war combie schneller... (http://www.php-resource.de/forum/sql-datenbanken/99842-datenverlust-durch-mysqli.html#post642735)
@h3ll: Da war combie schneller... (http://www.php-resource.de/forum/sql-datenbanken/99842-datenverlust-durch-mysqli.html#post642735)
Er hat aber keine zufriedenstellende Antwort bekommen, deswegen hab ichs nochmal versucht. Vielleicht klappts ja diesmal :)
Werden irgendwo Löschoperationen per Link oder GET-Parameter gemacht?
nur post, kein get. aber in meinem log wurde nur ein update durchgeführt. ich logge immer inserts, updates, deletes, alter & truncate.
Die letzte Möglichkeit, dir mir noch einfallen würde, wäre der Query-Log von MySQL
dafür braucht man doch aber shell zugang, korrekt? und bei normalen providern kannste das vergessen.
fehler gefunden. bei einen bereich habe ich meine delete methode mit einen parameter zu viel aufgerufen. ich habe 4 parameter übergeben, obwohl da nur 3 möglich sind. komisch das keine fehlermeldung ausgegeben wurde. :confused:
obwohl da nur 3 möglich sind. komisch das keine fehlermeldung ausgegeben wurde.Eine PHP Eigenheit!
Siehe: func_get_args()
PS:
Überflüssige Parameter richten keinen Schaden an.
also ich kann mich erinnern, das ich in früheren version (4?) eine fehlermeldung bekommen habe, wenn ich mehr parameter angegeben habe als erlaubt. ist m.m.n. auch besser. sonst wäre ich nie auf die idee gekommen, das das der fehler ist.
kann man das nicht irgendwie einschalten?
eagle275 13-07-2010, 17:04 error_reporting(E_ALL);
ini_set('display_errors', 1);
sollte das erledigen ...
Nö.
php > error_reporting(-1);
php > function foo($bar) {}
php > foo(1, 2, 3);
php > foo();
Warning: Missing argument 1 for foo(), called in php shell code on line 1 and defined in php shell code on line 1
error_reporting(-1);
ist nicht gut, das zeigt nicht nur fehler an. notices brauche ich nicht. zudem übergibst du mehr argumente "foo(1, 2, 3);" aber da meckert der nicht?
AmicaNoctis 13-07-2010, 19:32 notices brauche ich nicht.
Warum nicht? Wenn die abgeschaltet sind, ist das fast schon ein Garant für schlampige Programmierung.
Zum Thema „zu viele Parameter“: PHP: Funktionsparameter - Manual (http://de2.php.net/manual/de/functions.arguments.php#functions.variable-arg-list)
error_reporting(-1);
ist nicht gut, das zeigt nicht nur fehler an. notices brauche ich nicht.
Die Philosophie ist analog zu „wenn im Auto was klappert, mach' ich halt einfach das Radio lauter ...“
|
|