2 versionen von mysql auf einem server

2 versionen von mysql auf einem server

am 09.02.2007 19:26:15 von Robert Lambe

ich muss 2 versionen gleichzeitig auf einer maschine laufen lassen:
v3 (für eine alte anwendung) und v5

beide sind installiert und laufen isoliert.

ich habe versucht mit mysqlmanager beide zu starten, dazu das file
/etc/my.cnf:
[manager]

[mysqld3]
mysqld-path = ....
port = 3303

[mysql5]
mysqld-path = ...
port = 3306

aber das startup failed.
mache ich was falsch ? gibt es überhaupt einen besseren weg ?

TIA
Martin

Re: 2 versionen von mysql auf einem server

am 09.02.2007 19:57:01 von Christian Kirsch

Martin schrieb:
> ich muss 2 versionen gleichzeitig auf einer maschine laufen lassen:
> v3 (für eine alte anwendung) und v5
>
> beide sind installiert und laufen isoliert.
>
> ich habe versucht mit mysqlmanager beide zu starten, dazu das file
> /etc/my.cnf:
> [manager]
>
> [mysqld3]
> mysqld-path = ....
> port = 3303
>
> [mysql5]
> mysqld-path = ...
> port = 3306
>
> aber das startup failed.
> mache ich was falsch ? gibt es überhaupt einen besseren weg ?
>

Der Weg dazu ist im Handbuch beschrieben. Wenn Du eine Fehlermeldung
bekommst, warum verschweigst Du die dann? Was steht im Logfile?

Re: 2 versionen von mysql auf einem server

am 09.02.2007 21:31:53 von Axel Schwenke

Martin wrote:

> ich muss 2 versionen gleichzeitig auf einer maschine laufen lassen:
> v3 (für eine alte anwendung) und v5

mysqld_multi existiert und ist dokumentiert:

http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html


> ich habe versucht mit mysqlmanager beide zu starten
....
> mache ich was falsch ? gibt es überhaupt einen besseren weg ?

Laß lieber die Finger von mysqlmanager. Das Teil hat ein paar
Merkwürdigkeiten und vermutlich demnächst über die Wupper gehen.


XL

Re: 2 versionen von mysql auf einem server

am 12.02.2007 18:42:32 von Robert Lambe

Axel Schwenke wrote:
> mysqld_multi existiert und ist dokumentiert:
>
> http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html
> ...
> Laß lieber die Finger von mysqlmanager. Das Teil hat ein paar
> Merkwürdigkeiten und vermutlich demnächst über die Wupper gehen.

ok ich setze also auf mysql_multi und nicht auf mysqladmin.

/etc/my.cnf:
[mysqld3]
mysqld = /usr/local/mysql/bin/safe_mysqld --user=mysql
port = 3303
socket = /tmp/mysql.sock3
mysqladmin = /usr/local/mysql/bin/mysqladmin -uroot

[mysqld5]
mysqld = /usr/local/mysql5/bin/mysqld_safe --user=mysql
ledir =
port = 3306
socket = /tmp/mysql.sock5
mysqladmin = /usr/local/mysql5/bin/mysqladmin -uroot

beide server lassen sich allein starten und stoppen.

mysql_multi startet/stoppt v3 allein, aber nicht v5, nicht einmal
allein, also wenn v3 gar nicht läuft:

root:/usr/local/mysql# mysqld_multi start 5 --config-file=/etc/my.cnf

more test.log:
mysqld_multi log file version 2.15; run: Mon Feb 12 18:38:14 2007

Starting MySQL servers

