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

Innen: AdminWiki

Ez a (vázlatos) leírás a MySQL 5.5.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 Wheezy szervergépre.


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.

A tunnelt a mysql Linux rendszerfelhasználó nevében szeretnénk felépíteni, azonban ennek home könyvtára a Wheezy-ben nonexistent-re változott. Az /etc/passwd állományban állítsuk ezt vissza a korábbi /var/lib/mysql értékre, illetve opcionálisan(!) adjunk valid shellt 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:106:109: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).

Anonym hozzáférések törlése

A telepítést követően (csak a localhost-ról) lehetséges anonym hozzáférés a MySQL-hez:

mysql -u valaki # anonym hozzáférés nem létező felhasználóval

Welcome to the MySQL monitor...

Az anonym hozzáférés tiltása érdekében, a MySQL-be root-ként belépve, töröljük a mysql.user tábla üres felhasználónevű sorait:

mysql --defaults-file=/etc/mysql/root.cnf

mysql> SELECT host, user, password FROM mysql.user ORDER BY user;

+--------------+------------------+-------------------------------------------+
| host         | user             | password                                  |
+--------------+------------------+-------------------------------------------+
| localhost    |                  |                                           |
| [HOSTNAME]   |                  |                                           |
| localhost    | debian-sys-maint | *B[....................................]6 |
[...]
+--------------+------------------+-------------------------------------------+

mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'HOSTNAME';
mysql> SELECT host, user, password FROM mysql.user ORDER BY user;

+--------------+------------------+-------------------------------------------+
| host         | user             | password                                  |
+--------------+------------------+-------------------------------------------+
| localhost    | debian-sys-maint | *B[....................................]6 |
[...]
+--------------+------------------+-------------------------------------------+

 mysql> quit;

A test adatbázis törlése

A telepítést követően létezhet egy test elnevezésű (üres) adatbázis, amelyhez - és bármely más, később létrehozandó, test_ névtöredékkel kezdődő adatbázishoz(!) - minden felhasználó hozzáférhet. Ezeket a jogokat - és ha létezik, magát a test adatbázist is - root-ként belépve töröljük:

mysql --defaults-file=/etc/mysql/root.cnf

mysql> SELECT Host, Db, User FROM mysql.db;

+-----------+---------------+---------------+
| Host      | Db            | User          |
+-----------+---------------+---------------+
| %         | test          |               |
| %         | test\_%       |               |
[...]
+-----------+---------------+---------------+

mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
mysql> DROP DATABASE test;
mysql> quit;

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:

/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
character-set-server=utf8
collation-server=utf8_general_ci
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=

# InnoDB settings
default-storage-engine=InnoDB
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 command="/bin/false" korlátozás elhagyandó, 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.table FROM 'user'@'host';
mysql> REVOKE GRANT OPTION on *.* from 'user'@'host';
mysql> FLUSH PRIVILEGES;
mysql> DROP USER 'user'@'host';

Irodalom