seltsames MySQl Problem

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Donnerstag 26. Juli 2007, 13:18

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 26. Juli 2007, 15:21

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.
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Donnerstag 26. Juli 2007, 15:57

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"
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 26. Juli 2007, 16:05

Der wechsel zwischen den Datenbanken scheint nicht 100% zu funktionieren.
so etwas wie in PHP:

Code: Alles auswählen

  <?php
  mysql_select_db&#40;"mysqltest"&#41;;
  ?>
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.
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Donnerstag 26. Juli 2007, 16:16

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?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 26. Juli 2007, 16:27

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?
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Donnerstag 26. Juli 2007, 17:18

Danke für deine mühe. Hier mal meine Apache config

Code: Alles auswählen

<VirtualHost www.domain.de&#58;80 www.domain.de&#58;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>
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 26. Juli 2007, 18:14

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
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Donnerstag 26. Juli 2007, 18:49

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 :/
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Freitag 27. Juli 2007, 11:39

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 :/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Freitag 27. Juli 2007, 17:54

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 :-)
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Montag 30. Juli 2007, 10:25

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 :/
Antworten