../bin/my_print_defaults: unrecognized option `--loose-verbose'
Usage: /usr/local/mysql5/bin/mysqld_safe [OPTIONS]
....

versuche ich den server allein zu starten, ist wie gesagt alles ok:
/usr/local/mysql5/bin/mysqld_safe --user=mysql&

ist irgendwer diesen weg schon vor mir gegangen ?

jede Hilfe willkommen
Martin

Re: 2 versionen von mysql auf einem server

am 12.02.2007 21:51:35 von Axel Schwenke

martin wrote:
> Axel Schwenke wrote:
>> mysqld_multi existiert und ist dokumentiert:
>>
>> http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html
> > ...
>> Laß lieber die Finger von mysqlmanager. Das Teil hat ein paar
>> Merkwürdigkeiten und vermutlich demnächst über die Wupper gehen.
>
> ok ich setze also auf mysql_multi und nicht auf mysqladmin.
....

> mysql_multi startet/stoppt v3 allein, aber nicht v5, nicht einmal
> allein, also wenn v3 gar nicht läuft:
>
> root:/usr/local/mysql# mysqld_multi start 5 --config-file=/etc/my.cnf
>
> more test.log:
> mysqld_multi log file version 2.15; run: Mon Feb 12 18:38:14 2007
>
> Starting MySQL servers
>
> ./bin/my_print_defaults: unrecognized option `--loose-verbose'

Es wird anscheinend das my_print_defaults von 3.23 mit den Optionen für
my_print_defaults aus 5.0 aufgerufen.

> Usage: /usr/local/mysql5/bin/mysqld_safe [OPTIONS]
> ...

Hier fehlt die Versionsnummer von my_print_defaults. 1.3 ist falsch,
1.6 wäre richtig.

Kann es sein, daß sowohl das 3er als auch das 5er MySQL für
/usr/local/mysql compiliert wurden? Dann ist das der eincompilierte
Default für $basedir. Damit die jeweils passenden Programme gefunden
werden, mußt du basedir in my.cnf richtig setzen:


> /etc/my.cnf:
> [mysqld3]
Der Form halber solltest du hier einfügen:
basedir = /usr/local/mysql

> mysqld = /usr/local/mysql/bin/safe_mysqld --user=mysql
besser:
mysqld = /usr/local/mysql/bin/safe_mysqld
user = mysql

> port = 3303
> socket = /tmp/mysql.sock3
> mysqladmin = /usr/local/mysql/bin/mysqladmin -uroot
Dieses 'user = root' packst du besser in die [mysqld_multi] section.


> [mysqld5]
Hier fehlt:
basedir = /usr/local/mysql5

> mysqld = /usr/local/mysql5/bin/mysqld_safe --user=mysql
besser:
mysqld = /usr/local/mysql5/bin/safe_mysqld
user = mysql

> ledir =
weglassen

> port = 3306
> socket = /tmp/mysql.sock5
> mysqladmin = /usr/local/mysql5/bin/mysqladmin -uroot
Dieses 'user = root' packst du besser in die [mysqld_multi] section.


HTH, XL

Re: 2 versionen von mysql auf einem server

am 13.02.2007 18:54:26 von Robert Lambe

Axel Schwenke wrote:
> Kann es sein, daß sowohl das 3er als auch das 5er MySQL für
> /usr/local/mysql compiliert wurden? Dann ist das der eincompilierte
> Default für $basedir.

die 3er wurde mit /usr/local/mysql compiliert, bei der 5er wurde das
binary installiert, offenbar ist dort auch /usr/local/mysql einkompiliert.

> Damit die jeweils passenden Programme gefunden
> werden, mußt du basedir in my.cnf richtig setzen:

habe ich gemacht:

[mysqld_multi]
user = root

[mysqld3]
basedir = /usr/local/mysql3
mysqld = /usr/local/mysql3/bin/safe_mysqld
user = mysql
port = 3303
socket = /tmp/mysql.sock3
mysqladmin = /usr/local/mysql3/bin/mysqladmin

[mysqld5]
basedir = /usr/local/mysql5
mysqld = /usr/local/mysql5/bin/mysqld_safe
user = mysql
port = 3306
socket = /tmp/mysql.sock5
mysqladmin = /usr/local/mysql5/bin/mysqladmin


leider scheint das nicht zu funktionieren, denn das Problem bleibt
bestehen, wenn ich jeweils basedir richtig angebe im config-file, dh die
5er version versucht 3er programme aufzurufen. Um das Problem auf den
Punkt zu bringen, habe ich die 3er Version mal auf /usr/local/mysql3
verschoben (das macht dann beim starten der 3er andere grauenhafte
probleme mit nicht-gefundenen libs aber ist ja nur mal zum test) und
versucht, die 5er zu starten, und siehe da, nicht einmal mysqld wird
dann mehr gefunden:

