MySQL 5.x telepítése (Jessie)
Ez a (vázlatos) leírás a MySQL 5.5.x adatbázis-szerver telepítését mutatja be, elsősorban nem adatbázis-kiszolgálóként dedikált, hanem néhány átlagos PHP webszolgáltatás kiszolgálására (azaz LAMP szolgáltatóként) méretezett, standalone (nem cluster) Debian Jessie szervergépre.
Tartalomjegyzék
Házirend
TODO!
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. Ezt ne hagyjuk üresen! 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ói minden, a datadir mappában lévő könyvtárat adatbázisnak tekintenek (korábban ez nem így volt, nyugodtan lehetett itt rejtett könyvtár; az 5.6.3+ verziókban ennek áthidalására már létezik a ignore-db-dir paraméter). Mivel a mysql Linux felhasználónak a /var/lib/mysql a kézenfekvő(?) home könyvtára, szükségünk van itt az .ssh alkönyvtárra az SSH tunneles hozzáférés kulcsainak tárolására, így a datadir elmozgatása tűnik célszerű megoldásnak.
Á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:
systemctl stop mysql 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:
systemctl start mysql
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 SSH tunnelezésének előkészítése
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.
A tunnelt a mysql Linux rendszerfelhasználó nevében szeretnénk felépíteni, azonban ennek home könyvtára alapértelmezésben nonexistent. Az /etc/passwd állományban állítsuk ezt a /var/lib/mysql értékre (korábban ez volt az alapértelmezés), illetve opcionálisan(!) adjunk valid shell-t ennek a felhasználónak (erre némely MySQL kliensnek - pl. SQLyog - sajnos szüksége van):
-rw-r--r-- root root /etc/passwd [...] mysql:x:NNN:NNN:MySQL Server,,,:/var/lib/mysql:/bin/sh [...]
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 root hozzáférés Linux 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 localhost-on Linux root-ként kiadott
/usr/bin/mysql --defaults-file=/etc/mysql/root.cnf
parancs teljes hozzáférést biztosít a MySQL-hez.
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
Amennyiben a munin-node telepítve van, a MySQL-t monitorozó Munin pluginok engedélyezésére elég lenne lefuttatni a
munin-node-configure --suggest --shell
parancsot és létrehozni a listázott (a MySQL-t érintő) symlinkeket. Egy valószínű programhiba (vagy hiányzó függőség?) 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 manuálisan kell symlinkelnünk 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:
systemctl restart munin-node
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ő, .cnf kiterjesztésű) 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 vegyük elő a maintainer által biztosított, 512 MB RAM-ra tervezett példa konfigurációt (/usr/share/doc/mysql-server-5.5/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. # Based on /usr/share/doc/mysql-server-5.5/examples/my-large.cnf.gz # UTF-8 everywhere [mysqld] character-set-server=utf8 collation-server=utf8_general_ci init-connect='SET NAMES utf8' # Main resources [mysqld] open_files_limit = 1185 # Defaults to 1185, max 64K. On change check systemd LimitNOFILE also. max_connections = 151 # Defaults to 151. On change consider raising open_files_limit also. key_buffer_size = 256M # Size of the buffer used for MyISAM index blocks. max_allowed_packet = 8M # Never reduce, otherwise LOAD_FILE may fail! table_open_cache = 512 # The number of open tables for all threads. sort_buffer_size = 1M # Each session that needs to do a sort allocates a buffer of this size. read_buffer_size = 1M # Buffer allocated for each thread, for each MayISAM table sequential scan. read_rnd_buffer_size = 4M # Buffer allocated for each client, reading rows from a MyISAM table in sorted order. myisam_sort_buffer_size = 64M # Buffer allocated when creating MyISAM indexes or repairing a table. thread_cache = 8 # How many threads the server should cache for reuse. query_cache_size = 32M # The amount of memory allocated for caching query results. [myisamchk] key_buffer_size = 128M # Used when repairing through the key buffer (--safe-recover). sort_buffer_size = 128M # Used when the keys are repaired by sorting keys (--recover). read_buffer = 2M write_buffer = 2M # Logfiles settings [mysqld] # 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. slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1 # seconds # Binary logging [mysqld] # The benefits of the binary log in enabling you to set up replication and for restore operations, # generally outweigh the minor performance decrement. 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 expire_logs_days = 1 # Defaults to 10 days max_binlog_size = 100M # Defaults to 1GB # InnoDB settings [mysqld] default-storage-engine = InnoDB # Defaults to InnoDB. innodb_file_per_table = 1 # Stores data and indexes for each newly created table in a separate .ibd file. innodb_buffer_pool_size = 256M # The size of the memory area where InnoDB caches table and index data. innodb_additional_mem_pool_size = 20M # The size of a memory pool InnoDB uses to store internal data structures. innodb_log_files_in_group = 2 # The number of log files in the log group. Defaults to 2. innodb_log_file_size = 5M # The size in bytes of each log file in a log group. Defaults to 5M. innodb_log_buffer_size = 8M # Buffer that InnoDB uses to write to the log files on disk. Defaults to 8M. innodb_flush_log_at_trx_commit = 1 # For full ACID compliance. Defaults to 1. innodb_lock_wait_timeout = 50 # Seconds an InnoDB transaction waits for a row lock before giving up. Defaults to 50. # Full text search settings (keep condidtent and handle with care!) [mysqld] ft_min_word_len=1 # Min length of a word to index, defaults to 4 ft_stopword_file= # Default file contains English words only [myisamchk] ft_min_word_len=1 # Min length of a word to index, defaults to 4 ft_stopword_file= # Default file contains English words only
A beállítások a mysqld újraindításával érvényesíthetőek:
systemctl restart mysql
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.
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 2048 bites ssh2 RSA 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,permitopen="localhost:3306" ssh-rsa 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 command="/bin/false",no-pty korlátozások elhagyandóak(!), ha a MySQL kliensnek szüksége van shell-re (SQLyog TODO!).
- 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.* FROM 'user'@'host'; mysql> REVOKE GRANT OPTION ON *.* FROM 'user'@'host'; mysql> FLUSH PRIVILEGES; mysql> DROP USER 'user'@'host';
Irodalom
- MySQL 5.5 online reference manual
- InnoDB Corruption Repair Guide (cPanel fórum)