PostgreSQLMySQL

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen Csapoadam (vitalap | szerkesztései) 2007. december 11., 00:44-kor történt szerkesztése után volt.

Tartalomjegyzék

1 PostgreSQL és MySQL összehasonlítása adminisztrátor szemszögéből

Először külön áttekintem a két DBMS-t, majd a végén térek rá a különbségekre.

1.1 PostgreSQL

  • Többfelhasználós ORDBMS (Objektum-relációs adatbázis-kezelő rendszer - relációs sémákkal dolgozik, azonban a sémákban tárolt adatok úgy tűnnek a külső felhasználó számára, mintha objektumok lennének, ezen kívül a sémák között objektum-orientáltságra emlékeztető kapcsolatok vannak, így lehet pl. örököltetni)
  • Berkeley Egyetemen kifejlesztett POSTGRES objektum-relációs adatbáziskezelő rendszer nyílt forrású bővítése
  • Természetesen jelentős szolgáltatás-növelés történt azóta
  • Kliens-szerver architektúrájú (a szerver program neve postmaster)
  • Jó ideig UNIX-alapú rendszereken futott csak, ezért Windowson csak Cygwin vagy MinGW telepítése után volt használható (mármint a szerverprogram) - mamár van natív Windowsos változata is.

1.1.1 Telepítés

  • RedHat esetén rpm csomagból. Le kell tölteni az összes szükséges csomagot, majd futtatni kell a következő parancsot:
    • rpm -ivh postgresql-*
  • Néhány főbb csomag, amikre szükség lehet:
    • postgresql : alapcsomagok
    • postgresql-contrib : kiegészítő csomagok
    • postgresql-devel : alkalmazások fejlesztéséhez és fordításához. A kiszolgáló telepítéséhez feltétlenül szükséges
    • postgresql-jdbc : Java DataBase Connectivity-t lehetővé tevő csomag
    • postgresql-libs : megosztott programkönyvtárak
    • postgresql-odbc : Open DataBase Connectivity, API amit nagyon sok eszköz támogat
    • postgresql-perl : Perlben lehessen kiegészítőket írni
    • postgresql-python : ugyanez Pythonban
    • postgresql-server : akkor kell, ha nem csak távoli hosthoz kapcsolódunk, hanem helyileg is működtetünk szervert
  • Debian-alapú rendszer esetén mindössze egy parancs a telepítés:
   apt-get install postgresql
  • Természetesen forrásból is telepíthető a szokásos ./configure, make, make install hármassal. A forrás letölthető a http://www.postgresql.org oldalról
  • A szerver elindítása /etc/init.d/postgresql start paranccsal történik. Előfordulhat, hogy a postgresql szó után kötőjelet, majd a verziószámot meg kell adni.

1.1.2 Adminisztratív feladatok ellátása