....
The file /usr/local/mysql/bin/mysqld doesn't exist or is not executable
Please do a cd to the mysql installation directory and restart
this script from there as follows:
../bin/mysqld_safe.
See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more
information

Es scheint so als würde die basedir option ignoriert.

habe mir mysql5/bin/mysqld_safe mal genauer angeschaut, und es scheint
wirklich dass zb der pfad von my_print_defaults dort hartcodiert ist --
kann aber sein dass ich den code nicht behirne.

....
# Get first arguments from the my.cnf file, groups [mysqld] and
[mysqld_safe]
# and then merge with the command line arguments
if test -x ./bin/my_print_defaults
then
print_defaults="./bin/my_print_defaults"
elif test -x /usr/local/mysql/bin/my_print_defaults
then
print_defaults="/usr/local/mysql/bin/my_print_defaults"
elif test -x /usr/local/mysql/bin/mysql_print_defaults
then
print_defaults="/usr/local/mysql/bin/mysql_print_defaults"
else
print_defaults="my_print_defaults"
fi
....

ich habe natürlich jetzt noch die möglichkeit, die 5er mit basedir=
gleich richtig von source weg zu kompilieren, aber bevor ich den weg
gehe, würde mich noch interessieren, ob die basedir option im config
file nur bei mir nicht geht ?

lg
Martin

Re: 2 versionen von mysql auf einem server

am 13.02.2007 23:04:46 von Axel Schwenke

martin wrote:
> Axel Schwenke wrote:

>> Kann es sein, daß sowohl das 3er als auch das 5er MySQL für
>> /usr/local/mysql compiliert wurden? Dann ist das der eincompilierte
>> Default für $basedir.
>
> die 3er wurde mit /usr/local/mysql compiliert, bei der 5er wurde das
> binary installiert, offenbar ist dort auch /usr/local/mysql einkompiliert.

Ja, das ist der Default.

> > Damit die jeweils passenden Programme gefunden
> > werden, mußt du basedir in my.cnf richtig setzen:
>
> habe ich gemacht:
>
> [mysqld_multi]
> user = root
>
> [mysqld3]
> basedir = /usr/local/mysql3
> mysqld = /usr/local/mysql3/bin/safe_mysqld
> user = mysql
> port = 3303
> socket = /tmp/mysql.sock3
> mysqladmin = /usr/local/mysql3/bin/mysqladmin
>
> [mysqld5]
> basedir = /usr/local/mysql5
> mysqld = /usr/local/mysql5/bin/mysqld_safe
> user = mysql
> port = 3306
> socket = /tmp/mysql.sock5
> mysqladmin = /usr/local/mysql5/bin/mysqladmin
>
>
> leider scheint das nicht zu funktionieren, denn das Problem bleibt
> bestehen, wenn ich jeweils basedir richtig angebe im config-file, dh die
> 5er version versucht 3er programme aufzurufen. Um das Problem auf den
> Punkt zu bringen, habe ich die 3er Version mal auf /usr/local/mysql3
> verschoben (das macht dann beim starten der 3er andere grauenhafte
> probleme mit nicht-gefundenen libs aber ist ja nur mal zum test) und
> versucht, die 5er zu starten, und siehe da, nicht einmal mysqld wird
> dann mehr gefunden:

Das war mein Fehler. Tatsächlich braucht mysqld_safe noch weitere
Variablen, um das Server-Binary (mysqld) zu finden. Aus mysqld_safe:

Usage: $0 [OPTIONS]
--no-defaults Don't read the system defaults file
--defaults-file=FILE Use the specified defaults file
--defaults-extra-file=FILE Also use defaults from the specified file
--ledir=DIRECTORY Look for mysqld in the specified directory
--log-error=FILE Log errors to the specified log file
--open-files-limit=LIMIT Limit the number of open files
--core-file-size=LIMIT Limit core files to the specified size
--timezone=TZ Set the system timezone
--mysqld=FILE Use the specified file as mysqld
--mysqld-version=VERSION Use "mysqld-VERSION" as mysqld
--nice=NICE Set the scheduling priority of mysqld
--skip-kill-mysqld Don't try to kill stray mysqld processes

