MySQL 5.x telepítése (Jessie)

A AdminWiki wikiből

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