Több mysql szerver egy gépen

sajt képe

Több Mysql szervert futtatni például akkor előnyös,ha például kapunk egy adatbázis-dumpot, amiből majd importálnunk kell, és nem akarunk kockáztatni. Akkor is hasznos, ha az adatbázis szinkronizációt akarjuk gyakorolni, ami a mentéseknél is jól jön. Esetleg, ha valamelyik adatbázisnál más beállításokat akarunk.

Az egész nagyon egyszerű, de mire sweetchuck-al rájöttünk a cégnél, az eltartott legalább egy napig. Úgyhogy most mindenkinek spórolok egy napot. Ezt a plusz egy napot, mindenki eltöltheti a családjával, meditációval, ivással esetleg bugok kijavításával.

Nos. Véssük a következő kódot a /etc/mysql.my.cnf file végére:

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
log = /var/log/mysqld_multi.log

[mysqld1]
port = 3306
datadir = /var/lib/mysql
pid-file = /var/lib/mysql/mysqld.pid
socket = /var/lib/mysql/mysql.sock
user = mysql

[mysqld2]
port = 3307
datadir = /var/lib/szartrapaltak/partraszaltak1
pid-file = /var/lib/szartrapaltak/partraszaltak1/mysql.pid
socket = /var/lib/szartrapaltak/partraszaltak1/mysql.sock
user = mysql

A [mysqld1] szekció az eredeti mysql-t jelöli, ami jelenleg is fut a gépen. Ez azért van itt, mert alapvetően csak egy fajta mysqld futhat, ami most valószínűleg a mysqld_safe. Ehelyett majd a mysqld_multi-t fogjuk futtatni. Ez azt is jelenti, hogy a jelenleg futó démont meg kell állítanunk. Ehhez nem kell átülni a játékkonzol elé. Elég, ha beírjuk a konzolba hogy:

sudo service mysql stop

Ez a /etc/init.d/mysql stop kisebbik fia. A papa is elbánik a démonnal.

A [mysqld2] -ben vannak az új szerverhez tartozó beállítások. A legfontosabb a datadir. Ebbe a könyvtárba kerülnek az adott szerverhez tartozó adatbázisok. Ezt a könyvtárat létre kell hozni, majd installálni az alap mysql adatbázist:

mkdir /var/lib/szartrapaltak/partraszaltak1
sudo mysql_install_db --user=mysql --datadir=/var/lib/szartrapaltak/partraszaltak1

A létrehozás könnyű, mint a pipa füstje, viszont az adatbázis installálása ellen kemény páncél véd, ezt az Ubuntu nem hagyja. Nem liszenszelési, hanem biztonsági okokból. Ezt a biztonságot az Apparmor jelenti. (Én ennek a problémának a megoldását kerestem sokáig.) Nem a legszebb megoldás, és valószínűleg biztonságtechnikailag is kifogásolható, de én a /etc/apparmor.d/usr.sbin.mysqld file-t átraktam máshová (sudo mv /etc/apparmor.d/usr.sbin.mysqld ~/), és újraindítottam apparmort. (sudo service apparmor restart). Ezek után a sudo mysql_install_db --user=mysql --datadir=/var/lib/szartrapaltak/partraszaltak1 is működött.

Ezután (persze, ha már leállítottuk az eredeti démont) már indíthatjuk a

sudo mysqld_multi start 1,2

parancsot, ami elindítja a két szervert. Ugyanígy (stoppal) le is állithatjuk őket. További paraméterek a mysqld_multi oldalán.

Természetesen így szinte akármennyi mysql szervert indíthatunk. Érdemes a portokat sorban adni, .pid és a .sock file-okat ugyanabba a könyvtárba tenni, ahol a data-dir van. Kész is vagyunk, futnak a szerverek.

Viszont nagyon keveset érünk vele, ha nem tudunk hozzájuk kapcsolódni. Bár úgy néz ki, hogy a localhost és a 127.0.0.1 egy és ugyanaz, de mégsem. Ha a mysql-nek kapcsolódási pontként localhost-ot adunk meg, akkor a socketen keresztül akar csatlakozni. Ha 127.0.0.1-et, akkor viszont a porton keresztül. Ezt régebben szintén egy nap volt megfejtenem, úgyhogy ez már két nap. Szerintem vidd el a csajt a Pastramiba.

Tehát a:

mysql --host localhost -u root -p -P 3307

(itt a -u a felhasználót, a -p azt jelenti, hogy bekérje a jelszót, ha akarjuk közvetlenül space nélkül beírhatjuk a jelszót is, a -P elvileg a portot jelenti). Beírásakor az eredeti szervert érjük el. Ilyenkor nem veszi figyelembe a -P kapcsolót, mindenképpen a socket-en keresztül kapcsolódik. Próbáljuk ki, a -P után nyugodtan írjuk be a feleségünk és a barátnőink életkorának számtani közepét, (ha ez 3306, akkor menjünk orvoshoz) akkor is ugyanoda fog csatlakozni. Tehát a megfelelő megoldás a:

mysql --host 127.0.0.1 -u root -p -P 3307

Viszont mit sem ér az egész, ha Drupallal nem tudunk csatlakozni az új adatbázishoz, hoszen alapvetően az egészet azért csináljuk, hogy valami elmaradott register_globals-t használó (Te is csináltál ilyen site-ot!!! Ne röhögj!!!) weboldal adatait szeretnénk importálni, az új, csillogó-villogó (nem flash), bár egy kicsit tartalom nélkül való drupal weboldalunkba. Ehhez az kell, hogy a drupal két adatbázist is tudjon használni. Ehhez a következőt kell írni a settings.php-ba (aki nem tudja hol van, ne is írjon bele, ezt a file-t installáláskor létre kell hozni):

$db_url['default'] = 'Ide jön az, ami a $db_url-ben van';
$db_url['ahonnanimportalunk'] = 'mysql://root:@127.0.0.1:3307/partraszaltak';

Ezek után a db_set_active() függvénnyel tudunk váltogatni a két adatbázis között.

A leírás Ubuntura (és gondolom Debianra) vonatkozik. El kell ismernem, hogy OpenSuSe-n az egész sokkal egyszerűbb, de ez legyen egy másik blog témája.