All other options are passed to the mysqld program.

Demnach ist basedir zwar richtig, weil ohne das dein mysqld nicht
laufen wird (oder zumindest seltsame Fehler produziert), für
mysqld_safe mußt du hingegen noch

ledir = /usr/local/mysql[3,5]/libexec

setzen.


Eine Variante, die ich präferieren würde, wäre die folgende:

1. eine globale my.cnf, die im wesentlichen die notwendigen
Informationen enthält, welche MySQL-Installationen es gibt.

etwa so:

[mysqld_multi]
user = root

[mysqld3]
mysqld = /usr/local/mysql3/bin/safe_mysqld
mysqladmin = /usr/local/mysql3/bin/mysqladmin
defaults-file = /usr/local/mysql3/my.cnf
ledir = /usr/local/mysql3/libexec

[mysqld5]
mysqld = /usr/local/mysql5/bin/mysqld_safe
mysqladmin = /usr/local/mysql5/bin/mysqladmin
defaults-file = /usr/local/mysql5/my.cnf
ledir = /usr/local/mysql5/libexec


2. Jede MySQL-Installation bekommt ihre eigene my.cnf in ihrem basedir.

also z.B. /usr/local/mysql5/my.cnf:

[mysqld]
port = 3305
socket = /tmp/mysql5.sock
basedir = /usr/local/mysql5
datadir = /usr/local/mysql5/var

Alle weiteren Einstellungen für diesen Server gehen in diese my.cnf.


> habe mir mysql5/bin/mysqld_safe mal genauer angeschaut, und es scheint
> wirklich dass zb der pfad von my_print_defaults dort hartcodiert ist --
> kann aber sein dass ich den code nicht behirne.

Das sind nur die einkompilierten (bzw. von autoconf substituierten)
Fallbacks. Normalerweise geht mysqld_safe davon aus, daß das aktuelle
Verzeichnis das basedir der MySQL-Installation ist.

Aber ich sehe hier ein Henne-Ei Problem: mysqld_safe verwendet
my_print_defaults, um eine etwaige my.cnf zu parsen. Allerdings findet
es my_print_defaults nicht, wenn nicht vorher BASEDIR gesetzt ist.
Andererseits akzeptiert es die --basedir Option nicht, sondern will
entweder basedir == cwd oder basedir == default sehen. Schlecht.

> ich habe natürlich jetzt noch die möglichkeit, die 5er mit basedir=
> gleich richtig von source weg zu kompilieren, aber bevor ich den weg
> gehe, würde mich noch interessieren, ob die basedir option im config
> file nur bei mir nicht geht ?

Also wenn du sowieso selber kompilieren willst, würde ich das dringend
anraten. In diesem Fall brauchst du im globalen my.cnf lediglich die
mysqld= und mysqladmin= Einträge. Der Rest - auch my.cnf im basedir
wird dann automatisch gefunden.

Ein Wort noch zu shared Libraries. Wenn du mit dem GNU-Linker linkst,
wird rpath so gesetzt, daß die MySQL-Binaries ihre shared Libraries
auch dann finden, wenn das lib-Verzeichnis nicht in /etc/ld.so.conf
steht. Ein weiterer Punkt, der für selber compilieren mit passender
Angabe von --prefix spricht.


XL

Re: 2 versionen von mysql auf einem server

am 14.02.2007 23:48:54 von Robert Lambe

Axel Schwenke wrote:
> ...
> Eine Variante, die ich präferieren würde, wäre die folgende:
>
> 1. eine globale my.cnf, die im wesentlichen die notwendigen
> Informationen enthält, welche MySQL-Installationen es gibt.
>
> etwa so:
>
> [mysqld_multi]
> user = root
>
> [mysqld3]
> mysqld = /usr/local/mysql3/bin/safe_mysqld
> mysqladmin = /usr/local/mysql3/bin/mysqladmin
> defaults-file = /usr/local/mysql3/my.cnf
> ...