1.1.2.1 Adatbázis-klaszter létrehozása

  • Először létre kell hozni új adatbázis-klasztert
  • Egy PostgreSQL adatbázis-klaszter adatbázisok gyűjteménye, amelyekért ugyanazon szerver folyamat felel
  • initdb program segítségével tehetjük meg
  • A program a következő műveleteket hajtja végre:
    • Könyvtárak létrehozása, amelyekben az adatbázisok tárolásra kerülnek majd
    • Közös katalógus táblák generálása (ezek a teljes klaszterhez tartoznak)
    • template1 és postgres adatbázisok létrehozása
      • template1 sablon adatbázis, amelynek objektumai automatikusan belekerülnek minden később, újonnan létrehozott adatbázisba. Ilyen módon állíthatunk be telepítés-specifikus beállításokat, alapvető táblákat, felhasználókat stb. amelyek/akik minden adatbázis részei.
      • postgres az alapértelmezett adatbázis mindenki számára
  • Az initdb programot annak a felhasználónak kell lefuttatnia, akié a szerver folyamat is (mivel a szerver folyamat hozzá kell hogy férjen a létrehozott könyvtárakhoz). Ez nem egyezik meg az operációs rendszer rootjával, alapértelmezés szerint egy postgres nevű felhasználó, amely a PostgreSQL telepítésekor jön létre
  • initdb néhány fontosabb kapcsolója:
    • -A, --auth : milyen azonosítása legyen a rendszer (helyi és távoli) felhasználóinak (pg_hba.conf fájlban kerül tárolásra, ahol hba = host-based authentication - a pg_hba.conf fájl tartalmát lásd később). Lehetséges értékei:
      • trust : nincs szükség autentikációra, megbízunk a host felhasználóiban, bárki, aki a szerverhez csatlakozni képes, beléphet. Ilyenkor olyan felhasználónevet ad meg az illető, amilyet szeretne. Természetesen ettől még érvényesek a beállított korlátozások, tehát ha Gipsz Jakab nem a superuser felhasználónevét adja meg, hanem egy mezei felhasználónevet, akkor nem lesznek kitüntetett jogosultságai.
      • md5 : hashelve tároljuk a jelszavakat
      • crypt : titkosított
      • password : plain-text jelszó, távoli eléréshez ilyet ne használjunk
      • lehet ident-alapú is, ami azt jelenti hogy az operációs rendszer részeként kapott ident szervert használja fel a szerver adabázis-felhasználók és operációs-rendszer felhasználók párosításához (ez azonban legtöbbször nem biztonságos, feltételezi hogy a kliens gép nem kompromittált, az RFC-ben is azt írják hogy ne használjuk)
      • PAM (pluggable authentication module)
      • lehet kerberos-szal is, de ilyenkor már telepítéskor meg kell adnunk a kerberos-szerver nevét
    • -D, --pgdata : melyik könyvtárban tároljuk az adatbázis-klasztert. Megadása kötelező
    • -U, --username: mi legyen a superuser neve. Alapesetben a szerverfolyamat tulajdonosának neve, postgres. Meg is változhatható, kényelmi szempontból
    • -W, --pwprompt: az initdb jelszót is bekér a superuser accounthoz
  • Hogy jobban átlássuk az authentikálást, vegyük szemügyre a pg_hba.conf fájl 7 lehetséges rekordtípusát:
   local      database  user  auth-method  [auth-option]
   host       database  user  CIDR-address  auth-method  [auth-option]
   hostssl    database  user  CIDR-address  auth-method  [auth-option]
   hostnossl  database  user  CIDR-address  auth-method  [auth-option]
   host       database  user  IP-address  IP-mask  auth-method  [auth-option]
   hostssl    database  user  IP-address  IP-mask  auth-method  [auth-option]
   hostnossl  database  user  IP-address  IP-mask  auth-method  [auth-option]
  • A mezők jelentése:
    • local: UNIX-domain socketeken keresztül lehet csatlakozni
    • host: TCP/IP kapcsolatok, akár SSL-lel, akár nélküle
    • hostssl: TCP/IP SSL-lel
    • hostnossl: TCP/IP SSL nélkül
    • database: egy vagy több adatbázis neve (vesszőkkel elválasztva), vagy:
      • all: minden adatbázisra illeszkedik
      • sameuser: az adatbázis neve ugyanaz, mint a felhasználó neve
      • samerole: a felhasználó olyan szerepcsoportba kell hogy tartozzon, ami megegyezik az adatbázis nevével
    • user: egy vagy több felhasználó neve (vesszőkkel elválasztva), vagy:
      • all: minden felhasználó
      • +-szal kezdődő név: szerep neve, amelybe több felhasználó is tartozik
    • CIDR-address: CIDR-tartományra illeszkedik. Pl. 172.20.143.89/32 egyetlen host esetén, vagy 172.20.143.89/24 tartomány esetén.
    • IP-address, IP-mask: CIDR-address helyett, csak itt külön oszlopban kell megadni a maszkot
    • auth-method: fentebb ismertetett módszerek
    • auth-option: autentikációs módszerenként változó.
  • Példa:
   # Allow any user on the local system to connect to any database under
   # any database user name using Unix-domain sockets (the default for local
   # connections).
   #
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   local   all         all                               trust
   
   # The same using local loopback TCP/IP connections.
   #
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   host    all         all         127.0.0.1/32          trust     
   
   # The same as the last line but using a separate netmask column
   #
   # TYPE  DATABASE    USER        IP-ADDRESS    IP-MASK             METHOD
   host    all         all         127.0.0.1     255.255.255.255     trust     
   
   # Allow any user from any host with IP address 192.168.93.x to connect
   # to database "postgres" as the same user name that ident reports for
   # the connection (typically the Unix user name).
   # 
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   host    postgres    all         192.168.93.0/24       ident sameuser
   
   # Allow a user from host 192.168.12.10 to connect to database
   # "postgres" if the user's password is correctly supplied.
   # 
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   host    postgres    all         192.168.12.10/32      md5
   
   # In the absence of preceding "host" lines, these two lines will
   # reject all connection from 192.168.54.1 (since that entry will be
   # matched first), but allow Kerberos 5 connections from anywhere else
   # on the Internet.  The zero mask means that no bits of the host IP
   # address are considered so it matches any host.
   # 
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   host    all         all         192.168.54.1/32       reject
   host    all         all         0.0.0.0/0             krb5
   
   # Allow users from 192.168.x.x hosts to connect to any database, if
   # they pass the ident check.  If, for example, ident says the user is
   # "bryanh" and he requests to connect as PostgreSQL user "guest1", the
   # connection is allowed if there is an entry in pg_ident.conf for map
   # "omicron" that says "bryanh" is allowed to connect as "guest1".
   #
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   host    all         all         192.168.0.0/16        ident omicron
   
   # If these are the only three lines for local connections, they will
   # allow local users to connect only to their own databases (databases
   # with the same name as their database user name) except for administrators
   # and members of role "support", who may connect to all databases.  The file
   # $PGDATA/admins contains a list of names of administrators.  Passwords
   # are required in all cases.
   #
   # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
   local   sameuser    all                               md5
   local   all         @admins                           md5
   local   all         +support                          md5
   
   # The last two lines above can be combined into a single line:
   local   all         @admins,+support                  md5
   
   # The database column can also use lists and file names:
   local   db1,db2,@demodbs  all                         md5

