mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 07.04.2007 17:37:46 von Christian-Josef Schrattenthaler
Hallo!
Auf unserem neuen Miet-Server läuft ein MySQL 4.1.22. Eine neue Version
(5.x) können wir wegen unserer 'alten Webanwendung' nicht einsetzten.
Unsere Webanwendung wurde mit VBScript erstellt, und greift per MyODBC auf
den MySQL-Server und die Datenbanken zu.
Bei einer speziellen SELECT-Abfrage kommen sehr viele Daten zusammen. Nach
Absenden dieser SELECT-Anweisung hat der Server eine CPU-Auslastung von
100%, und die belegt der 'mysqld-nt' für sich allein.
Irgendwann kommt dann ein Timout im Webbrowser, und der Server hat kaum
noch eine Auslasung.
Die Hardware ist neu, das System ist besser und leistungsfähiger als unser
alter Server (Hardware, Software, Internetanbindung...), und dennoch
scheinen die Zugriffe generell länger zu dauern!?
Hier die my.ini, welcher der Hoster vorgibt:
***
[MySQLD]
port=3306
basedir=C:\\Programme\\SWsoft\\Plesk\\Databases\\MySQL
datadir=C:\\Programme\\SWsoft\\Plesk\\Databases\\MySQL\\Data
default-character-set=latin1
default-storage-engine=INNODB
query_cache_size=8M
table_cache=32
tmp_table_size=7M
thread_cache=32
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=2M
key_buffer_size=2M
read_buffer_size=1M
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=16M
innodb_log_file_size=10M
innodb_thread_concurrency=8
max_connections=300
key_buffer=4M
max_allowed_packet=1M
sort_buffer=256K
net_buffer_length=4K
old_passwords=1
[client]
port=3306
***
Hat jemand eine Idee? Ich bin echt schon am Verzweifeln, denn immer wenn
ich ein Problem mit dem neuen Server sauber gelöst habe, ist schon ein
neues da :-(
Danke,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 07.04.2007 18:47:49 von Christian-Josef Schrattenthaler
Hallo!
Ich habe jetzt mal * aktiviert, und das führt zu folgendem Ergebnis:
***
C:\Programme\SWsoft\Plesk\Databases\MySQL\bin\mysqld-nt.exe, Version:
4.1.22-community-nt-log. started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
# Time: 070407 18:25:40
# User@Host: aaa[aaa] @ bbb [ccc.ccc.ccc.ccc]
# Query_time: 181 Lock_time: 0 Rows_sent: 2322 Rows_examined: 47702931
use test;
SELECT bce_jobs.id, bce_jobs.customer, bce_jobs.datum, bce_jobs.jobnr,
bce_jobs.amount, bce_jobs.status, bce_jobs.filename, bce_jobs.jobNew,
bce_jobs.invoicenr, bce_jobs.gentool, bce_jobs.owner, bce_jobs.worker,
bce_jobs.dispatch, bce_jobs.product, pat_productgroups.prodname,
companies.displayName AS name, companies.dtd AS comptable,
companies.version, bce_jobs.archived, pat_jobstatus.image AS statusImage
FROM bce_jobs, pat_productgroups, companies, pat_jobstatus WHERE
bce_jobs.customer = companies.id AND bce_jobs.status = pat_jobstatus.statId
AND bce_jobs.product = pat_jobstatus.productId AND (bce_jobs.owner = 1 OR
bce_jobs.worker = 1) AND bce_jobs.product = pat_productgroups.prodid AND
bce_jobs.status IN(0) ORDER BY datum DESC, bce_jobs.id DESC;
***
Diese SELECT-Anweisung habe ich dann auch über MyPHPAdmin ausprobiert, mit
dem folgenden Ergebnis:
***
Zeige Datensätze 0 - 29 (2322 insgesamt, die Abfrage dauerte 0.0003 sek)...
....und dann werden mir sämtliche Datensätze angeezeigt...
***
Gruß,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 07.04.2007 20:09:36 von Kai Ruhnau
Christian-Josef Schrattenthaler wrote:
> Ich habe jetzt mal * aktiviert, und das führt zu folgendem Ergebnis:
Was ist *? Das slow query log?
> ***
> C:\Programme\SWsoft\Plesk\Databases\MySQL\bin\mysqld-nt.exe, Version:
> 4.1.22-community-nt-log. started with:
> TCP Port: 3306, Named Pipe: MySQL
> Time Id Command Argument
> # Time: 070407 18:25:40
> # User@Host: aaa[aaa] @ bbb [ccc.ccc.ccc.ccc]
> # Query_time: 181 Lock_time: 0 Rows_sent: 2322
^^^^
> Rows_examined: 47702931
^^^^^^^^
Bist du dir sicher, dass 47 Millionen Zeilen eine sinnvolle Menge zum
Durchsuchen ist, wenn die Ergebnismenge nichtmal mit Promille sinnvoll
messbar ist?
> use test;
> SELECT bce_jobs.id, bce_jobs.customer, bce_jobs.datum, bce_jobs.jobnr,
> bce_jobs.amount, bce_jobs.status, bce_jobs.filename, bce_jobs.jobNew,
> bce_jobs.invoicenr, bce_jobs.gentool, bce_jobs.owner, bce_jobs.worker,
> bce_jobs.dispatch, bce_jobs.product, pat_productgroups.prodname,
> companies.displayName AS name, companies.dtd AS comptable,
> companies.version, bce_jobs.archived, pat_jobstatus.image AS statusImage
> FROM bce_jobs, pat_productgroups, companies, pat_jobstatus WHERE
> bce_jobs.customer = companies.id AND bce_jobs.status = pat_jobstatus.statId
> AND bce_jobs.product = pat_jobstatus.productId AND (bce_jobs.owner = 1 OR
> bce_jobs.worker = 1) AND bce_jobs.product = pat_productgroups.prodid AND
> bce_jobs.status IN(0) ORDER BY datum DESC, bce_jobs.id DESC;
> ***
EXPLAIN drüber laufen lassen? Und danach entsprechend Indizes gesetzt?
Im übrigen wäre es nett, postetest du lesbares SQL.
> Diese SELECT-Anweisung habe ich dann auch über MyPHPAdmin ausprobiert, mit
> dem folgenden Ergebnis:
Vergiss phpMyAdmin
> ***
> Zeige Datensätze 0 - 29 (2322 insgesamt, die Abfrage dauerte 0.0003 sek)...
> ...und dann werden mir sämtliche Datensätze angeezeigt...
> ***
Hast den Query-Cache aktiviert? Der kann solche Wunder (ist ja gerade
Ostern ;-)) bewirken.
Grüße
Kai
--
This signature is left as an exercise for the reader.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 07.04.2007 21:27:53 von Christian-Josef Schrattenthaler
Am Sat, 07 Apr 2007 20:09:36 +0200 schrieb Kai Ruhnau:
> Christian-Josef Schrattenthaler wrote:
>> Ich habe jetzt mal * aktiviert, und das führt zu folgendem Ergebnis:
>
> Was ist *? Das slow query log?
Hoppla! Ja, das slow-query-log. NAch so vielen Tagen und Stunden schleichen
sich leider auch flüchtigkeitsfehler ein.
>> ***
>> C:\Programme\SWsoft\Plesk\Databases\MySQL\bin\mysqld-nt.exe, Version:
>> 4.1.22-community-nt-log. started with:
>> TCP Port: 3306, Named Pipe: MySQL
>> Time Id Command Argument
>> # Time: 070407 18:25:40
>> # User@Host: aaa[aaa] @ bbb [ccc.ccc.ccc.ccc]
>> # Query_time: 181 Lock_time: 0 Rows_sent: 2322
> ^^^^
>> Rows_examined: 47702931
> ^^^^^^^^
> Bist du dir sicher, dass 47 Millionen Zeilen eine sinnvolle Menge zum
> Durchsuchen ist, wenn die Ergebnismenge nichtmal mit Promille sinnvoll
> messbar ist?
Tut mir leid, ich bin leider nicht der Programmierer der Webanwendung,
sonder nur Gehilfe bei der Server-/Providerumstellung.
>> use test;
>> SELECT bce_jobs.id, bce_jobs.customer, bce_jobs.datum, bce_jobs.jobnr,
>> bce_jobs.amount, bce_jobs.status, bce_jobs.filename, bce_jobs.jobNew,
>> bce_jobs.invoicenr, bce_jobs.gentool, bce_jobs.owner, bce_jobs.worker,
>> bce_jobs.dispatch, bce_jobs.product, pat_productgroups.prodname,
>> companies.displayName AS name, companies.dtd AS comptable,
>> companies.version, bce_jobs.archived, pat_jobstatus.image AS statusImage
>> FROM bce_jobs, pat_productgroups, companies, pat_jobstatus WHERE
>> bce_jobs.customer = companies.id AND bce_jobs.status = pat_jobstatus.statId
>> AND bce_jobs.product = pat_jobstatus.productId AND (bce_jobs.owner = 1 OR
>> bce_jobs.worker = 1) AND bce_jobs.product = pat_productgroups.prodid AND
>> bce_jobs.status IN(0) ORDER BY datum DESC, bce_jobs.id DESC;
>> ***
>
> EXPLAIN drüber laufen lassen? Und danach entsprechend Indizes gesetzt?
Danke, geb ich an die Programmierer weiter. Ich denke, so könnten wir das
Problem lokalisieren...
> Im übrigen wäre es nett, postetest du lesbares SQL.
Tut mir leid, ich bin leider nicht der Programmierer der Webanwendung,
sonder nur Gehilfe bei der Server-/Providerumstellung. Wenn Du mir sagst,
was genau Du brauchst, poste ich die 'richtigen' Daten...
>> Diese SELECT-Anweisung habe ich dann auch über MyPHPAdmin ausprobiert, mit
>> dem folgenden Ergebnis:
>
>
> Vergiss phpMyAdmin
>
Weis schon, aber in meiner Verzweiflung habe ich einfach mal alles
probiert, und MyPHPAdmin scheint die Probleme der ASP-Anwendung ja nicht zu
haben...
>> ***
>> Zeige Datensätze 0 - 29 (2322 insgesamt, die Abfrage dauerte 0.0003 sek)...
>> ...und dann werden mir sämtliche Datensätze angeezeigt...
>> ***
>
> Hast den Query-Cache aktiviert? Der kann solche Wunder (ist ja gerade
> Ostern ;-)) bewirken.
War standardmässig auf 8M gesetzt, ich habe dann das Ganze erfolgreich mit
16MB getestet, und jetzt läuft es mal mit 32MB (sicherheitshalber), aber es
ist doch recht langsam.
Vielen Dank für die vielen Tipps! Vielleicht fällt Dir ja noch was ein!?
Schöne Östern,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 08:51:49 von Christian-Josef Schrattenthaler
>> EXPLAIN drüber laufen lassen? Und danach entsprechend Indizes gesetzt?
EXPLAIN ergab folgende Ausgabe:
***
SQL-Abfrageergebnis
Host: localhost:3306
Datenbank: aa_bbb
Erstellungszeit: 08. April 2007 um 08:24
Erstellt von: phpMyAdmin 2.6.0-pl3 / MySQL 4.1.22-community-nt-log
SQL-Befehl: EXPLAIN SELECT bce_jobs.id, bce_jobs.customer, bce_jobs.datum,
bce_jobs.jobnr, bce_jobs.amount, bce_jobs.status, bce_jobs.filename,
bce_jobs.jobNew, bce_jobs.invoicenr, bce_jobs.gentool, bce_jobs.owner,
bce_jobs.worker, bce_jobs.dispatch, bce_jobs.product,
pat_productgroups.prodname, companies.displayName AS name, companies.dtd AS
comptable, companies.version, bce_jobs.archived, pat_jobstatus.image AS
statusImage FROM bce_jobs, pat_productgroups, companies, pat_jobstatus
WHERE bce_jobs.customer = companies.id AND bce_jobs.status =
pat_jobstatus.statId AND bce_jobs.product = pat_jobstatus.productId AND
(bce_jobs.owner = 1 OR bce_jobs.worker = 1) AND bce_jobs.product =
pat_productgroups.prodid AND bce_jobs.status IN(0) ORDER BY datum DESC,
bce_jobs.id DESC;
Zeilen: 4
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
Using filesort
1 SIMPLE pat_jobstatus ALL NULL NULL NULL NULL 83
1 SIMPLE bce_jobs ALL NULL NULL NULL NULL 18155 Using where
1 SIMPLE companies eq_ref PRIMARY PRIMARY 4 aa_bbb.bce_jobs.customer 1
***
Damit kann ich leider nicht viel anfagen. Was mich noch immer wundert ist,
dass die Abfrage mittels PHP (also über MyPHPAdmin - ich weis, dass das
pfui ist) nur ein paar Sekunden dauert.
Weiters habe ich mir jetz auch mal diekt am Server die 'MySQL GUI Tools
5.0' rauskopiert, und dann die Abfrage (mit und ohne EXPLAIN) über den
'MySQL Query Browser' gemacht. EXPLAIN war gleich fertig, aber die
SELECT-Anweisung ohne EXPLAIN dauert gleich lange wie bei der
Webapplikation, und der Server steht auch (100% CPU-Auslastung) während der
Abfrage.
Ich hätte auch versucht direkt my 'mysql' in einer
MS-DOS-Eingabeaufforderung zu arbeiten, das habe ich aber nicht
hinbekommen, und das Einfügen aus der Zwischenablage (bzl. der langen
SELECT-Anweisung) hat auch nicht funktioniert.
Gruß,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 11:43:48 von Joachim Durchholz
Christian-Josef Schrattenthaler schrieb:
> id select_type table type possible_keys key key_len ref rows Extra
> 1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
> Using filesort
Wenn bei "possible_keys" NULL steht, hat die Tabelle überhaupt keine
Schlüssel.
Das klingt mir schwer danach, als wäre beim Datentransfer was in die
Hose gegangen (Tabellenstruktur übernommen, aber nicht die Schlüssel).
"Using filesort" heißt, dass er keine Schlüssel verwenden konnte und
deshalb die Queryergebnisse erst in eine andere Tabelle geschrieben,
dann nach Wunsch sortiert und zum Schluss das Ergebnis rausgegeben hat.
Das ist bei derartigen Datenmengen natürlich extrem ineffizient.
> Damit kann ich leider nicht viel anfagen. Was mich noch immer wundert ist,
> dass die Abfrage mittels PHP (also über MyPHPAdmin - ich weis, dass das
> pfui ist) nur ein paar Sekunden dauert.
Lass Dich man nicht von Puristen ins Bockshorn jagen. phpmyadmin ist für
viele Aufgaben immer noch das bequemste Werkzeug (und für andere halt
nicht so sehr).
> Weiters habe ich mir jetz auch mal diekt am Server die 'MySQL GUI Tools
> 5.0' rauskopiert, und dann die Abfrage (mit und ohne EXPLAIN) über den
> 'MySQL Query Browser' gemacht. EXPLAIN war gleich fertig, aber die
> SELECT-Anweisung ohne EXPLAIN dauert gleich lange wie bei der
> Webapplikation, und der Server steht auch (100% CPU-Auslastung) während der
> Abfrage.
Die EXPLAIN-Abfrage geht immer sehr schnell. Das erzählt einem mysql
nur, was es denn tun würde, wenn es die Query tatsächlich ausführen würde.
Die Queries dauern immer gleich lang, egal ob sie von phpmyadmin, C oder
was Anderem kommen. Unterschiede gibt's nur, wenn eine Query anders
aussieht, als man dachte :-)
(OK, es gibt noch Dinge wie Query Cache, dann ist die zweite gleiche
Query u.U. schneller als die erste.)
HTH
Jo
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 12:15:20 von Michael Konietzka
Christian-Josef Schrattenthaler schrieb:
>>> EXPLAIN drüber laufen lassen? Und danach entsprechend Indizes gesetzt?
> EXPLAIN ergab folgende Ausgabe:
[..]
> id select_type table type possible_keys key key_len ref rows Extra
> 1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
> Using filesort
> 1 SIMPLE pat_jobstatus ALL NULL NULL NULL NULL 83
> 1 SIMPLE bce_jobs ALL NULL NULL NULL NULL 18155 Using where
> 1 SIMPLE companies eq_ref PRIMARY PRIMARY 4 aa_bbb.bce_jobs.customer 1
> ***
Zum Thema "fehlende Schlüssel" hat ja Joachim schon das wichtigste
geschrieben
> Damit kann ich leider nicht viel anfagen. Was mich noch immer wundert ist,
> dass die Abfrage mittels PHP (also über MyPHPAdmin - ich weis, dass das
> pfui ist) nur ein paar Sekunden dauert.
Ich vermute, daà phpmyadmin an den Query jeweils ein passendes "LIMIT"
setzt, um seitenweise durch die Ergebnissmenge zu navigieren.
Also
Seite 1: /QUERY/+" LIMT 0,29"
Seite 2: /QUERY/+" LIMT 30,29"
Seite 3: /QUERY/+" LIMT 60,90"
etc.
Damit könnte man die kürzere Antwortzeiten von phpMyAdmin erklären.
Auf jeden Fall fehlen aber die Schlüssel und Indizies in der Datenbank,
um zu einem brauchbaren Antwortverhalten zukommen.
GrüÃe
Michael
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 12:33:38 von Michael Konietzka
Christian-Josef Schrattenthaler schrieb:
>>> EXPLAIN drüber laufen lassen? Und danach entsprechend Indizes gesetzt?
> EXPLAIN ergab folgende Ausgabe:
[..]
> id select_type table type possible_keys key key_len ref rows Extra
> 1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
> Using filesort
> 1 SIMPLE pat_jobstatus ALL NULL NULL NULL NULL 83
> 1 SIMPLE bce_jobs ALL NULL NULL NULL NULL 18155 Using where
> 1 SIMPLE companies eq_ref PRIMARY PRIMARY 4 aa_bbb.bce_jobs.customer 1
> ***
Zum Thema "fehlende Schlüssel und Indizes" hat ja Joachim schon das
wichtigste
geschrieben.
> Damit kann ich leider nicht viel anfagen. Was mich noch immer wundert ist,
> dass die Abfrage mittels PHP (also über MyPHPAdmin - ich weis, dass das
> pfui ist) nur ein paar Sekunden dauert.
Ich vermute, daà phpmyadmin an den Query jeweils ein passendes "LIMIT"
setzt, um seitenweise durch die Ergebnissmenge zu navigieren.
Siehe "SELECT Syntax" [1]
Also
Seite 1: /QUERY/+" LIMT 0,30"
Seite 2: /QUERY/+" LIMT 29,30"
Seite 3: /QUERY/+" LIMT 59,30"
etc.
Damit könnte man die kürzere Antwortzeiten von phpMyAdmin erklären.
Siehe "LIMIT Optimization" [2].
Auf jeden Fall fehlen aber die Schlüssel und Indizies in der Datenbank,
um zu einem brauchbaren Antwortverhalten zukommen.
Und falls es mal wieder länger dauert: Snickers^W "Optimization" [3]
;-)
GrüÃe
Michael
[1] http://dev.mysql.com/doc/refman/4.1/en/select.html
[2] http://dev.mysql.com/doc/refman/4.1/en/limit-optimization.ht ml
[3] http://dev.mysql.com/doc/refman/4.1/en/optimization.html
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 15:58:30 von Christian-Josef Schrattenthaler
>> id select_type table type possible_keys key key_len ref rows Extra
>> 1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
>> Using filesort
> Wenn bei "possible_keys" NULL steht, hat die Tabelle überhaupt keine
> Schlüssel.
> Das klingt mir schwer danach, als wäre beim Datentransfer was in die
> Hose gegangen (Tabellenstruktur übernommen, aber nicht die Schlüssel).
Der alte Server läuft mit einer MySQL 3.x Version. Das ist aber technisch
auf dem neuen Server nicht machbar. Am neuen Server läuft normalerweise
eine 5.x von MySQL, die hat aber auch schon so komische Probleme gemacht,
darum setzen wir jetzt eine 4.x Version ein, denn da kamen die Probleme der
5er nicht. Bei den Tests hat es auch einwandfrei geklappt, aber jetzt auf
einmal geht es nicht mehr. Wir haben einfach die Bestehenden Datenbanken
über den Windows-Explorer kopiert. Vielleicht war das ja falsch? Gibt es da
eine bessere Variante für die Übernahme der Daten eines 3er MySQL in einen
4er MySQL? Oder gibt es eine Möglichkeit um die fehlenden Schlüssel
automatisch (oder auch manuell) zu erzeugen?
Danke,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 16:01:31 von Christian-Josef Schrattenthaler
> Ich vermute, daß phpmyadmin an den Query jeweils ein passendes "LIMIT"
> setzt, um seitenweise durch die Ergebnissmenge zu navigieren.
> Siehe "SELECT Syntax" [1]
>
> Also
> Seite 1: /QUERY/+" LIMT 0,30"
> Seite 2: /QUERY/+" LIMT 29,30"
> Seite 3: /QUERY/+" LIMT 59,30"
> etc.
>
> Damit könnte man die kürzere Antwortzeiten von phpMyAdmin erklären.
> Siehe "LIMIT Optimization" [2].
>
> Auf jeden Fall fehlen aber die Schlüssel und Indizies in der Datenbank,
> um zu einem brauchbaren Antwortverhalten zukommen.
Ja stimmt. Er zeigt immer nur ein paar Datensätze pro Seite an. Gibt es
eine Möglichkeit um die fehlenden Schlüssel und Indizies automatisch (oder
auch manuell) zu erzeugen? Vielleicht habe ich bei der Umstellung auf den
Neuen Server (von MySQL 3.x auf MySQL 4.x weil 5.x nur Fehler brachte, und
3.x technisch nicht mehr machbar ist) mit dem Kopieren der Dateien und
Ordner über den Windows-Explorer einen Fehler gemacht?
Gruß,
Christian.
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 16:23:39 von Michael Konietzka
Christian-Josef Schrattenthaler schrieb:
>> Ich vermute, daà phpmyadmin an den Query jeweils ein passendes "LIMIT"
>> setzt, um seitenweise durch die Ergebnissmenge zu navigieren.
>> Siehe "SELECT Syntax" [1]
>>
>> Also
>> Seite 1: /QUERY/+" LIMT 0,30"
>> Seite 2: /QUERY/+" LIMT 29,30"
>> Seite 3: /QUERY/+" LIMT 59,30"
>> etc.
>>
>> Damit könnte man die kürzere Antwortzeiten von phpMyAdmin erklären.
>> Siehe "LIMIT Optimization" [2].
>>
>> Auf jeden Fall fehlen aber die Schlüssel und Indizies in der Datenbank,
>> um zu einem brauchbaren Antwortverhalten zukommen.
> Ja stimmt. Er zeigt immer nur ein paar Datensätze pro Seite an. Gibt es
> eine Möglichkeit um die fehlenden Schlüssel und Indizies automatisch (oder
> auch manuell) zu erzeugen? Vielleicht habe ich bei der Umstellung auf den
> Neuen Server (von MySQL 3.x auf MySQL 4.x weil 5.x nur Fehler brachte, und
> 3.x technisch nicht mehr machbar ist) mit dem Kopieren der Dateien und
> Ordner über den Windows-Explorer einen Fehler gemacht?
Hm, damit habe ich keine Erfahrung. Aber alles Wissenswerte sollte unter
http://dev.mysql.com/doc/refman/4.1/en/upgrade.html
zu finden sein.
GrüÃe
Michael
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 18:44:47 von Joachim Durchholz
Christian-Josef Schrattenthaler schrieb:
>>> id select_type table type possible_keys key key_len ref rows Extra
>>> 1 SIMPLE pat_productgroups ALL NULL NULL NULL NULL 15 Using temporary;
>>> Using filesort
>
>> Wenn bei "possible_keys" NULL steht, hat die Tabelle überhaupt keine
>> Schlüssel.
>> Das klingt mir schwer danach, als wäre beim Datentransfer was in die
>> Hose gegangen (Tabellenstruktur übernommen, aber nicht die Schlüssel).
> Der alte Server läuft mit einer MySQL 3.x Version. Das ist aber technisch
> auf dem neuen Server nicht machbar. Am neuen Server läuft normalerweise
> eine 5.x von MySQL, die hat aber auch schon so komische Probleme gemacht,
> darum setzen wir jetzt eine 4.x Version ein, denn da kamen die Probleme der
> 5er nicht.
Also, ich würde es nochmal mit der 5er Version versuchen. Mit der 4er
habt Ihr ja jetzt auch Probleme.
> Bei den Tests hat es auch einwandfrei geklappt, aber jetzt auf
> einmal geht es nicht mehr. Wir haben einfach die Bestehenden Datenbanken
> über den Windows-Explorer kopiert. Vielleicht war das ja falsch?
Das kann gut sein.
mysql legt einige Informationen über die verfügbaren Datenbanken in
seinen internen Tabellen ab. Einfach nur die Datenbankverzeichnisse
umkopieren funktioniert durchaus bis zu einem gewissen Grad, aber
irgendwann bekommt man eben doch Probleme.
> Gibt es da eine bessere Variante für die Übernahme der Daten eines
> 3er MySQL in einen 4er MySQL?
Es gibt ein Tool namens mysqldump, das einem die Daten aus der Datenbank
in ein versionsunabhängiges Textformat exportiert. Das kann ein mysql5
auch problemlos lesen. (Wobei, wie immer, der Teufel im Detail steckt -
es lohnt durchaus, nach dem Import ein stichprobenartig zu prüfen, was
denn importiert worden ist und was nicht.)
Über phpmyadmin kann man auch importieren und exportieren, allerdings
ist das langsamer als nötig (die Importdaten müssen mindestens dreimal
umkopiert werden, und bei mehreren hunderttausend Sätzen sind das doch
ganz erhebliche Datenmengen), und außerdem begrenzen PHP und Webserver
die auf einen Rutsch verarbeitbaren Datenmengen (mengenmäßig und
CPU-mäßig, damit externe Besucher den Server nicht mit übergroßen
Anfragen überlasten können).
Wenn Dir die Befehlszeile zu mühselig ist, kannst Du es auch mit dem
mysqldumper probieren, der umgeht die Limits (zumindest manche von denen).
> Oder gibt es eine Möglichkeit um die fehlenden Schlüssel
> automatisch (oder auch manuell) zu erzeugen?
phpmyadmin bietet eine Möglichkeit an, Schlüssel zu erzeugen.
Oder man macht's mit ALTER TABLE in mysql oder einem extra dafür
geschriebenen PHP-Skript.
Aber dump&import ist die zuverlässigste Variante.
Die Details von mysqldump bzw. ALTER TABLE kann man auf dev.mysql.com
nachlesen (ich weiß sie auch nicht auswendig, deshalb muss der Verweis
jetzt genügen).
Grüße
Jo
Re: mysqld-nt verursacht 100% CPU-Auslastung nach SELECT-Abfrage
am 08.04.2007 21:55:36 von Joachim Zobel
Am Sun, 08 Apr 2007 16:01:31 +0200 schrieb Christian-Josef
Schrattenthaler:
>> Auf jeden Fall fehlen aber die Schlüssel und Indizies in der Datenbank,
>> um zu einem brauchbaren Antwortverhalten zukommen.
> Ja stimmt. Er zeigt immer nur ein paar Datensätze pro Seite an. Gibt es
> eine Möglichkeit um die fehlenden Schlüssel und Indizies automatisch (oder
> auch manuell) zu erzeugen?
In der alten Datenbank nachschauen, was es da an Indexen gibt und diese
dann in die neue übernehmen.
> Vielleicht habe ich bei der Umstellung auf
> den Neuen Server (von MySQL 3.x auf MySQL 4.x weil 5.x nur Fehler
> brachte, und 3.x technisch nicht mehr machbar ist) mit dem Kopieren der
> Dateien und Ordner über den Windows-Explorer einen Fehler gemacht?
Ich hoffe Ihr habt nicht erst die 5er installiert und dann von der 5er
begrapschten Datendateien für die 4er weiterverwendet.
GruÃ,
Joachim