klingt gut und kommt meinem bestreben nach modularisierung entgegen, hat
aber ein problem: weder v3 noch v5 akzeptieren die option
"defaults-file" in einem file, sondern offenbar nur auf der cmdline-

schlimmer noch, in mysqld_multi funkt sie nicht einmal auf der commandline:

#mysqld_multi --defaults-file
Unknown option: defaults-file

noch schlimmer: basedir ist jetzt richtig einkompiliert (--prefix), im
globalen my.cnf zur vorsicht auch noch mal richtig gesetzt, trotzdem
werden die lokalen my.cnf ignoriert, dh zb ein "socket" dort wird von
mysqld/mysqladmin offenbar nicht richtig verwendet, wenn ich über
mysqld_multi starte/stoppen versuche.

ich muss also das /etc/my.cnf so hintrimmen, dass ich starten/stoppen
kann ohne hilfe von lokalen config-files. das geht auch nach viel
herumprobieren, dh mysqld und mysqladmin funken mal für v3 und v5.

aber jetzt kommt noch ein problem dazu:

mysql client(s) lassem sich nicht "normal" starten weil die wiederum den
socket korrekt möchten, und der steht ja im /etc/my.cnf ...

also immer commandline option ?

bei mysql --socket= geht das ja noch, aber wo ich im phpmyadmin zb
rumtun muss hab ich noch nicht probiert.

gibts einen weg, damit die clients den socket automatisch richtig finden
? ein option file für clients ?

oder kann/soll/muss ich das socket-connecten in meinem fall
sicherheitshalber überhaupt abdrehen ? falls ja, wie ? ich könnte ja
einfach immer über tcp connecten.

ich weiss schon das müsste mit -h 127.0.0.1 gehen aber eine globale
option setzen können wäre schon super.


> Also wenn du sowieso selber kompilieren willst, würde ich das dringend
> anraten. In diesem Fall brauchst du im globalen my.cnf lediglich die
> mysqld= und mysqladmin= Einträge. Der Rest - auch my.cnf im basedir
> wird dann automatisch gefunden.

siehe oben, funzt für mich zb für "socket" nicht.
ziemlicher dschungel.

> Ein Wort noch zu shared Libraries. Wenn du mit dem GNU-Linker linkst,
> wird rpath so gesetzt, daß die MySQL-Binaries ihre shared Libraries
> auch dann finden, wenn das lib-Verzeichnis nicht in /etc/ld.so.conf
> steht. Ein weiterer Punkt, der für selber compilieren mit passender
> Angabe von --prefix spricht.

hab ich mich noch nie beschäftigt damit. grundsätzlich hab ich immer gut
erfahrungen damit gemacht, selbst zu compilieren, ist irgendwie
transparenter. allerdings hab ich mir nie die frage gestellt, mit
welchem linker ich linke. ich versuche dir mal zu folgen: ld ist der
gnu-linker. ich nehme an mit dem linke ich eh automatisch ... kann ich
das einstellen ? (wenn du mit sowas anfängst riskierst einfach dass ich
nachfrage.)

danke für deine Geduld.

lg
Martin

Re: 2 versionen von mysql auf einem server

am 22.02.2007 17:30:43 von Robert Lambe

vielleicht braucht das ja mal wer:

habe in meinem speziellen fall (v3 und v5) nach viel herumprobieren den
ansatz mit mysqld_multi verworfen -- zu viele probleme.

beste lösung für mich:

mysql3: von source kompiliert (problem dabei: siehe anderer thread)
dadurch lässt sich base-dir, port, socket eincompilieren und das funzt
dann auch mit dem client mysql gut.

mysql5: kompiliert oder nicht, läuft eh am standard port

probleme hat beim kompilieren vor allem data-dir gemacht, dh ich kann es
einkompilieren aber es wird dann zur laufzeit ignoriert bzw macht andere
schräge probleme. lösung hier: standard-dir verwenden (var), und mit
symbolic link auf die datenpartition umlegen.

lg
Martin