1.1.2.2 Felhasználók, adatbázisok létrehozása

  • Kezdetben egyetlen felhasználó létezik, melynek neve postgres.
  • A rendszergazda beléphet az 'su postgres' paranccsal (Ubuntu esetén 'sudo su postgres')
  • Felhasználó létrehozása a 'createuser <username>' paranccsal. Néhány kapcsoló:
    • -s, --superuser: a felhasználó superuser lesz
    • -d, --createdb: a felhasználó hozhat majd létre adatbázisokat
    • -D, --nocreatedb
    • -r, --createrole: a felhasználó hozhat majd létre szerepeket (tehát felhasználókat vagy csoportokat)
    • -R, --nocreaterole
    • -c, --connection-limit: egyszerre hány kapcsolatot létesíthet a felhasználó
    • -P: a parancs kiadása után meg kell adni jelszót
    • -E: a jelszót titkosítva tárolja a szerver
    • -N: jelszó ne legyen titkosítva
  • Felhasználó törlése 'dropuser <username>' paranccsal
  • Adatbázis létrehozása 'createdb <adatbazisnev>' paranccsal. Néhány kapcsoló:
    • -D, --tablespace: tablespace megadása. A tablespace egy könyvtár a file rendszeren, ahová a tablespace-hez tartozó táblák eltárolásra kerülnek. A tablespace-nek van neve, amivel hivatkozni lehet rá (hasznos lehet pl., ha több különböző sebességű lemezünk van)
    • -O, --owner: melyik felhasználó lesz az adatbázis tulajdonosa
    • -T, --template: sablon adatbázis, amely alapján az új adatbázis felépül. Kezdetben két sablon van:
      • template1: ez az alapértelmezett sablon, ha nem adjuk meg a -T kapcsolót, akkor ezt az adatbázist másolja át az új helyére is. Ilyen módon állíthatunk be telepítés-specifikus beállításokat, alapvető táblákat, felhasználókat stb. amelyek/akik minden adatbázis részei.
      • template0: csupasz sablon, ezt az adatbázist soha ne módosítsuk az initdb lefuttatása után (hasznos lesz pl., ha pg_dump segítségével építünk fel újra régebbi adatbázist)
    • -h, --host: melyik hoston fut a szerver. Ha /-jellel kezdődik, akkor Unix-domain socketet adunk meg
    • -p, --port: melyik porton figyel a szerver
    • -U, --username: melyik felhasználóként csatlakozzon alapértelmezés szerint
    • -W, --password: kötelező legyen jelszó megadása
  • Adatbázis törlése 'dropdb <adatbazisnev>' paranccsal
  • Adatbázisba belépni a 'psql <adatbazisnev>' paranccsal lehet
    • Ha nem adjuk meg az adatbazis nevét, akkor a felhasználó alapértelmezett adatbázisába lép be. Ha ilyen nem létezik, hiba. (Itt felhasználó alatt az operációs rendszer felhasználóját értjük.)
    • Ha más felhasználó adatbázisába szeretnénk belépni, mint amelyik be van jelentkezve az operációs rendszerbe (pl. mert más a felhasználónevünk a kettőben - nem kell egyezniük, semmi közük egymáshoz), akkor az -U kapcsolót használhatjuk.
  • A felsorolt programocskák (createuser, dropuser, createdb, dropdb) frontendet jelentenek bizonyos PostreSQL-utasításokhoz. Ugyanezek a műveletek elvégezhetőek tehát PostgreSQL parancssornál is, CREATE ROLE, DROP ROLE, CREATE DATABASE, illetve DROP DATABASE utasításokkal.
  • Felhasználók tekintetében ROLE-okról beszél a PostgreSQL. Egy ROLE egy szerepkör, ami jogosultságokat tartalmaz, és vagy egyetelen felhasználóhoz, vagy pedig felhasználók egy csoportjához van társítva

