Seite 1 von 1
seltsames MySQl Problem
Verfasst: Donnerstag 26. Juli 2007, 13:18
von monocult
Ich hab ein seltsames MySQl Problem
ich habe 2 verschiedene Webspaces mit 2 mal den selben Script das einen Kalender verwaltet und Zugriffe zählt.
Die Daten werden in jeweils verschiedenen Datenbanken gespeichert und haben auch unterschiedliche zugangsdaten.
Webspace A --> Datenbank A --> Tabelle Counter | Tabelle Kalender
Webspace B --> Datenbank B --> Tabelle Counter | Tabelle Kalender
Manchmal kommt es allerdings vor das ich über das Admininterface des Kalenders bei Webspace A einen Termin eintrage. und dieser seltsamer weise in Datenbank B eingetragen wird.
Ich weiß da nicht mehr weiter das verhalten ist mir unerklärlich da Webspace A ja gar keine Zugangsdaten für Datenbank B besitzt und umgekehrt.
Ist das ein Konfigurations Fehler von Mysql/Apache oder mod_python? Kann so was passieren wenn der DB Connect nicht richtig geschlossen wird?
Ich wäre schon Froh wenn ich einen Anhaltspunkt habe.
Grüße Daniel
Verfasst: Donnerstag 26. Juli 2007, 15:21
von Sr4l
liegen die Datenbanken auf unterschiedlichen Servern?
Ich hatte mit MySQLdb auch ein 'Multiuser' Problem wenn verschiedenen Script in verschiedene Datenbanken schreiben die auf dem gleichen Server liegen.
Code: Alles auswählen
db = MySQLdb.connect(
host="localhost",
db="testmysql",
user="xxxxx"
)
es ist vor gekommen das der wechsel zwischen (hier) testmysql und testmysql2 nicht immer funktioniert hat.
Mit einem sauberen Code der klarer connected ging es dann.
Verfasst: Donnerstag 26. Juli 2007, 15:57
von monocult
ja ist der selbe Mysql Server, meinst du das es wirklich am connect liegt? dann hätte ich zumindest einen Ansatzpunkt wo ich suchen könnte.
Code: Alles auswählen
def _mysql(query):
#Verbindung zur Datenbank:
import MySQLdb
connection = MySQLdb.connect(
host="localhost",
db="blabla",
user="blabla",
passwd="*****")
#Erstelle Dict Cursor
curser = connection.cursor()
curser.execute(query)
result = curser.fetchall()
connection.commit()
connection.close()
return result
Was meinst du mit "klarer connected"
Verfasst: Donnerstag 26. Juli 2007, 16:05
von Sr4l
Der wechsel zwischen den Datenbanken scheint nicht 100% zu funktionieren.
so etwas wie in PHP:
gibt es ja nicht? da kann man nur über das connect gehen.
ich denke es ist so:
verbindung zu datenbank 1
insert befehl (zu db1)
insert befehl (zu db1)
verbindung zu datenbank 2
insert befehl (zu db1, ladet aber bei db2 weil neue verbindung aufgebaut)
insert befehl (zu db2)
ich werde mich mal dran machen und ein test script schreiben.
Verfasst: Donnerstag 26. Juli 2007, 16:16
von monocult
Das war auch meine Vermutung nur wie verhindere ich das? Script 1 weiß ja nicht das Script2 eine neue Verbindung aufgebaut hat.
Bin nicht der mysql Freak aber lässt sich die Datenbank nicht sperren für so was?
Verfasst: Donnerstag 26. Juli 2007, 16:27
von Sr4l
Ich habe mich gerade etwas damit beschäftigt.
Bin ein stückweit ratlos dein Code ist richtig so.
Mit einem Python Script kann ich das auch machen ich connecte 2x in unterschiedliche Datenbanken und befülle sie wechselnd mit nur 2connect, alles bleibt getrennt.
Es kann also nur irgend wie mit mod_python bzw apache zutun haben.
Ich werde das gleich noch mal als CGI testen, ob ich für mod_python noch die Kraft finde weiß ich nicht
Bei Threads kann man locks setzen um solche Fehler zu verhinden bei MySQL ist mir das nicht bekannt, das muss aber nichts heißen
*edit*
CGI mit folgendem code geht auch:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import MySQLdb
import time
import cgi
import cgitb; cgitb.enable()
print "Content-Type: text/html;charset=iso-8859-1"
print
connection = MySQLdb.connect(
host="localhost",
db="test",
user="root")
while True:
connection.cursor().execute("INSERT INTO `files` (`id`, `name`, `public`, `meta`, `time`, `ip`) VALUES (NULL, 'test1', 'l', 'l', 1, 'l');")
print "Wieder +1"
time.sleep(1)
den selben code habe ich noch mal auf die db test2 verbinden lassen und dann das erste und dann das zweite script gestartet alle daten sind richtig an gekommen. ich esse jetzt erstmal, dannach mache ich mich kurz an mod_python.
Ich habe bei mod_python und mysqldb die aktuellsten Versionen du auch?
Verfasst: Donnerstag 26. Juli 2007, 17:18
von monocult
Danke für deine mühe. Hier mal meine Apache config
Code: Alles auswählen
<VirtualHost www.domain.de:80 www.domain.de:443 domain.de:80 domain.de:443 > #{NEWTLD}
DocumentRoot /home/www/domain/htdocs
DirectoryIndex index.de.html index.html index.py index.de.php index.html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/www/domain/htdocs>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
<Directory /home/www/domain/htdocs/ >
AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonDebug Off
RewriteEngine on
RewriteRule ^(.*)\.([0-9]+)\.([0-9]+)\.html$ index?id=$2&pid=$3&JustPlugVars=$4
</Directory>
AccessFileName .htaccess
ErrorLog /home/www/domain/logs/error.log
CustomLog /home/www/domain/logs/access.log combined
ServerSignature Off
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
</VirtualHost>
Verfasst: Donnerstag 26. Juli 2007, 18:14
von Sr4l
ok ich habe gerade das selbe mit dem mod_python publisher getestet (nutze ich nur). auch da hat alles funktioniert mit folgendem Code:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import MySQLdb
import time
#import cgi
#import cgitb; cgitb.enable()
from mod_python import apache
def test(req):
req.content_type = "text/html"
connection = MySQLdb.connect(
host="localhost",
db="test",
user="root")
while True:
connection.cursor().execute("INSERT INTO `files` (`id`, `name`, `public`, `meta`, `time`, `ip`) VALUES (NULL, 'test1', 'l', 'l', 1, 'l');")
req.write("Wieder +1")
time.sleep(1)
Trotzdem hatte ich mal den selben Fehler wie du.
ich würde es mal auf einen Bug in einer alten Version schieben etwas besseres fällt mir nicht ein.
Als ich den Bug damals hatte:
Apache2.0
Python 2.3.5
MySQL4.1
MySQLdb in Version 1.2.?
mod_python da habe ich keine Ahnung welche Version ich eingesetzt habe.
und auf einem Debian3.1 Server und WindowsXP SP2
Jetzt habe ich:
Apache2.2
Python 2.5.1
MySQL5.0
MySQLdb in Version 1.2.1
mod_python 3.2.10
und alles auf einem Ubuntu 7.04
Verfasst: Donnerstag 26. Juli 2007, 18:49
von monocult
Apache 2.0.54-5sarge1
Mysql 4.0.24-10sarge2
mod_python 3.1.3-3
Mysqldb 1.2.1c2-1
Python 2.3.5-2
Ist ein Debian Sarge blöde ist das das ein Produktiv Server ist den ich ungern jetzt updaten würde/bzw kann.
Code: Alles auswählen
mysql-bin.717 105738 Intvar 1 105738 INSERT_ID=8233
mysql-bin.717 105766 Query 1 105766 use `auto`; INSERT INTO page_counter VALUES( '', '2...
mysql-bin.717 105861 Query 1 105861 use `auto`; UPDATE page_counter SET counter = '2' W...
mysql-bin.717 105977 Intvar 1 105977 INSERT_ID=4
mysql-bin.717 106005 Query 1 106005 use `kent`; INSERT INTO justplug_kalender VALU...
mysql-bin.717 109403 Intvar 1 109403 INSERT_ID=171
mysql-bin.717 109431 Query 1 109431 use `auto`; INSERT INTO justplug_kalender VALUES( '...
mysql-bin.717 112703 Query 1 112703 use `mabu`; UPDATE page_counter SET counter ...
mysql-bin.717 112826 Query 1 112826 use `mabu`; UPDATE page_counter SET counter ...
der in Zeile 5 ist falsch sollte eigentlich auch nach "auto" und nicht nach "kent". Danach gehts dann. Seltsam :/
Verfasst: Freitag 27. Juli 2007, 11:39
von monocult
Ich weiß nicht mehr weiter. Hab heute ein Script geschrien das Daten kurz hintereinander in verschiedene Db einträgt um das Problem künstlich zu erzeugen. Aber es funktionierte so wie es soll. Wie soll ich denn Fehler bloß finden wenn ich ihn noch nicht einmal reproduzieren kann :/
Verfasst: Freitag 27. Juli 2007, 17:54
von Sr4l
Du musst 2Scripte parallel laufen lassen, dann sollte sich der Fehler reproduzieren lassen. Versuch das mal bitte, bin leider etwas faul ein VM mit Sarge und den anderen alten Versionen aufzusetzen

Verfasst: Montag 30. Juli 2007, 10:25
von monocult
Ich glaub ich habs.
es gibt einen mod_python Bug der gleichnamige Module aus verschiedenen Verzeichnissen nicht trennen kann.
Code: Alles auswählen
Verzeichnis 1 --> module.py
Verzeichnis 2 --> module.py
Wenn jetzt aus Verzeichnis 1 das module.py geladen ist steht das auch anderen Scripten zur Verfügung egal ob diese eigentlich das module.py aus Verzeichnis 2 nutzen sollen.
Da ich die mysql zugangsdaten in einem Module habe könnte der Fehler da liegen. Wobei bei mir die Module nicht nur in unterschiedlichen Verzeichnissen Liegen, sondern auch in unterschiedlichen Webspaces.
Code: Alles auswählen
Webspace 1 --> Dir --> module.py
Webspace 2 --> Dir --> module.py
Der Bug ist in nachfolgenden Versionen behoben. Allerdings stehen die nicht für sarge zu Verfügung das heißt jetzt manuell updaten oder allen Modulen eindeutige Namen geben :/