Multiple / Mehrere MySQL Datenbank Versionen
Geschrieben von: Michael Bäcker Donnerstag, den 14. Januar 2010 um 09:29 Uhr
Manche Anwendungen arbeiten mit neueren MySQL Versionen leider nicht besonders gut zusammen. Hier wird ein Weg gezeigt, wie man eine zweite MySQL Datenbank mit einer anderen Version auf ein und dem selben Rechner installieren kann.
Um dies zu bewerkstelligen lädt man sich die gewünschte zweite MySQL Version von folgender URL:
ftp://ftp.sunet.se/pub/unix/databases/relational/mysql/Downloads/
Am besten eignet sich hierzu eine 4.0.xx Version. Aber auch eine Installation einer 4.1.xx oder 3.2.xx Version läuft gleich ab.
Im weiteren Text wird eine 4.0.xx Version installiert.
Für die meisten Installationen eigent sich die Datei mysql-standard-4.0.27-pc-linux-gnu-i686-glibc23.tar.gz. Für 64Bit Installationen muss ein entsprechendes anderes Paket ausgewählt werden.
Installation
Das entsprechende heruntergeladene Paket wird wie folgt entpackt.
linux ~ # cd /usr/local
linux local # tar xvzf mysql-standard-4.0.27-pc-linux-gnu-i686-glibc23.tar.gz
linux local # ln -s mysql-standard-4.0.27-pc-linux-gnu-i686-glibc23 mysql
linux local # cd mysql
Soweit die Installation und das Anlegen eines passenden Links.
Konfiguration
Im folgenden wird der neue / zweite MySQL Server konfiguriert.
linux mysql # cp support-files/my-small.cnf data/my.cnf
linux mysql # vi data/my.cnf
Die Datei my.cnf muss in folgenden Punkten angepasst werden (Fett markierte Zeilen):
[client]
port = 3307
socket = /tmp/mysql-4.sock
[mysqld]
port = 3307
socket = /tmp/mysql-4.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
net_buffer_length = 2K
thread_stack = 64K
server-id = 3307
Hier wurde der neue MySQL Server auf einen anderen Port (3307) konfiguriert, die Server-id auf 3307 und die MySQL-Socket Datei umbenannt.
Die Server-id muss eindeutig sein, ebenso wie die Socket Datei und die Portnummer.
linux mysql # scripts/mysql_install_db --user=mysql
Installing all prepared tables
[...]
linux mysql # chown -R root .
linux mysql # chown -R mysql data
linux mysql # chgrp -R mysql .
Test der Installation
linux mysql # bin/mysqld --defaults-file=/usr/local/mysql/data/my.cnf --user=mysql
InnoDB: The first specified data file ./ibdata1 did not exist:
InnoDB: a new database to be created!
070529 13:52:01 InnoDB: Setting file ./ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
070529 13:52:08 InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
070529 13:52:08 InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
070529 13:52:09 InnoDB: Started
bin/mysqld: ready for connections.
Version: '4.0.27-standard' socket: '/tmp/mysql-4.sock' port: 3307 Official MySQL-standard binary
Interessant ist hier die letzte Zeile der Ausgabe. Hier findet man die konfigurierten Parameter der my.cnf wieder.
Zum Testen des MySQL Servers benötigt man nun eine zweite Session, in der man folgendes macht:
linux ~ # cd /usr/local/mysql
linux mysql # bin/mysql --socket=/tmp/mysql-4.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.27-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> quit
Bye
linux mysql # bin/mysql --host=linux.heimnetz --port=3307 mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.0.27-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> quit
Bye
Hiermit wurde nun getestet, ob die Socket-Verbindung und die Netzwerkverbindung geht. In beiden Fällen hat sich ein MySQL Server der Version 4.0.27-standard gemeldet.
Jetzt wird MySQL (Version 4.0.27-standard) automatisch bei jedem Rechnerstart/-stop gestartet oder gestoppt.
Sicherheit
Wichtig sind noch folgende Befehle, um dem Root Datenbank Benutzer noch ein Passwort zu verpassen:
linux mysql # bin/mysqladmin --socket=/tmp/mysql-4.sock password 'MeinGeheimesPasswort'
linux mysql # bin/mysqladmin --host=linux.heimnetz --port=3307 password 'MeinGeheimesPasswort'
Jetzt wird die Sicherheit zuerst überprüft, ob root keinen Zugriff mehr hat auf die Datenbank ohne Passwort.
linux mysql # mysql --socket=/tmp/mysql-4.sock mysql
ERROR 1045 (00000): Access denied for user: 'root@localhost' (Using password: YES)
linux mysql # mysql --host=linux.heimnetz --port=3307 mysql
ERROR 1045 (00000): Access denied for user: 'root@linux' (Using password: YES)
Beide Wege in das MySQL Datenbanksystem sind nun mittels Passwort geschützt. Jetzt die Gegenprobe mit Passwort:
linux mysql # mysql --socket=/tmp/mysql-4.sock -p mysql
Enter password: .................
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14 to server version: 4.0.27-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> quit
Bye
linux mysql # bin/mysql --host=linux.heimnetz --port=3307 -p mysql
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 4.0.27-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> quit
Bye
linux mysql #
Jetzt darf der Root Datenbank Account nur noch mit Passwort auf die Datenbank zugreifen.
Einbinden ins Linux System (SuSE)
Zuerst muss getestet werden, ob MySQL mittels des Startskriptes auch gestartet werden kann. Dazu sollte man noch folgendes in der Datei support-files/mysql.server angepassen:
[...]
### BEGIN INIT INFO
# Provides: mysql-4
[...]
basedir=/usr/local/mysql
[...]
Diese Anpassungen sind notwendig um einen neuen Dienst (mysql-4) vorzugaukeln und das Basedir entsprechend zu setzen.
linux mysql # support-files/mysql.server start
linux mysql # ps auxwww | grep mysql
mysql 2270 0.4 1.3 81120 12644 pts/1 Sl 14:20 0:00 /usr/local/mysql/bin/mysqld --defaults-extra-file=/usr/local/mysql/data/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --pid-file=/usr/local/mysql/data/linux.pid --skip-locking --port=3307 --socket=/tmp/mysql-4.sock
In der Prozessliste sollte man nochmals alle vorhandenen Parameter kontrollieren (--port, --datadir, --socket, --user, --defaults-extra-file). Es gibt nichts schlimmeres wie zwei konkurrierende Datenbanksystem, die auf die gleiche Datenbank zugreifen.
linux mysql # cp support-files/mysql.server /etc/init.d/
linux mysql # chkconfig -a mysql.server
mysql.server 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Einbinden in Gentoo Linux
Gentoo Linux bietet in neueren Version die Möglichkeit mehrere Datenbankinstanzen zu starten. Dies wird hier verwendet um die unterschiedlichen Versionen zu starten.
[...]
DEBUG=4
[...]
mysql_slot_0=()
mysql_slot_1=(
"mycnf=/usr/local/mysql/data/my.cnf"
"basedir=/usr/local/mysql"
"datadir=/usr/local/mysql/data"
"socket=/tmp/mysql-4"
"server-id=3307"
"port=3307"
)
[...]
Diese Konfiguration sagt aus, dass der Mysql Server (0) mit den Standard Parametern und der Konfiguration aus /etc/mysql/my.cnf gestartet wird.
Der zweite Server soll mit der Konfiguration aus /usr/local/mysql/data/my.cnf gestartet werden, als basedir /usr/local/mysql setzen, den Port und die Server-ID auf 3307 setzen.
Der Wert DEBUG=4 muss nicht gesetzt sein, erleichtert aber die nächsten Schritte.
linux ~ # /etc/init.d/mysql start
dbg: >>> start()
* Starting mysql ...
dbg: >>> get_slot_config()
dbg: srv 0
[...]
* Starting mysql (/etc/mysql/my.cnf)
dbg: starting mysqld with: --defaults-file=/etc/mysql/my.cnf --basedir=/usr --datadir=/usr/local/mysql/data --socket=/tmp/mysql-4.sock
Starting /usr/sbin/mysqld...
Detaching to start /usr/sbin/mysqld...done.
dbg:
49,dbg:
dbg: >>> get_slot_config()
dbg: srv 1
dbg: srv_slot 1
dbg: srv_num
dbg: tmp_eval mysql_slot_1[@]
dbg: conf_d_parameters mycnf=/usr/local/mysql/data/my.cnf basedir=/usr/local/mysql server-id=3307 port=3307
dbg: MY_SUFFIX -1
* my_print_defaults NOT found or not executable
dbg: chroot dir =>
dbg: niceness =>
dbg: basedir => /usr/local/mysql
dbg: datadir => /usr/local/mysql/data
dbg: pidfile => /var/run/mysqld/mysqld-1.pid
dbg: socket => /tmp/mysql-4.sock
dbg: Unamanged => --server-id=3307 --port=3307
dbg: <<< get_slot_config() ok
dbg: >>> checkconfig("/var/lib/mysql-1")
dbg: <<< checkconfig() ok
* Starting mysql (/usr/local/mysql/data/my.cnf)
dbg: starting mysqld with: --defaults-file=/usr/local/mysql/data/my.cnf --server-id=3307 --port=3307 --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --socket=/tmp/mysql-4.sock
/etc/init.d/mysql: line 288: /usr/local/mysql/sbin/mysqld-1: Datei oder Verzeichnis nicht gefunden
dbg:
49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,[...],2,1,0,dbg:
* MySQL-1 NOT started (0)
dbg: <<< start()
Warum ist jetzt der zweite MySQL Server nicht gestartet. Weil das Startskript ein paar Sachen vorwegnimmt. Diese sollten einfach so eingestellt werden, bzw. mit symbolischen Links an die richtige Stelle gestellt werden.
linux ~ # cd /usr/local/mysql
linux mysql # ln -s bin sbin
linux mysql # cd bin
linux bin # ln -s mysqld mysqld-1
Die Datei /usr/local/mysql/data/my.cnf muss noch in einem Punkt angepasst werden. Der User, unter dem der Datenbankserverprozess laufen soll muss mit angegeben werden (Fett markierter Bereich) :
[client]
#password = your_password
port = 3307
socket = /tmp/mysql-4.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
user = mysql
port = 3307
socket = /tmp/mysql-4.sock
server-id = 3307
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
net_buffer_length = 2K
thread_stack = 64K
Prinzipiel kann man sich unter Gentoo die Socket Dateien auch dem Startskript überlassen. Dadurch könnte man weitere MySQL Versionen einfacher parallel laufen lassen.
Wenn der Start nun geklappt hat sollte noch aus der /etc/conf.d/mysql der Parameter DEBUG wieder kommentiert werden. Sieht beim Starten einfach schöner aus ;-)
:wq