1.1.2.3 Szerver paramétereinek beállítása

  • Ami egy-egy adatbázis-klaszter paramétereit illeti, megadhatóak az initdb program futtatásakor
  • Ami a szerverre vonatkozó egyéb paramétereket illeti, megadhatjuk őket:
    • Konfigurációs fájlokban
    • PostgreSQL-utasításként, SET parancs segítségével
  • Konfigurációs fájlok:
    • Adatkönyvtárba (data directory) helyezkednek el, amit az initdb program hozott létre
    • config_file: alap konfigurációs fájl
    • hba_file: host-based authentication, hozzáféréseket írja le
    • ident_file: az operációs rendszer felhasználóihoz társít adatbázis-felhasználókat
    • external_pid_file: szerver-adminisztrációs programok számára külső pid-file. Tudjuk, hogy mennyire megbízhatóak versenyhelyzetek tekintetében....
    • Néhány fontosabb környezeti változó:
      • listen_addresses : mely TCP/IP címekről érkezhet kérés
      • port : melyik porton figyeljen a szerver
      • max_connections : alapértelmezés szerint 100
      • authentication-timeout: befejezetlen azonosítási protkollok terminálása
      • ssl: lehet-e ssl-ezni
      • password-encryption: új jelszavak létrehozásánál a jelszavak tiktosítottak legyenek-e
      • shared_buffers: hány darab osztott memóriát alkalmazzon a szerver folyamat. Alapértelmezett memóriaméret 8192 byte, de ez telepítéskor változtatható (BLCKSZ opció)
      • temp_buffers: egy adatbázis kapcsolat hány ideiglenes puffert hozhat létre
      • max_fsm_pages: fsm = free-space-map, térkép arról, hol vannak szabad helyek az adatbázisban


1.1.2.4 Karbantartás

1.1.2.4.1 Monitorozás

