MySQL 5.x telepítése (Squeeze)
Ez a (vázlatos) leírás a MySQL 5.1.x adatbázis-szerver telepítését mutatja be, néhány "átlagos" PHP webszolgáltatás kiszolgálására (azaz LAMP szerverként) méretezett, nem adatbázis-kiszolgálóként dedikált Debian Squeeze szervergépre.
Tartalomjegyzék
Telepítés
Debian csomagból történik:
apt-get install mysql-server # és függőségei
Telepítés közben a debconf kér egy jelszót a maximális jogosultságokkal rendelkező MySQL root felhasználó számára. Relatív megjegyezhető(?), mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:
/usr/bin/pwgen -n -c -s 12 1
MySQL adatbázis könyvtár elmozgatása
Ez sajnos egy hack egy MySQL hiba megkerülésére. A hiba lényege, hogy a MySQL 5.1+ verziója minden, a datadir mappában lévő könyvtárat adatbázisnak tekint (korábban ez nem így volt, nyugodtan lehetett itt rejtett könyvtár). Mivel a mysql Linux felhasználónak a /var/lib/mysql a home könyvtára, szükségünk van a .ssh alkönyvtárra az SSH tunneles hozzáférés kulcsainak tárolására, így csak a datadir elmozgatása tűnik járhatónak.
Állítsuk le a MySQL-t, hozzuk létre a /var/lib/mysql/databases könyvtárat és mozgassuk át ide a létező adatbázis(oka)t:
invoke-rc.d mysql stop cd /var/lib/mysql mkdir -m 700 databases; chown mysql:root databases find * -type d ! -name databases -prune -exec mv {} databases/ \;
Mondjuk meg a MySQL-nek, hogy az adatbázisok alapkönyvtára megváltozott - ehhez készítsünk egy, a /etc/mysql/my.cnf beállításait részben felüldefiniáló (override) konfigurációs állományt:
-rw-r--r-- root root /etc/mysql/conf.d/datadir_moved.cnf # Datadir moved to work around a bug: # http://bugs.mysql.com/bug.php?id=53797 [mysqld] datadir = /var/lib/mysql/databases
Azért használunk override-ot, mert ezt az esetleges csomagfrissítések nem bántják.
Indítsuk el a MySQL-t:
invoke-rc.d mysql start
Ezután már tehetünk kulcsfile-okat, stb. a /var/lib/mysql-be. A visszamaradt állományokat (ibdata1 ib_logfile1 ib_logfile0 mysql_upgrade_info) törölhetjük.
MySQL scriptelés root felhasználóként, jelszavak nélkül
A scriptekben előforduló plain text jelszavak elkerülése érdekében készítsünk egy (csak a Linux root által olvasható) MySQL kliens beállító állományt:
touch /etc/mysql/root.cnf; chmod 600 /etc/mysql/root.cnf mcedit /etc/mysql/root.cnf -rw------- root root /etc/mysql/root.cnf # Scripting account for root [client] host = localhost user = root password = PASSWORD socket = /var/run/mysqld/mysqld.sock
Ne felejtsük el a PASSWORD helyébe a telepítésnél megadott jelszót beírni! Ezután a localhoston kiadott
/usr/bin/mysql --defaults-file=/etc/mysql/root.cnf
parancs teljes hozzáférést biztosít a MySQL-hez.
MySQL hozzáférés SSH tunnelen keresztül, kulccsal
Az SSH-tunnelezés a fejlesztők számára kiadható távoli adatbázis-hozzáférést és titkosított adatátvitelt tesz lehetővé, úgy, hogy nem kell hozzá shell account és a 3306-os TCP portra vonatkozó tűzfal-beállítás. Így nem kell megengedjük, hogy azonosítatlan idegenek kapcsolódjanak a MySQL szerverhez.
Készítsük elő a mysql felhasználóként authentikálásra jogosultak publikus kulcsainak tárhelyét:
mkdir -m 700 /var/lib/mysql/.ssh chown mysql:mysql /var/lib/mysql/.ssh touch /var/lib/mysql/.ssh/authorized_keys2 chown mysql:mysql /var/lib/mysql/.ssh/authorized_keys2 chmod 400 /var/lib/mysql/.ssh/authorized_keys2 chattr +i /var/lib/mysql/.ssh/authorized_keys2
Ha távoli MySQL hozzáférést szeretnénk kiadni, a fejlesztő publikus kulcsát (az immutable bit átmeneti levétele után) ebbe az állományba kell bemásolnunk (soronként egy kulcs, 3306-os TCP port továbbításra korlátozva - részletesen lásd lejjebb).
MySQL bejegyzése a Tiger által ismert démonok listájába
A mysqld-nek állandóan futnia kell, valamint jogosan figyel a 3306-os tcp porton. Mindezek ellenőrzésére az alábbi módosításokat jegyezzük be a /etc/tiger/tigerrc állományba:
-rw-r--r-- root root /etc/tiger/tigerrc [...] Tiger_Listening_ValidUsers='[...]|mysql' [...] Tiger_Listening_ValidProcs='[...]|mysqld' [...] Tiger_Running_Procs='[...] /usr/sbin/mysqld'
MySQL monitorozásának engedélyezése a Munin számára
A MySQL-t monitorozó Munin plugin-ok engedélyezésére kérjük le a szükséges symlinkek listáját:
munin-node-configure --suggest --shell
és hozzuk létre azokat.
Egy valószínű programhiba (vagy hiányzó függőség? - TODO!) miatt:
munin-run --servicedir=/usr/share/munin/plugins mysql_ suggest Missing dependency Cache::Cache at /usr/share/munin/plugins/mysql_ line 703
jelenleg ez sajnos nem működik, ehelyett maunálisan linkeljük az alábbiakat:
ln -s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/mysql_bytes ln -s /usr/share/munin/plugins/mysql_queries /etc/munin/plugins/mysql_queries ln -s /usr/share/munin/plugins/mysql_slowqueries /etc/munin/plugins/mysql_slowqueries ln -s /usr/share/munin/plugins/mysql_threads /etc/munin/plugins/mysql_threads
A beállítások érvényesítéséhez indítsuk újra a munin-node-ot:
/etc/init.d/munin-node restart
A mysqld beállítása
A mysqld számára a maintainer által biztosított konfiguráció (/etc/mysql/my.cnf) elemeit a /etc/mysql/conf.d/ könyvtárban elhelyezett (ABC-sorrendben kiértékelődő) override állományokkal lehet Debian-barát módon felülírni. Ez a szakasz itt elhelyezhető mysqld beállítási recepteket tartalmaz.
large (PHP)
Átlagos, elsősorban PHP hosting webszervereken a MySQL-t közepes terhelésre méretezett konfigurációban érdemes futtatni. Ehhez a mysqld leállítása után:
/etc/init.d/mysql stop
vegyük elő a maintainer által biztosított, példa "large" (512 MB RAM-ra tervezett) konfigurációt (/usr/share/doc/mysql-server-5.1/examples/my-large.cnf.gz) és ennek alapján készítsük el az override MySQL konfigurációt:
-rw-r--r-- root root /etc/mysql/conf.d/php-large.cnf # MySQL default configuration overrides for a PHP webserver. [mysqld] # National character sets #default-character-set=utf8 #character-set-server=utf8 #init-connect='SET NAMES utf8' key_buffer = 256M max_allowed_packet = 8M # Never reduce, otherwise LOAD_FILE may fail! table_cache = 256 sort_buffer_size = 1M net_buffer_length = 8K # MySQL 5.x read_buffer_size = 1M read_rnd_buffer_size = 4M # MySQL 5.x myisam_sort_buffer_size = 64M #thread_cache = 16 # !TODO! query_cache_size = 16M thread_concurrency = 2 # Hyperthreading 1 processor max_connections = 150 # Defaults to 100 # Log settings # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. #log = /var/log/mysql.log #log = /var/log/mysql/mysql.log # Here you can see queries with especially long duration #log-slow-queries = /var/log/mysql/mysql-slow.log slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1 # binary logging is required for replication log-bin=mysql-bin binlog_format=MIXED # http://dev.mysql.com/doc/refman/5.1/en/stored-programs-logging.html log_bin_trust_function_creators=1 # by default logs are unrotated! expire_logs_days = 1 max_binlog_size = 100M # Full text search settings (handle with care!) ft_min_word_len=1 ft_stopword_file= # Uncomment the following if you are using InnoDB tables innodb_buffer_pool_size = 256M innodb_additional_mem_pool_size = 20M #innodb_log_file_size = 64M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50
Érdemes felülvizsgálni és a hardverhez igazítani a thread_concurrency beállítást. Ezután a mysqld elindítható:
/etc/init.d/mysql start
MySQL mentések beállítása
Jelenleg a MySQL mentéseket a helyi gépen készített, időzített MySQL dumpokkal valósítjuk meg, szükség szerint ezeket távoli gépekre Amanda taskok viszik el (természetesen bármilyen más file backup rendszer is használható). A mentések a teljes adattartalmat felölelik, az adatbázis állapotától függetlenül, napi rendszerességgel, automatizálva.
A mentéshez készítsünk egy könyvtárat a dump számára:
mkdir -m 2750 /var/backups/mysql; chown backup:disk /var/backups/mysql
Ezután töltsük le a mysql-addons.tgz tarball legfrissebb verzióját, és tartalmát (a /usr átmenetileg írhatóvá tételét követően) könyvtárhelyesen másoljuk a szerverre! A csomag beállít egy cron job-ot, amely a MySQL root adatbázis-felhasználó nevében késő éjjel egy teljes adatbázis-mentést készít, erről logot ír és azt rotálja. A csomag tartalmaz Linux root-ként (jelszó nélkül) futtatható scripteket egy konkrét adatbázis illetve egy konkrét tábla archiválására is (/usr/local/sbin/mysql_dump*).
Gyorsteszt
Root-ként adjuk ki az alábbi parancsot (ez van a cron job-ban is):
/usr/local/sbin/mysql_dump /var/backups/mysql/last >>/var/log/mysql/mysql-dump.log 2>&1
és ellenőrizzük, hogy a /var/backups/mysql/last könyvtárban létrejöttek-e a mentések (alaptelepítés után a mysql és az information_schema adatbázisról), illetve nézzünk bele a /var/log/mysql/mysql-dump.log naplóba is.
Itt lesz egy hiba: az information_schema adatbázist nem lehet lockolni, de ezt nyugodtan figyelmen kívül hagyhatjuk - TODO!
MySQL tudnivalók
Távoli MySQL hozzáférés kiadása
Ha távoli MySQL hozzáférést szeretnénk kiadni:
- A fejlesztőtől kérjünk egy legalább 1024 bites ssh2 (DSA) publikus kulcsot (Windows alatt ez pl. a puttygen programmal generálható). Kérjük meg a fejlesztőt, hogy a privát kulcsához rendeljen passphrase-t (lehetőleg erőset)!
- Ha a fejlesztő nem OpenSSH formátumban adta a kulcsot (nem egyetlen sor az egész), akkor azt az alábbi paranccsal konvertálnunk kell:
ssh-keygen -i -f putty_kulcs >openssh_kulcs.pub
- Az immutable bit átmeneti levétele után vegyük fel a kulcsot a fentebb létrehozott /var/lib/mysql/.ssh/authorized_keys2 állomány utolsó sorába, az alábbi paraméterekkel:
-r-------- mysql mysql /var/lib/mysql/authorized_keys2 [...]from="IP.IP.IP.IP",command="/bin/false",no-pty,no-X11-forwarding,no-agent-forwarding,no-port-forwarding,permitopen="localhost:3306" ssh-dss AAAA[...] opcionalis_comment
Ezzel a kulcs használatát a 3306 port továbbítására korlátoztuk. A from korlátozás elhagyható, ha a fejlesztőnek nincs állandó IP címe.
- A fejlesztőnél az SSH kliensnek nem szabad megkísérelnie pseudo-terminált nyitni, illetve shell programot futtatni. A megnyitott tunnelen keresztül a fejlesztő MySQL konzollal vagy grafikus klienssel (MySQL authentikáció után) eléri az adatbázist.
TODO: PuTTY beállítás és Linux konzol parancs!
MySQL felhasználó törlése
MySQL 5.x esetén:
/usr/bin/mysql --defaults-file=/etc/mysql/root.cnf mysql> SELECT host, user, password FROM mysql.user ORDER BY user; mysql> SHOW GRANTS FOR 'user'@'host'; mysql> REVOKE ALL PRIVILEGES ON database.table FROM 'user'@'host'; mysql> REVOKE GRANT OPTION on *.* from 'user'@'host'; mysql> FLUSH PRIVILEGES; mysql> DROP USER 'user'@'host';
Irodalom
- MySQL 5.1 online reference manual