Kétféle módszer:

  • Standard UNIX-eszközökkel
   ps auxww | grep ^postgres
  • PostgreSQL statisztika-gyűjtőjével
    • Külön programocska, amely képes:
    • összeszámlálni a táblákhoz való hozzáférések számát (lemez-blokkok, illetve sorok tekintetében is), illetve
    • figyelni, hogy a szerverfolyamatok éppen milyen utasításokat hajtanak végre
    • statisztikák gyűjtésének bekapcsolásához a postgresql.conf fájlban állítsuk be a stats_start_collector paraméter értékét true-ra
    • futás közben ez már nem változtatható (tehát pl. SET paranccsal nem fog menni)
    • további paraméterek segítségével beállítható, hogy milyen jellegű információkat adjon át a szerverfolyamat a statisztikagyűjtőnek:
      • stats_command_string
      • stats_block_level
      • stats_row_level
      • Ezek értékei a postgresql.conf fájlban minden, a klaszterben futó szerverfolyamatra érvényesek, azonban külön szerverfolyamatonként is beállítható SET paranccsal (ezt azonban csak a superuser teheti meg)
      • Alapértelmezett értékük false
  • Sokféle információ kilistázható az egyes folyamatokról, pl:
   SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
   pg_stat_get_backend_activity(s.backendid) AS current_query
   FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
  • Kilistázza az összes aktuálisan futó szerverfolyamat pidjét és a folyamatok által futtatott aktuális parancsokat
  • pg_locks rendszertáblázatból kiolvasható, hogy éppen hány zár van, és mely táblákon az éppen futó session-ben
1.1.2.4.2 Write-ahead logolás

Néhány, a logolást befolyásoló környezeti változó:

  • fsync: bool érték, amely megmondja, Hasznos, de költséges (minden db művelet után flush a lemezre). Több módszer is használható a kiírásra, amelyeket a wal_sync_method paraméterrel állíthatunk be:
    • open_datasync – az open() opciója 0_DSYNC, ilyenkor csak a “rendes” adatok kerülnek szinkronizált átvitelre, a metaadatok nem
    • fdatasync – fdatasync() meghívása minden egyes kommittálás esetén, csak adatot mentünk, metaadatot nem
    • fsync – fsync() meghívása minden egyes kommittálás esetén, minden adatot mentünk
    • fsync_writethrough – ugyanolyan mint az fsync, csak a cache-elt adatok írásakor azonnal az eredeti példányt is frissíti
    • open_sync – az open() opciója 0_SYNC, a metaadatok is szinkronizált átvitelre kerülnek
  • commit_delay: microszekundumokban, hogy egy commit után legkésőbb mikor kell kiírni diszkre az adatokat
  • checkpoint_segments: hány megabyte adat gyűljön össze két checkpoint között
  • checkpoint_timeout: mennyi idő után kell újabb checkpoint
  • archive_command: parancs, amelyet lefuttat a DBMS amikor teleírta az összes lehetséges log file-t. Rendelkezésre áll az %f és %p változó, amelyek az aktuálisan kiírandó fájl nevét illetve elérési útját tartalmazzák. Példa:
   archive_command = 'cp %p /mnt/server/archivedir/”%f”'
1.1.2.4.3 Vacuuming (porszívózás)
  • A VACUUM parancsot időről időre célszerű lefuttatni a következő okok miatt:
    • Frissített vagy törölt sorok által elfoglalt lemezterület felszabadítása (pl. törölt sorokat nem törlünk fizikailag is azonnal, mert egy másik tranzakció még függhet tőle)
    • Adatstatisztikák frissítése, amelyeket pl. a Query Planner használ (az ANALYZE parancs segítségével külön összegyűjthetőek ezek az adatok)
    • Nagyon régi adatokat ne veszítsünk el (különben ha az ún. transaction id wraparound bekövetkezik, ez megtörténhet – transaction id wraparound azt jelenti, hogy túlcsordulás történt a tranzakciók számlálójában, és egy új tranzakció ugyanazt az azonosítót kapja, mint egy régebbi)
  • Kétféle VACUUM parancs létezik:
    • Sima VACUUM – más néven “lusta” vacuum – paranccsal csak megjelöljük a törlendő helyeket, de azok az operációs rendszer számára nem szabadulnak fel.
    • VACUUM FULL parancs segítségével az operációs rendszer visszakapja a lemezterületet, azonban ilyenkor kizárólagos zárral kell rendelkezni a fájl felett.
  • A PostgreSQL 8.1-es verziója óta létezik külön daemon folyamat, amely elvégzi az időszakos porszívózást (autovacuum opció, bool értékkel, a konfigurációs fájlban).
1.1.2.4.4 Arhiválás és visszaállítás

Alapvetően 3 backup technika létezik:

SQL dump – ilyenkor olyan fájlt tárolunk, amely végrehajtható SQL-utasításokat tartalmaz, amelyeket végrehajtva visszakapjuk az adatbázist

  • pg_dump program, amely konzisztens és a másolás közbeni írásokat nem veszi figyelembe a másoláskor:
   pg_dump dbnev > outfile
  • pg_dump utáni restore:
   psql dbnev < infile
  • pipe-okkal is használhatóak, ezért közvetlenül új szerverre is átpakolható az adatbázis:
   pg_dump -h host1 dbnev | psql -h host2 dbnev
  • Ha teljes adatbázis-klasztert szeretnénk backupolni:
   pg_dumpall > outfile
   psql -f infile postgres
  • postgres itt egy adatbazisnev, amellyel elkezdi a visszaállítást; bármilyen létező adatbázis nevét meg lehet adni, de postgres-t szokás, főleg amikor teljesen üres adatbázist töltünk fel

Fájlrendszer-szintű backup

   tar -cf backup.tar /usr/local/data
  • Ilyenkor azonban ideiglenesen le kell állítni az adatbázist

On-line backup

  • Alapötlet: write-ahead-logok folyamatosan eltárolásra kerülnek az adatkönyvtárban (data directory, amelyet az initdb segítségével lehet beállítani). Ezek felhasználhatóak a legfrissebb változások újra-lejátszására, még akkor is, ha nem áll rendelkezésre teljesen konzisztens backup file az adatbázisról. Tehát a két módszert kombinálja.

1.2 MySQL

  • Szintén többfelhasználós, de csak RDBMS, objektumok nincsenek benne
  • Szintén kliens-szerver architektúrájú (a szerverfolyamat neve mysqld)
  • Több operációs rendszert támogat, de ez nem jelent semmit, mert PostgreSQL-t is használhatunk Windowson ha van Cygwin vagy MinGW

1.2.1 Telepítés

  • RedHat esetén rpm csomagkezelővel. Le kell tölteni az összes szükséges csomagot, majd le kell futtatni az 'rpm -ivh mysql-*' parancsot. A következő programcsomagokra lesz szükség:
    • mysql – alapprogramok
    • mysql-devel – alkalmazások fejlesztéséhez és fordításához. A kiszolgáló telepítéséhez feltétlenül szükséges.
    • mysql-server – amennyiben lokális hoston szeretnénk futtatni, és nem távoli szerverhez kapcsolódunk.
  • Debian alapú rendszer esetén mindössze egyetlen parancsot kell kiadnunk:
    • apt-get install mysql-common mysql-server mysql-client
  • Végül lehet forrásból telepíteni a szokások ./configure – make – make install parancsokkal. Erről bővebb információ a http://www.mysql.com címen olvasható.
  • A rendszer indítása a 'mysql -u <felhasznalo> <adatbazis>' paranccsal történik.
  • Ha jelszót is meg szeretnénk adni, akkor a parancs végéhez még hozzá kell fűznünk a -p kapcsolót
  • Kezdetben egyetlen adatbázis létezik, melynek neve 'mysql', és a 'root' felhasználó (semmi köze az operációs rendszer rootjához) jelszó nélkül kapcsolódhat:
   mysql -u root mysql
  • Hasonló SQL-értelmező parancssort kapunk, mint PostgreSQL esetében a psql parancs futtatásakor

1.2.2 Adminisztratív feladatok ellátása

  • Különböző szerver-oldali programok léteznek, amelyek segítségével elvégezhetőek az adminisztratív teendők. Ezek közül hármat emelek ki, egyelőre csak felsorolás szintjén, később lesz róluk bővebben szó:
    • mysqld: maga a szerverfolyamat elindítható ezzel a programmal
    • mysqld_safe: script, amely megpróbálja biztonságos módon elindítani a mysqld szerverfolyamatot.
    • mysqlmanager: futó szerverfolyamat-példányokat felügyeli


1.2.2.1 Kezdeti jelszavak beállítása

  • Legelőször be kell állítanunk valamilyen jelszót a root felhasználónak, hogy illetéktelenek ne léphessenek be a szerverre. Ezt a következő paranccsal tehetjük:
   SET PASSWD FOR 'root'@'localhost' = PASSWORD('szupertitkos_jelszo');
  • Hogy ezt szisztematikus módon megtehessük, érdemes először kilistázni, mely hostokon mely felhasználók léteznek:
   SELECT Host, User FROM mysql.user;
  • Kezdetben létezik egy anonim account is, teljes jogosultságokkal. Ezt célszerű törölnünk:
   DROP USER "";

1.2.2.2 Felhasználói fiókokról

  • MySQL-ben a felhasználói fiókok felhasználónevekhez és hostokhoz van társítva (amely hostokról a felhasználó beléphet)
  • Jelszó is tartozik hozzájuk
  • Egy MySQL felhasználónévnek semmi köze az operációs rendszer felhasználóneveihez, és a jelszavaknak sincs közük egymáshoz
  • A felhasználónév maximális hossza 16.
  • Háromféleképpen adhatunk új felhasználót a rendszerhez:
    • CREATE USER vagy GRANT SQL-parancsokkal:
      • GRANT ALL PRIVILEGES ON *.* TO 'adam'@'localhost' IDENTIFIED BY 'jelszo' WITH GRANT OPTION;
      • localhost helyett írhatunk %-jelet, ilyenkor bármely hostról kapcsolódhat az új felhasználó
    • INSERT, DELETE, illetve UPDATE SQL-parancsokkal pl. a mysql.user táblában (mysql helyett értelemszerűen az aktuális adatbázis nevét írjuk)
      • INSERT INTO mysql.user (Host, User, Password) VALUES ('localhost','user',PASSWORD('titkositott_jelszo'));
    • mysqlmanager nevű program segítségével:
      • mysqlmanager --add-user --username='Bela' --password='jelszo'
  • Az első megoldás biztonságosabb mint a második, kevesebb lehetőség van hibázásra, mint ha explicit módon írogatnánk a táblákba.

1.2.2.3 Szerver Paramétereinek beállítása

  • A PostgreSQL-hez hasonlóan, a MySQL is lehetővé teszi, hogy parancssorból vagy fájlból állítsunk be fontosabb paramétereket a szerver indításakor
  • Dinamikus módon is beállítható legtöbb a SET parancs segítségével
1.2.2.3.1 Parancssorból történő paraméter-beállítás
  • A parancssorból történő beállításra szolgáló egyik program a mysqladmin (ezzel inkább ellenőrizni lehet paramétereket, de néhányat segítségével be is lehet állítani). Meghívása:
    • mysqladmin [opciók] parancs [argumentumok] [parancs [argumentumok]] ...
    • Főbb kapcsolók, amelyekkel befolyásolni lehet a szerver konfigurációját mysqladmin programon kereszül:
      • --compress: kliens és szerver között menő adatok tömörítése
      • --port=port_num: milyen TCP/IP porton figyeljen a szerver a kapcsolódáshoz
      • --protocol={TCP|SOCKET|PIPE|MEMORY}: milyen protokollon keresztül történjen a kapcsolódás
      • --socket=path: localhostról történő kapcsolódás esetén hol legyen a UNIX-domain socket, vagy Windows esetén a névvel rendelkező pipe
      • --ssl* : több parancs, amelyekkel az ssl-lel történő kapcsolódás paraméterei beállíthatóak
      • connect_timeout
      • shutdown_timeout
  • További rendszerszintű paraméterek beállíthatóak:
    • szerver indításakor a mysqld segítségével (ami tulajdonképpen a MySQL szerver programja), vagy
    • konfigurációs fájlok szerkesztésével, illetve
    • korlátozott esetekben a SET parancs segítségével (nagyon-nagyon sok paraméter van, ezért itt a teljesség igénye nélkül sorolok fel néhányat):
      • --init-file : SQL-utasításokat tartalmazó fájl, amelyek a szerver indításakor végrehajtásra kerülnek
      • --init-connect : stringbe tárolt SQL-utasítása, amely minden egyes kapcsolódáskor lefut
      • --join_buffer_size : indexelést nem használó join-műveletekkor használt puffer mérete
      • --max_connections : maximum hány kliens kapcsolódhat egyszerre
      • --max_user_connections : minden egyes felhasználóra érvényes korlát
      • --max_heap_table_size : memória táblák maximális mérete
      • --pid_file
      • --log : minden utasítás logolásának engedélyezése (lásd később, General Query logolásnál)
      • --log_bin : bináris logolás engedélyezése (szintén lásd később)
      • --log_error : error log helye
      • --log_slow_queries : olyan utasítások logolása, amelyek végrehajtása bizonyos időnél tovább tartott
      • --long_query_time : ennek az időnek a beállítása
      • --max_binlog_size : mekkora méret esetén rotáljon a bináris logolásnál
      • --log_output : Qeneral Query log és Slow Query log fájlba, adatbázis táblába, mindkettőbe vagy egyikbe se kerüljön
1.2.2.3.2 Kapcsolódással és autentikációval kapcsolatos paraméterek felhasználónként
  • Az összes egyidejű csatlakozás száma szabályozható a max_user_connections paraméterrel
  • Egyénenként, felhasználónként beállíthatjuk a következő paramétereket:
    • Óránként kiadható SQL-lekérdezések
    • Óránként kiadható SQL-update műveletek
    • Óránként lehetséges kapcsolódások száma
    • Alapértelmezett értékük 0, ilyenkor korlátlan számú hozzáférés történhet
    • Nem alapértelmezett beállítás:
      • GRANT ALL ON customer.* TO 'adambum'@'localhost' IDENTIFIED BY 'jelszo' WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2

1.2.2.4 Karbantartás

1.2.2.4.1 Monitorozás
  • mysqlmanager program segítségével
    • A MySQL ún. Instance Manager programja
    • Minden futó mysqld lehet őrzött vagy nem őrzött (guarded vagy unguarded)
    • Alapértelmezésben minden guarded, ami azt jelenti, hogy ha a szerver valamiért leáll, az Instance Manager újraindítja, ha pedig az Instance Manager kilép, akkor leállítja a szervert is
    • Az Instance Manager távoli karbantartást is lehetővé tesz, mivel egy daemon folyamat, amelyhez szintén lehet portokon kapcsolódni
    • Néhány fontosabb paraméter:
      • --run-as-service: daemonizáljuk a mysqlmanager folyamatot. Hatására elindul egy ún. angyal folyamat (angel process), amely újraindítja a mysqlmanagert, ha leáll (az angyal folyamat olyan egyszerű, hogy leállása nem valószínűsíthető)
      • --bind-address : milyen IP-címet figyeljen
      • --check-password-file : ellenőrizze a jelszó fájl konzisztenciáját
      • --clean-password-file : töröljön ki minden felhasználót, jelszót
      • --log : a mysqlmanager log fájlja. Csak akkor értelmes, ha meg van adva a --run-as-service opció
      • --port : melyik porton figyelje a bejövő kéréseket
      • --socket : unix-domain socket figyelése bejövő kérésekhez
      • --wait-timeout : mennyi idő után zárjon be egy aktivitás nélküli kapcsolatot
1.2.2.4.2 Logolás
1.2.2.4.3 Archiválás, helyreállítás

1.3 Összehasonlítás

A fentiek alapján néhány fontosabb különbség: