Nagy méretű MySQL napi mentése

Sziasztok!

Nem túl rég még elég volt a mentésre egy mysqldump  + rsync távoli szerverre.
Ma már 200GB -s adatbázisok is előfordulnak, ahol 30GB-s táblák is vannak, amit naponta írnak, tehát a szerencsétlen rsync minden nap dolgozik vele.
Van aki dump helyett a /var/lib/mysql mappát menti rsync-kel. Nem sokkal jobb, de legalább a dumpolási erőforrást megspórolta. Ugyanakkor régen ez nem volt ajánlott, mert közben inkonzisztens mentés készülhet. Gondolom ma is így van.

Hogyan érdemes menteni az ilyen elcseszett nagy adatbázisokat, táblákat?

Ötletként jött: LVM snapshot és úgy kimenteni a /var/lib/mysql -t? Biztos jobb, mint snapshot nélkül, de kevésnek érzem. Hogyan lehetne elcsendesíteni a mysql-t, esetleg arra az 1másodpercre minden kiiratni vele, míg a snapshot elkészül? Gondolom így tuti konzisztens lenne a /var/lib/mysql tartalma.
A dumpot azt hiszem elfelejteném már ekkora méretben. Baromi sokat dolgozik naponta ezekkel...és van olyan DB, ami egy bitet nem változott az elmúlt 1 napban.

Ti hogy kezelitek ezt a problémát?

Hozzászólások

Szerkesztve: 2021. 03. 26., p – 20:15

nakivo backup

veeam

MySQL-t nem tudom, de PostgreSQL-nél ez a process dokumentálva van. Konkrétan azt mondják, ha WAL-t is berakod a backupba, akkor nem kell semmi extra, de ha nagyon akarod, akkor egy CHECKPOINT-ot küldj előtte. :)

https://www.postgresql.org/docs/13/backup-file.html

 

Illetve PostgreSQL-nél a WAL archiving is opció lehet, YMMV:

https://www.postgresql.org/docs/13/continuous-archiving.html

Több virtualizációs GUI figyelmeztet arra, hogy LVM snapshot csak pár napig legyen, mert rontja az io-t.
De mi van akkor, ha én csak mentés idejére tartom meg, utána eldobom a snapshotot?
Húztam már újra debiant snapshotolt VM-en, tényleg kegyetlen volt HDD-n. Mindig dolgozott a copy on write, de itt jóformán csak olvasok. Az SQL meg ír amennyit ír, sokat elvileg nem ír azon kis időn, míg lementem. Azzal, hogy rsync-kel csak diffet másolok át, rövid a snapshot élete.

Most megnéztem, egy 50GB-s /var/lib/mysql mappa napi dumpolása, gzippelése 1.5 óra szerveren belül + minden este átmásolás backup szerverre.
Ezt nyers mysql fájl rsynck-kel lehet 10 perc lesz.

Az ilyen mysqldump | bármilyentömörító dologgal vigyázzatok, mert nem lehet ellenőrizni, hogy lefutott-e rendesen a dump. Ha utána visszatérési értéket nézel, az a tömörítő visszatérési értéke lesz, ami boldogan csinál egy 37 bájtos gz-t a nulla bementből 0 return value-val, te meg nyugodtan hátradőlsz hogy jó a mentés.

Ugyanígy nem derül ki, ha pl. csak egy táblát nem tud dumpolni, mert hibás vagy épp nincs hozzá joga. Biztos lehetsz benne, hogy az fog kelleni backupból, és kellemetlen amikor erre akkor jössz rá, amikor vissza kéne állítani.

Szóval, ha rám hallgattok, idő meg IO ide vagy oda, de maradjon két külön lépés a dump és a tömörítés.

"Sose a gép a hülye."

"mert nem lehet ellenőrizni, hogy lefutott-e rendesen a dump. Ha utána visszatérési értéket nézel, az a tömörítő visszatérési értéke lesz"

Ahogy azt anno az egyik mesterem mondogatta, azt is lehet rosszul csinálni.

Pl. ha muszáj, akkor named pipe-al is meg lehet oldani, vagy mysqldump blabblabla || touch "${ErrorFile}" | gzip amitetszik || jajjagzip , és utána megnézni, hogy van-e file, ott, ahol nem kéne hogy legyen.

Szóval visszatérési értéket igenis lehet ellenőrizni. Ez persze nem jelenti azt, hogy a dump jó (még a 0-s érték se, szerintem), csak azt, hogy nagyon valószínű, hogy használható. Ezért kell egyrészt rendszeres ellenőrzés, hogy tényleg visszaállítható-e a mentés (ez még automatizálható is), illetve nem csak a legutolsó dumpokat megőrizni, hanem amennyit lehet (plusz hozzá a többit, a deltákat).

Az mitől jobb, mint az LVM snapshot?

a) FS szintű a snapshot, annak minden előnyével és hátrányával (pl. egy alkönyvtárra is meg tudod csinálni)
b) van hozzá rsync-szerű funkció, amivel át lehet tolni hálózaton keresztül (zfs send/receive)

mi a garancia arra, hogy minden ki van írva diszkre, amikor én snapshotolok?

Hát az adatbáziskezelő a garancia. Az, amire azt mondták, hogy COMMIT, és az adatbáziskezelő visszaszólt, hogy OK, annak diszken kell lennie, és egy áramszünet után is az adatbázisban meg kell találjad az eredményt. Az, amire nem mondták, hogy COMMIT, az nem lehet kint részlegesen az adatbázisban, abból a tranzakcióból mindent rollbackelnie kell egy áramszünet esetén. Az a tranzakció, amire már kiment a COMMIT, de még nem szólt vissza az adatbáziskezelő, hogy kész, az vagy komplett meg kell legyen, vagy teljesen rollbackelődnie kell.

Ez egy normális tranzakcionális adatbáziskezelő működése.

Ha az alkalmazás maga bumburnyák, és több tranzakcióban akar változtatást csinálni, és összeszarja magát, ha az egyik tranzakció kikerül a diszkre, egy másik meg nem, akkor az az alkalmazás konkrétan alkalmatlan megbízható módon történő üzemeltetésre. Gyakorlatilag egy áramszünet is be tud tenni neki. A "de tegyél szünetmentest a gép alá" c. tévtanokat hirdetőket az ilyen szoftverek íróival együtt kell a máglyára küldeni.

A külön volume az LVM-nél fix allokálással megy. Azaz dedikálnod kell a vg diszkterületéből valamekkora kapacitást az lv-nek.

A ZFS-nél a szabad kapacitás az egész poolra nézve közös, abból tudnak használni az egyes könyvtárak, fájlrendszerek. Amit éppen nem használ az egyik, azt a másik is elhasználhatja.

Magyarul ez olyan, mintha az LVM lv mindig tele lenne, és amikor törölsz, akkor shrinkel a device-on, és a vg visszakapja a helyet, ha pedig betelne, akkor gyorsan allokál az lv méretéhez a vg szabad kapacitásából.

Ezek miatt míg az LVM-nél nem akarsz mindent külön lv-re rakni, addig a ZFS esetén megteheted, mert "semmibe nem kerül", hogy akár pl. egy home könyvtár esetén minden egyes felhasználó külön "fájlrendszer" legyen. És akkor tudsz külön snapshotolni, tudsz send/receive-vel szinkronizálni, stb.

> A külön volume az LVM-nél fix allokálással megy. Azaz dedikálnod kell a vg diszkterületéből valamekkora kapacitást az lv-nek.

> Magyarul ez olyan, mintha az LVM lv mindig tele lenne, és amikor törölsz, akkor shrinkel a device-on, és a vg visszakapja a helyet, ha pedig betelne, akkor gyorsan allokál az lv méretéhez a vg szabad kapacitásából.

En is hasznalok zfs-t.

> Ezek miatt míg az LVM-nél nem akarsz mindent külön lv-re rakni, addig a ZFS esetén megteheted, mert "semmibe nem kerül", hogy akár pl. egy home könyvtár esetén minden egyes felhasználó külön "fájlrendszer" legyen. És akkor tudsz külön snapshotolni, tudsz send/receive-vel szinkronizálni, stb.

 

Szoval dirt nem, csak datasetet/volume-ot lehet snapshotolni. Viszont a mukodesi elvebol adodoan teljesen mas a user hozzaallasa is, ld. fent, ahogy leirtad.

Ha ezt igy irod le elsore, akkor sokkal tobb ertelme van, sot helyet is.

Csak ugy egy (random) konyvtart nem lehet snapshotolni, mint ahogy a commentet sejtette.

Lazán kapcsolódik ide, de hátha hasznos/ötlet adó lehet:

Találtam "Proxmox VM snapshot alapú mentés" témában keresgetve egy kis script-et, ami a Qemu agent-en keresztül futtatható mentés előtt/után (Proxmox-ban automatikusan történik, ha jól van beállítva), és MySQL-nél segít a lehető legjobb konzisztencia eléárésében.

Qemu MySQL flush/freeze script

# Flush MySQL tables to the disk before the filesystem is frozen.
# At the same time, this keeps a read lock in order to avoid write accesses
# from the other clients until the filesystem is thawed. 

Érdemes kipróbálni a Proxmox Backup Server-t, én már használom éles környezetben. Egészen elképesztő a tudása.

Senkinek nincs köze világod belsejéhez, neked sincs közöd mások életéhez, csak az Irgalom útján van közöd, Istenektől rendelt kötelességed.

Én is javaslom a PBS-t aki Proxmox-ot használ!

Nagyon jól működik a deduplikáció benne, és a megőrzési idők is remekül szabályozhatók. A fenti script is (természetesen) működik vele, mert a PBS is a Proxmox eddig beépített backup-ját használja "forrásnak".

Mondjuk arra még nem jöttem rá, hogy felhős tárhelyre (mondjuk Backblaze B2-be) hogyan lehetne hatákonyan 3. backup-ot csinálni belőle (a milliónyi könyvtár és állomány miatt, eddig meg sem próbáltam), de legalább a PBS replikáció használható addig is offsite példány létrehozására.

en kicsit atirtam a forrast, hogy a 64k subdir helyett csak 256-ot hasznal (/XXXX/XXX.... -> /XX/XXXXX ), igy nem fosik be az ext ha belepek a .chunks konyvtarba. lehetne futtatni egy instacet, ahol a datastore egy fuse/akarmi mountolt B2 (ha lehet ilyet), vagy lehet folyamatosan felsyncelgetni a datastore konyvtarat.

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Köszi, ez ígéretes. Ennek 2012-es elődje az imént szembejött: https://github.com/qemu/qemu/blob/master/scripts/qemu-guest-agent/fsfre…

A benne lévő megoldást linkelték fentebb: https://dev.mysql.com/doc/mysql-backup-excerpt/8.0/en/backup-methods.ht…

Making Backups Using a File System Snapshot

If you are using a Veritas file system, you can make a backup like this:

  1. From a client program, execute FLUSH TABLES WITH READ LOCK.

  2. From another shell, execute mount vxfs snapshot.

  3. From the first client, execute UNLOCK TABLES.

  4. Copy files from the snapshot.

  5. Unmount the snapshot.

 

Úgy tűnik MySQL-nél ez a csendesítés.

Csináltam egy gyors tesztet, kiadtam az FLUSH TABLES WITH READ LOCK parancsot, módosítottam egy cella tartalmat és frissült a tábla fájl dátuma a diszken.
Néztem MyISAM és InnoDB táblán is, ugyanúgy változott a fájl dátuma, pedig a netes leírások szerint írásra lockolja globálisan az adatbázist.
Félreértettem a működést vagy a teszt környezet szivat és ennek tényleg működnie kellene?

Szerkesztve: 2021. 03. 26., p – 20:28

(Off: mintha Oracle esetén lenne valami 'írást felfüggeszteni, menteni akarok' funkció... BS2000-ben használtuk, a COPY parancsot a FILE LINK=DMCOPY11,SHARUPD=WEAK opcióval kombinálva ilyenkor le lehetett másolni az adatbázis DBF fájlját.

Szerk: ilyesmi


ALTER TABLESPACE name BEGIN BACKUP;
<mentés>
ALTER TABLESPACE name END BACKUP;
)

Sávszélesség függvénye:

ssh -n keresztűl menne egyből a dump a mentőszerverre.

Esetleg gzip -pel csomagolni közben ha kicsi a sávszél.

Szerkesztve: 2021. 03. 26., p – 20:37

Master-Slave online replikációval mennek az adatok egy másik szerverre.

Ott akár leállíthatod a szervert majd mented fáj alapon,
vagy LOCK a táblára és mented a dump-ot. Majd UNLOCK és folytatódik a replikáció ahol abbamaradt.

Ez a megoldás nem terheli a "rendes" SQL szervert mentéskor. A master-hez nem nyulsz mentéssel közvetlenül.

"és van olyan DB, ami egy bitet nem változott az elmúlt 1 napban."

rmezei gyalogmegoldas, hogy van egy teljes dumpod, es csak az azota megvaltozott tablakat mented.

tegyuk fel 25 -en volt mentes, akkor ez megmondja mi valtozott azota :

SELECT table_schema,table_name FROM information_schema.tables WHERE (ENGINE = 'MyISAM' AND update_time > '2021-03-25') OR ENGINE = 'InnoDB';

 

szepen vegigmesz a listan, szetbontod db / tablara es kidumpolod.

mondjuk ez az innodbre sajna nemmukodik, de azt nemmodtad, mi az engine :D

HUP te Zsiga !

par10 evvel ezelott is inkabb dumpoltam az sql adatbazist, minthogy fileonkent mentsem :D

na jo. a clipper / dbase -t nem. de en btrieve -n nottem fel, aminek mar akkor volt tranzakciokezelese, amikor a mysql még a tervezesi fazisban letezett.

es ha valamit, akkor a btrieve -t menteni igazan kezenfekvonek tunhetett file alapon menteni, megis inkabb butil alapon nyomtam azt is.

HUP te Zsiga !

Nem feltétlenül az ördögtől való a dump mentése. Ami eszembe jut, az a tipikus wordpresshosting, csillió db, aminek a felében a "Hello Wordpress!" vagy mifene van csak. Nekem egyszerűbbnek tűnik egy scriptecskével sorban dumpolni őket (meg helytakarékosabbnak is).

Aztán a helyi sajátosságoktól és/vagy igényektől függően ez vagy jó, vagy nem :)

Az LVM snapshotnál nincs garancia a konzisztens SQL mentésre. Értem, hogy sokaknál "eddig működött" és nekem is van ilyen plusz backupon, de nincsenek illuzióim, hogy mennyire lesz jó. Az rsync még rosszabb lehet, mert nemhogy "félig" kiírt file-okat vihet át, de még az induláskori állapothoz képest nem lesznek a táblák egységesek.

Ekkora méretnél nemcsak a backupnál, hanem az adatmennyiségen is próbálnék faragtatni. Lehet ez a mezők típusának optimalizálása, archiv adatok egyéb táblákba mozgatása, sőt esetleg teljes archiválása. Ettől mindíg felsikítanak, hogy "dehát ezt nem lehet, minden szuperfontos". Ekkor kell felvázolni, hogy semmi gond, akkor kell egy erős szerver (SSD az SQL-nek és vmi nagydiszkes dolog a tárolásnak) amire megy a replikáció és azon lehet mentést készíteni, akár ahogy fentebb javasolták, hogy leállított replikációval. Ekkora file méretnél már a backup tömörítése sem opció így a diszkgyártók is boldogok lesznek. :) Majd kell valamilyen offsite/offline megoldás egy további példánynak. Ettől a pénzügyes résznek szoktak keresztbeállni a szemei, és majd lefocizzák... :)

Az érdekes az lesz, hogy ennyi adatról hogy csináltok visszaállítást, meg tesztet róla? Legalább 1x, amikor megvan a logika mögötte, akkor azért kellene valami teszt szerintem, meg utána sem árt valszin. Már csak azért is tesztelni kéne, hogy pl. adatbázis optimalizációra rá lehessen mondani, hogy igen, N perccel kisebb lesz a downtime, hogy ha beüt a cucc, és ezzel legyenek tisztában.

Ezt már egyszer lefutottuk és akkor sem voltam meggyőzhető. :)

A diszk snapshot nem fogja tudni, hogy a bármilyen SQL szerver éppen hogyan és mennyire írta ki oda a kis dolgait, ha filerendszer szinten még törekszik is a konzisztenciára, az SQL process aktuális lelki állapotát nem fogja tudni egy LVM snapshot.

"A diszk snapshot nem fogja tudni, hogy a bármilyen SQL szerver éppen hogyan és mennyire írta ki oda a kis dolgait, "

Ezért gondoltam valami SQL csendesítő megoldásra. Fél füllel hallottam olyat, hogy ha VM-t snapshotolunk pl. VMware rendszerben, akkor az agent képes elcsendesíteni az adatbázist a konzisztencia megőrzése érdekében.
Aztán hogy ez külön script hozzadását igényli vagy az egész csak urban legend, nem tudom :)

Ez nagyon fél fül volt. Rászól hogy "most akkor ne diszkezz?" :) A VMWare agenttel tud queisce nevűt, amivel elvileg filerendszer szinten tudsz konzistens lenni, például a Veeam támogatja. Hogy ez adott SQL motorral mennyire integrált az más kérdés, de szerintem app szintű mentési opció van a Veeam-ben és akkor megoldja jól valszin.

éppen hogyan és mennyire írta ki oda a kis dolgait,

Az áramszünet sem tudja. Az a mondás, hogy ha az áramszünetet sem éli túl a rendszered, akkor ott alapszintű gondok vannak, amit nem kéne online mentéssel tetézni.

Ha az áramszünet túlélését alapfunkciónak tekintjük, akkor viszont a snapshot (ha az összes adatbázisterületre egyszerre történik) is menni fog.

A diszkre kiírt SQL adatnak konzisztensnek kell lennie, egyébként mit sem ér a DB motor. Így egy bármilyen snapshot is konzisztens kell legyen.
Olyan nem lehet normális esetben(értsd: jól megírt adatbázis kezelő motor), hogy egy COMMIT után a DB visszajelez, hogy kész, de az adat még nincs kiírva a diszkre, csak memória gyorstárban van meg (így elveszik áramszünet esetén vagy nem kerül a mentésbe pl.).

Az elcsendesítés úgy lehet érdekes szerintem, hogy addig amíg a snapshot elkészül, ne kerüljön új adat az adatbázisba, és akkor tényleg a mentés indításakori állapot lesz mentve, és a mentés indítása után beleírt adatok a következő mentésbe kerülnek.

Olyan nem lehet normális esetben(értsd: jól megírt adatbázis kezelő motor), hogy egy COMMIT után a DB visszajelez, hogy kész, de az adat még nincs kiírva a diszkre, csak memória gyorstárban van meg (így elveszik áramszünet esetén vagy nem kerül a mentésbe pl.).

Hát pedig de, az FS számára atomikus művelet nem atomikus a DB motor számára. Ha a fájlrendszer nem támogatja a két fázisú commit műveletét (márpedig a AS/400-on kívül ez nem nagyon létezik), akkor nem tudsz például úgy kettő fájlba írni, hogy vagy mind a kettő kiíródjon vagy egyik sem. Itt lehet egy darabig trükközni, hogy egy commitlog fájlba íródik a DB művelet, de amikor szét kell szálazni több tábla esetén több fájlra és indexre és minden lótüdőre, akkor nem tudod garantálni.

Nade nem erre van MySQL-nél a binlog? Ott csak egy állományba kell FS által visszajelzett módon kiíródnia tutira a DB COMMIT-nak a sikerhez és a DB szintű konzisztenciához, és ha ez megvan, akkor a tényleges DB állományokba egy összeomlás után a binlog-ból pótolni lehet az esetlegesen hiányzó részeket (amik csak a binlog-ba kerültek be végül a megállás/snapshot előtt).

Sajnos MySQL-nél komolyabb (értsd: rendes, igazi) SQL szerverekkel nincsenek tapasztalataim, olyanok nem kellenek a munkámhoz, azokhoz semennyire sem értek. De feltételezem a megbízhatóságuk csak jobb lehet.

Nade nem erre van MySQL-nél a binlog? Ott csak egy állományba kell FS által visszajelzett módon kiíródnia tutira a DB COMMIT-nak a sikerhez és a DB szintű konzisztenciához, és ha ez megvan, akkor a tényleges DB állományokba egy összeomlás után a binlog-ból pótolni lehet az esetlegesen hiányzó részeket (amik csak a binlog-ba kerültek be végül a megállás/snapshot előtt).

Hát, ezt most úgy mondod, mintha nem lenne tele a net azzal, hogy megdöglött a DB, mert valami váratlan újraindulás után nem tudja felolvasni a saját adatait. Az FS nem támogatja a 2 phase commit-ot, ezért csodát nem kell várni. Ha eddig nem volt ebből bajod, akkor szimplán szerencséd van és/vagy nem volt még szarráterhelt DB a kezeid között.

Sajnos MySQL-nél komolyabb (értsd: rendes, igazi) SQL szerverekkel nincsenek tapasztalataim, olyanok nem kellenek a munkámhoz, azokhoz semennyire sem értek. De feltételezem a megbízhatóságuk csak jobb lehet.

Mindegyik alá szünetmentest ajánlanak és ha váratlan hiba van, akkor benne van a pakliban, hogy sérül az integritás, tehát cluster + mentés a minimum.

Ha eddig nem volt ebből bajod, akkor szimplán szerencséd van és/vagy nem volt még szarráterhelt DB a kezeid között.

Szerencsére nem. Ilyen téren amivel dolgom volt, az aránylag kis terhelésű weblaphoz tartozó DB és számlázó programhoz tartozó DB (mondjuk azon a szar kliens program miatt aránylag nagy volt a terhelés, de nem óriási). Remélem még egy darabig kitartok ilyen megállás nélkül :-)

Mindegyik alá szünetmentest ajánlanak és ha váratlan hiba van, akkor benne van a pakliban, hogy sérül az integritás, tehát cluster + mentés a minimum.

Hát, a szerverek amikkel dolgozok mind biztosítottak ilyen áramellátási és alapvető napi dump-os mentés téren, de pont mostanában nézelődök ilyen replikáció/cluster vonalon, hogy növeljem (remélhetőleg) a rendelkezésre állást és az ilyen hibás elkerülésének esélyét.

akkor nem tudsz például úgy kettő fájlba írni, hogy vagy mind a kettő kiíródjon vagy egyik sem

De erre nincs is szükség. Arra van szükség, hogy tudjon olyan a rendszer, hogy adott A írás és B írás között szigorú sorrendiség legyen, azaz ha a B kikerült a diszkre, akkor az A is ott legyen már, tehát a 2 írás 4 lehetséges kimenetele közül a "B igen - A nem" kombináció ne fordulhasson elő. Ezt tudja biztosíttani a Linux. Az utána majd a recovery mechanizmus feladata lesz, hogy a félig kiírt tranzakciókat visszapörgesse.

De erre nincs is szükség. Arra van szükség, hogy tudjon olyan a rendszer, hogy adott A írás és B írás között szigorú sorrendiség legyen, azaz ha a B kikerült a diszkre, akkor az A is ott legyen már, tehát a 2 írás 4 lehetséges kimenetele közül a "B igen - A nem" kombináció ne fordulhasson elő. Ezt tudja biztosíttani a Linux.

Ezek azok a trükkök, amelyek nem mindig működnek és akkor jön az, hogy "és mentés van?". Főleg, ha szükséges némi teljesítmény is, mert mindig megvárni mindent, amit kiír az FS, az nem túl gyors.

Te mekkora összegben mersz fogadni arra, hogy fogunk egy MySQL-t maximum közelébe terheljük tranzakciókkal és száz hirtelen power off után száz esetben el is tud elindulni hiba és adatvesztés nélkül?

Könyvet kellene írnod a témából és milliomos lennél, tehát a scenario az, hogy írunk tranzakcióval x táblába azzal a tps-el, ami épp kifér a hardverből és kirántjuk a tápot a gép alól. Aztán megnézzük, hogy konzisztens lesz-e az adatbázis és elindul-e. Ilyesmire gondoltál?

Te mekkora összegben mersz fogadni arra, hogy fogunk egy MySQL-t maximum közelébe terheljük tranzakciókkal és száz hirtelen power off után száz esetben el is tud elindulni hiba és adatvesztés nélkül?

Mondjuk ebben ott a hiba, hogy amint eléri először a terhelési maximum (közeli) állapotot, akkor kellene bővíteni, átalakítani, stb. Amiatt viszont teljesen jogos a kérdés, hogy amíg nem áll így meg egy rendszer, addig ezt az átdolgozást a legtöbb helyen nem csinálják meg...

Meg úgy általában a DB alrendszert nem a terheléshez kellene méretezni már a megvalósítás előtt (ami remélhetőleg ki van számolva, alaposan meg van [túl]becsülve)? De nyilván itt is elcsúszok, mert a kisebbnek induló projekteknél "bőven bírni fogja" az alap, aztán mikor nő a projekt volumene (vagy alapból alulméretezett rendszer mégsem bírja bőven a tesztfázist sem), akkor nem a DB masszírozás az első, amihez nyúlnak bővüléskor.

"Mondjuk ebben ott a hiba, hogy amint eléri először a terhelési maximum (közeli) állapotot, akkor kellene bővíteni, átalakítani, stb"

Miért is? Tipikus példa, napközben lekérdezésekkel terhelve "nincs" terhelés, de este/reggel, amikor rágörgetik a valamit, az insertek miatt csak úgy lángol a szerencsétlen. De van két óra rátolni, és végez mittomén, 30 perc alatt. A számok légből kapottak, a szituáció nem. Sőt, hasonló, de havi egyszeri, valami adóbigyó, tizedét nem értettem hogy mit magyaráznak, csak azt, hogy holnap mennie kell. Ment :)

Hát, az a tulaj pechje, hogy ilyen hektikus terhelése van. De attól még nem szerencsés bármikor is a határra húzni, mert úgy is lesz olyan, hogy az már pont kevés, vagy a határon már nem stabil a működés. Szerintem minden rendszerben kell lennie valamennyi biztonsági tartaléknak az addig megismert maximális terheléshez mérten. Aztán ha növekszik az addig megismert maximális terhelés, utána kell menni a biztonsági tartalékkal is.

Az, hogy ez költséges? Hát ja. De már az költséges, hogy sokat nem csinál semmit, aztán 100% load-ot okoz a terhelés. Ahhoz képest már nem olyan nagy költség plusz, hogy sokat nem csinál semmit, és aztán ugyan az a terhelés 80% load-ot okoz. A sokat nem csinál semmit ezekben a drága, nem az, hogy 100% vagy 80% a terhelése a hardvernek az adott feladat során.

Mondjuk ebben ott a hiba, hogy amint eléri először a terhelési maximum (közeli) állapotot, akkor kellene bővíteni, átalakítani, stb.

Miért is? Hogy feküdjön benne a pénz? Azért van a hardver, hogy dolgozzon.

Meg úgy általában a DB alrendszert nem a terheléshez kellene méretezni már a megvalósítás előtt (ami remélhetőleg ki van számolva, alaposan meg van [túl]becsülve)?

Úgy kell méretezni, hogy mindig maximumon izzadjon a vas, az egész ki van fizetve, nem? Ne finomkodjunk már, hogy jajj, 10 százalék fölé ment a terhelés...

Úgy kell méretezni, hogy mindig maximumon izzadjon a vas, az egész ki van fizetve, nem? Ne finomkodjunk már, hogy jajj, 10 százalék fölé ment a terhelés...

Erre csak azt tudom visszakérdezni, hogy ha egy feladathoz kell 4 ember, és ezek végigdolgozott 8 órával oldják meg amit kell: 8-kor kezdhetik és legkésőbb 16-ig kész kell legyen, akkor mi van, ha egyikük megbetegszik*?

Ha lenne rá 5 ember (túltervezés, biztonsági tartalék), akkor 1 megbetegedése esetén a másik 4 még pont meg tudná oldani a feladtot az elvárt időben. Amikor meg mind bent vannak, akkor fejenként 80%-on mennek. Elég magas a kihaszbnáltság, de van a rendszerben tartalék.

* nem vagyok ilyen negatív alapból, hanem azért nem szabira megy, mert akkor rávágjátok, hogy akkor nem engedjük szabira :-)

Erre csak azt tudom visszakérdezni, hogy ha egy feladathoz kell 4 ember, és ezek végigdolgozott 8 órával oldják meg amit kell: 8-kor kezdhetik és legkésőbb 16-ig kész kell legyen, akkor mi van, ha egyikük megbetegszik*?

Bérelsz munkaerőt, szerverek esetén azért ez nem annyira nehéz dolog. Kérdezem másképp: ha órabérben fizeted az alvállalkozókat, mit szeretnél látni: a napi kiszámlázott 8 órából egy órát dolgozik vagy mind a 8 óráját ledolgozza? Kevesen mondanák erre, hogy persze, elég, ha egy órát dolgozik, de fizetjük mind a nyolcat. Na, ugyanez van szervereknél is.

Az alvállalkozós hasonlatod a cpu-ra fizetett cloud esetén áll meg, a saját vas az a saját dolgozóval van pariban.

Azért szólt az első mondat bérelt munkaerőről. Ez egy üzleti döntés, hogy például a karácsonyi nagy hajtás miatt kell-e fizetni egy éven át 100 dolgozót, amikor az év maradék 11 hónapjában 5 embernek van csak munkája. Azért veszünk vasat, hogy ki legyen használva, nem azért, hogy 0 és 10 százalék között rezegjen a terhelés és 10 százalék felett már idegeskedjünk, hogy mi ez a terhelés.

és száz hirtelen power off után száz esetben el is tud elindulni hiba és adatvesztés nélkül?

Az Oracle százból százszor adatvesztés nélkül el fog indulni. Been there, done that. Játszottam vele eleget (meg HA clusterekkel).

MySQL-t nem használtam még kritikus rendszer alatt. De ha az Oracle-t meg lehet írni (és véletlenül sem mondom, hogy az egy jó sw, de ezt legalább tudja), akkor a MySQL-t sem lehetetlen.

és akkor jön az, hogy "és mentés van?"

Ha egy enterprise felhasználónak úgy akarnál eladni egy HA failover Oracle RDBMS-t, hogy bármilyen hw esemény után reálisan tud jönni az "és mentés van" c. kérdés, akkor nagyon rövid életű lesz az a projekt. Ezért a szolgáltatásért ugyanis senki nem fizetné ki egy HA cluster felárát a szingli masinához képest, és azért előbb-utóbb kiderülne a dolog.

Főleg, ha szükséges némi teljesítmény is, mert mindig megvárni mindent, amit kiír az FS, az nem túl gyors.

Hát ez ebben a tudomány, hogy nem mindent kell kiírni. Csak annyit, amennyi feltételenül szükséges a konzisztenciához.

Az Oracle százból százszor adatvesztés nélkül el fog indulni. Been there, done that. Játszottam vele eleget (meg HA clusterekkel).

Én láttam már corrupted database címszóval nem indulni, még jó, hogy voltak többen a grid-ben, ez akkor nem történt meg?

Ha egy enterprise felhasználónak úgy akarnál eladni egy HA failover Oracle RDBMS-t, hogy bármilyen hw esemény után reálisan tud jönni az "és mentés van" c. kérdés, akkor nagyon rövid életű lesz az a projekt. Ezért a szolgáltatásért ugyanis senki nem fizetné ki egy HA cluster felárát a szingli masinához képest, és azért előbb-utóbb kiderülne a dolog.

A HA és a több node pont arról szól, hogy ha egy node letérdel, akkor tarkón lőjük és beteszünk helyette egy új node-ot, nem gyógyítgatjuk. De nem innen indultunk, hanem onnan, hogy meg tud-e dögleni egy node vagy egy önálló egyszem adatbázis, ha inkonzisztens lesz az FS valamilyen okból.

Hát ez ebben a tudomány, hogy nem mindent kell kiírni. Csak annyit, amennyi feltételenül szükséges a konzisztenciához.

Aham.

Én láttam már corrupted database címszóval nem indulni, még jó, hogy voltak többen a grid-ben, ez akkor nem történt meg?

Hát azt én nem tudhatom, hogy nálad mi volt szar. De ebben a felállásban azért több ponton is el lehet ezt rontani.

A HA és a több node pont arról szól, hogy ha egy node letérdel, akkor tarkón lőjük és beteszünk helyette egy új node-ot

A "HA failover cluster" egy iparági standard kifejezés a HACMP/SunCluster/ServiceGuard-féle failover technológiákra, amiknél egy darab (shared diszkes) adatbázisterület van, azt (logikus módon) egyszerre egy node tudja használni, ha azzal történik valami, akkor a diszket elvesszük tőle, odaadjuk egy másik gépnek, és ha időközben az adatterület megsérült, akkor a szolgáltatás nem tud többet elindulni. Amiről beszélsz, az nem ez.

Hát azt én nem tudhatom, hogy nálad mi volt szar. De ebben a felállásban azért több ponton is el lehet ezt rontani.

Ami elromolhat, az el is romlik.

A "HA failover cluster" egy iparági standard kifejezés a HACMP/SunCluster/ServiceGuard-féle failover technológiákra, amiknél egy darab (shared diszkes) adatbázisterület van, azt (logikus módon) egyszerre egy node tudja használni, ha azzal történik valami, akkor a diszket elvesszük tőle, odaadjuk egy másik gépnek, és ha időközben az adatterület megsérült, akkor a szolgáltatás nem tud többet elindulni. Amiről beszélsz, az nem ez.

Bocsánat, de lófaszt, a "HA failover cluster" kifejezés egy igencsak bő halmaz sok változatos megoldással, innen nézve be vagy ragadva Sun mocsárba... példának okáért egy Oracle RAC extended cluster grid vagy data guard gird egyáltalán nem ilyen topológiájú. Szóval igen, nem erről beszélek.

De ennek amúgy nincs köze ahhoz, hogy ha van egy darab DB, egy darab FS, mindez egy darab fizikai vason, akkor megmarad-e az integritása az egész kuplerájnak, ha dob egy hátast valami. A tapasztalat az, hogy az esetek egy részében ilyenkor corrupted database az eredmény.

Ha egy enterprise felhasználónak úgy akarnál eladni egy HA failover Oracle RDBMS-t, hogy bármilyen hw esemény után reálisan tud jönni az "és mentés van" c. kérdés, akkor nagyon rövid életű lesz az a projekt. Ezért a szolgáltatásért ugyanis senki nem fizetné ki egy HA cluster felárát a szingli masinához képest, és azért előbb-utóbb kiderülne a dolog.

Kicsit elkanyarodunk az eredeti témától, de itt meg kell jegyezzem, hogy akinek az OVH SBG2-ben futott a "HA failover Oracle RDBMS" rendszere, az szerintem megkérdezte, hogy "és mentés van?". A mentés az nem az elérhetőséget növeli (mint a HA megoldások), hanem az adatvesztést próbálja megelőzni. Szerintem.

"Te mekkora összegben mersz fogadni arra, hogy fogunk egy MySQL-t maximum közelébe terheljük tranzakciókkal és száz hirtelen power off után száz esetben el is tud elindulni hiba és adatvesztés nélkül?"

Őszintén szólva kíváncsi lettem. Bármit el tudok képzelni, és az ellenkezőjét is. Pár nap és szabadságon leszek, ha el nem felejtem, kipróbálom :D

Ezt eléggé erősen cáfolnám. Lényegében az összes normális adatbáziskezelő ez alapján a garancia alapján működik, hogy ha a kliens megkapta a sikeres commitról a visszajelzést, akkor az bármilyen reboot után is ott lesz (feltételezve, hogy maga a filerendszer is "normális", naplózott alatta). Ugyanis csak egyetlen file-ba kell kiírni a megváltozott adatokat, a tranzakciós napló file-ba, és azt kell flush-olni a háttértárig. A tényleges adatfile-okba akár percekkel később is ráér kiírni az adatbázis-kezelő, addig a memóriában lévő buffer pool-ból van kiszolgálva az adott része az adatfile-oknak. Váratlan reboot esetén a tranzakciós naplóból lesz felolvasva, hogy a már commitolt, de adatfile-ba nem teljesen beírt tranzakciók esetén mit kell még kiírni az adatfile-okba (ahogy említetted, "szétálazni"), és amikor ez a recovery befejeződik, akkor lesz újra használható az adatbázis. Ez egy működő és implementált algoritmus több esetben is, a tranzakcionális adatbázis-kezelők egyik alapvetése:

https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html

https://docs.microsoft.com/en-us/sql/relational-databases/logs/the-tran…

https://docs.oracle.com/cd/B28359_01/server.111/b28310/onlineredo001.ht…

 

By the way, függetlenül az adatbázisos témakörtől, létezik egy viszonylag elterjed oprendszer, ami támogatja több file atomi módon történő írását:

https://docs.microsoft.com/en-us/windows/win32/fileio/transactional-ntf…

(Az már kérdés, hogy vélhetően nem sok program használja ezt, és már deprecatednek jelöli a Microsoft, de Windows Vista óta létezik és használható)

A tipikus megoldás: binlog (archivelog az Oracle-nél, gondolom kb. minden hasonló tartalmaz ilyet) bekapcsolása.

Ilyenkor bátran lehet menteni akár snapshottal is.

Visszaállításkor természetesen inkonzisztens lesz, de a binlog/archivelog/stb-ből el tudja tekerni a DB-t egy konzisztens állapotig.

Ezeket a kósza emlékek alapján írom, érdemes azért utánaolvasni, de csodák nincsenek.

Igen, a másik lehetőség, hogy a replikált szervert menteni, ez olyankor szoktuk, amikor eleve terhelt a DB, és nem szeretné, ha kínoznánk a sok-sok archivelog mentéssel.

Ha kevés a delta, akkor bőven lehet megoldás a heti egy dump (ha az belefér), és hétközben a deltákat menteni.

A másik tipikus kérdés ami ilyenkor fel szokott merülni, hogy oké, de milyen gyorsan kell visszaállni mondjuk ha kidől a storage? Mert az is keresztülhúzhat pár számítást, ha kiderül, hogy van rá két perc.

Milyen esetben? Az eredeti kiírásban nem szerepelt ilyesmi.

Aztán ugye, a slave (vagy hogy hívják mostanában) db-nek tudnia kell mindazt, amit a masternek, mármint performanciában. Erőltetettem ugyan, de ki tudok találni olyan dolgokat, amikor ez nem biztos hogy megoldás, pl. hogy a slave "messze" van, nem tudná kitolni a szükséges teljesítményt, de offsite replilának még jó, amiről lehet offsite mentést csinálni.

De amúgy igen, ha ilyen rövid idő van, akkor valami hasonló kell, csak ugye az effélének ára is van, amikor kiderül, hogy mennyi az annyi, akkor hirtelen nem is kell már annyira, jó lesz az egy óra alatt is.

"de ugye felteteleztuk hogy standalone mysql szerver"

Igen, a legtöbb esetben ezek standalone szerverek, sok féle weblaphoz, projekthez, java-s vackokhoz, ahol -ahogy fentebb is írtátok- minden nagyon fontos, a fejlesztő nincs már sehol, át kellene tervezni az adatbázist, de majd az új projekt ezt is megoldja, az meg 5 évet csúszik.
Addig pedig menteni kell, jól, hatékonyan.
A replikára gondoltam, 1-2 kiemelt szerver esetén hajlok rá, de minden mellé tuti nem lesz oda állítva egy slave.

Tulajdonképpen csak az a kérdés, hogy mennyi kiesést visel el az adott alkalmazás/DB. Ha ez megvan, akkor lehet hozzá választani mentési/helyreállítási módszert.

Lehet pl. lenne értelme konszolidálni a sok standalone DB-t egy helyre, és azt jól redundánssá tenni.. Persze az is lehet, hogy ez "lehetetlen", szóval csak egy ötlet.

Nem én vagyok a döntéshozó, de ha engem kérdeznek azt mondanám, hogy a bekövetkezési valószínűség csekély, de nem nulla, tehát kell a jó backup. A több órás kiesést pedig 10 évente 1x ki lehet bírni.

A közös adatbázis gondolata korábban felmerült, de van 1-2 annyira elcseszett adatbázis, hogy rommá terhelik a rászánt vasat. Az indexek hiánya az egyik, ezt üzemeltetőként még pótoljuk, de a feleslegesen bonyolult lekérdezéseket nem orvosolhatjuk az üzleti logikában. Szóval az ilyen fekete bárányokat távol tartjuk a normálisaktól. Az igaz, hogy központosítva, 3 különböző besorolású SQL szerverrel le lehetne fedni (jó, közép gáz, nagyon gáz:) )

Jelenleg viszont elosztott, főleg több független cég illetve projekt van, ahol az összemosás nem lehetséges, szóval 3-nál több lenne így is az eredmény,
Így első körben standalone szerverekre szorítkozok.

"Igen, a legtöbb esetben ezek standalone szerverek, sok féle weblaphoz, projekthez, java-s vackokhoz, ahol -ahogy fentebb is írtátok- minden nagyon fontos, a fejlesztő nincs már sehol, át"

vs.

"A több órás kiesést pedig 10 évente 1x ki lehet bírni."

Kicsit költői kérdés: én élek egy párhuzamos valóságban hogy azt gondolom: az igényekek és a megvalósított rendszer köszönőviszonyban sincs egymással.

Dobálózik mindenki a 7x24-gyel, a sokévente max néhány órás leállással miközben egy standalone szerverről beszélünk, amihez még egy normális backup sincs.

Igazából szerintem sok esetben nincs szükség a sok kilencesre, csak szeretnek rágörcsölni a döntéshozók, pénzt aztán meg nem tesznek bele. Ahol tényleg kell, ott HA van web és sql szinten is.

A nagyon fontossal erre utaltam: https://hup.hu/comment/2609834#comment-2609834
"Lehet ez a mezők típusának optimalizálása, archiv adatok egyéb táblákba mozgatása, sőt esetleg teljes archiválása. Ettől mindíg felsikítanak, hogy "dehát ezt nem lehet, minden szuperfontos"."

Itt is ugyanez a szitu: nem lehet archiválni a táblákat, az éles adattal gördítjük magunk előtt a sok éves multat. Emiatt a nagy tábla minden nap egy picit íródik, minden nap teljesen le kell menteni, dumpolni, tömöríteni.

"amihez még egy normális backup sincs."

Ha a topik indító problémára gondolsz, igazából van, ismereim szerint teljesen konzisztens: mysqldump, csak bazi sok erőforrást eszik és hatékonyabbat keresek :)
Erre most kaptam pár ötletet, amiken szépen végigmegyek.

update: a standalone szerver hallatán nehogy valaki 1db fizikai vasra gondoljon. Jellemzően ezek inkább kisebb-nagyobb virtuális gépek, alatta pedig most mindegy milyen több node-os, esetleg HA klaszterezett rendszer van. A linux, a MySQL fut stabilan szépen. A napi mentést kellene ésszerűbbé tenni.

azt most nem tudom hogy ha sok standalone szerver van 1 slave tud-e mindegyikhez csatlakozni es replikalni, - attol most tekintsunk el hogy adatbazis nev utkozesek lehetnek azt elotte fel kell oldani, es a "binlog-ignore-db = mysql"-t beallitani, - de ha nem meg mindig lehet 1 szerveren standalone mysql-enkent 1-1 dockerben futtatott slave szerintem.

neked aztan fura humorod van...

Tegyük fel van 2 nagy szervered és 8 kicsi apróbb. Nem tudom lehet-e, de én arra hajolnék, hogy 1 db slave-t üzemeltessek, vagy 1 db slave szervert több mysql slave-el, ahogy épp kényelmesebb és megoldható. 
Ilyenkor 1 szerverre amin online replikáció is van mindig megvannak az adatok. Ha távol van, akkor tűz esetén is. Ezt a slave szervert pedig lehetne időnként menteni. 
Nem tartom kizártnak, hogy a csillivilli mentős megoldások is valami ilyet használnak a háttérben. Csak ott megveszed egy kattingatós felülettel esetleg.
A folyamatos replikáció miatt nem burst jellegű lesz a terhelés a master szervereken, hanem eloszlik időben, mint ahogy használják amugy is. A slave szerver mentésekor pedig nem érdekel majd a terhelése és az sem, hogy mennyi idő alatt fut le. Megállíthatod a tranzlakciókat, majd mentesz 1001 féle módon, ahogy épp tetszik. Így egy összefüggő többtáblás adatbázis is konzisztens maradhat.

"1 db slave szervert több mysql slave-el"

Jó ötletet dobtál be, ezzen korábban gondolkoztam. Úgy tűnik van ilyen: https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html
Ezt kipróbálom, mert 1 slave belefér cégenként/projektenként....bár az adatbázis név duplikálást meg kell oldani valahogy. Az elnevezés felett nincs kontrollom minden esetben.

Úgy értettem, ahogy x-daemon is javasolta. Tehát egy gépen futtatsz több mysql service-t más adatkönyvtárral stb... vagy valami konténeres megoldással. Így biztosan elkülönülve lennének, viszont mint gép csak 1-et kellene kezelned. Pl. gépen belül indíthatnál backup scripteket, megszólítva az egyes mysql service-ket. A mentett adatokat könnyebb lenne egy helyen kezelned. 

kiprobaltam csinalni kell mondjuk a /etc/mysql/conf.d/-be mysqld1.cnf-t ahol a szekcio neve

[mysqld1]

ott meg kell adni masik pid fajlt, socketet, datadirt, portot, log file-t

az uj datadirbe en atmasoltam az ujonnan letrehozott mysql fajlokat a /var/lib/mysql-bol (leallitott mysql mellett)

es a mysqld_multi start 1-el elindul

neked aztan fura humorod van...

innodb_flush_log_at_trx_commit

Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant).

1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3.

És ezt beállítod mentés (bocs, snapshot:) előtt:

SET GLOBAL innodb_flush_log_at_trx_commit=1;

írták fent a lvm snapshotot, zfs snapshotot, percona xtrabackup-ot...

én a zfs snapshotot ajánlom, használjuk nagyobb db-re (700-800GB tábla is van).

szerintem a lvm meg az xtrabackup elég IO igényes...

a zfs pedig megdefragmentálódik, ez azt jelenti, hogy hdd-n egy idő után nagyon be tud lassulni.

de ssd-n megy :)

úgyhogy  ¯\_(ツ)_/¯

Eleg sokminden szoba kerult itt, megprobalok nem csak "lattam en mar karon varjut" alapon valaszolni. Felmerult az LVM snapshot, zfs snapshot, es az xtrabackup. Ahhoz, hogy lehessen tudni, hogy mi a kulonbseg, azt kell tudni, hogy hogy mukodik az iras MySQL + InnoDB eseten. Hosszu hozzaszolas kovetkezik :). Ez meg mindig eleg leegyszerusitett dolog lesz.

Beerkezik egy iras egy tablara (tegyuk fel, hogy az egyszeruseg kedveert ez egy UPDATE, ami egy int field-et allit 4-rol 6-ra), a tablan van PRIMARY KEY es egy secondary index. Azt is tegyuk fel hogy ez autocommit modban tortent, tehat rogton a COMMIT muvelet is megtortenik. Ekkor eloszor a valtoztatasok bekerulnek az innodb log bufferbe, ahonnan bekerulnek az innodb transaction logjaiba (mas neven, mas engine-ben redo log, ib_logfile innodb-nel). Ami bekerul ide az egy ugynevezett redo log record. Ebben van egy LSN (log sequence number), change type (milyen valtoza tortenik), page number (melyik page-en tortenik a valtozas), es change on page, tehat maga a valtozas. Ezt ugy kell elkepzelni, hogy pl a 123-mas page-en a 3456. byte-tol megvaltozik 4 byte erre a 4 byte-ra. Azt, hogy a log bufferbol hogy kerulnek adatok a redo logba, az innodb_flush_log_at_trx_commit hatarozza meg. MySQL esetben az 1 jelenti azt, hogy minden commitnal kiirja, es fsync-et is hiv. Ahogy banyek mondja, ezt sokan atallitjak, ilyenkor a MySQL nem teljesiti a D azaz durability kritertiumot az ACID kriteriumok kozul, de az iras sokkal gyorsabb lesz, ha nem minden COMMIT eseten, csak pl masodpercenkent kerulnek a valtozasok az ib_logfile-ba.

Ott tartunk, hogy iras utan megvan a redo log rekord. A redo log (vagy transaction log) viszont fix meretu, elobb-utobb ki kell irni belole a valtoztatasokat a vegleges helyre. Az InnoDB alapesetben 16K-s page-eken tarolja a rekordokat. A redo log irason kivul szinkron muvelet meg az, hogyha nincsenek ezek a page-ek a buffer pool-ban (ez egy in-process page cache InnoDB-nel), akkor behuzza oket (ez szinkron olvasas lesz). Ha mar ott vannak, akkor megvaltoztatja a tartalmukat a redo log rekordnak megfeleloen, es innentol kezdve memoriabol szolgalja ki a MySQL az adatokat, ezt jol irta valaki. Mivel van egy primary key es egy secondary index, ezert a valtoztatas 1 vagy 2 page-et fog erinteni attol fuggoen, hogy az adott field benne van e a secondary indexben. Az egyszeruseg kedveert valtozzon csak 1 page.

Az adat ekkor biztonsagban van: egy crash esetben megvan az eredeti page, es hozza megvan a redo log rekord, amibol visszaallithato az uj adat. Ekkor a commit visszater, es a felhasznalo szamara szinkron resz befejezodik, az adott page a buffer pool-ban dirty lesz. A page-ek header-jeben ott van, hogy melyik LSN-re nezve konzitensek, ez alapjan a kesobbi valtoztatasokat a recovery folyamat ra fogja gorgetni a redo logokbol. Ez is bonyolultabb ennel, mert mas engine-ekhez hasonloan az innodb write ahead logging-ot hasznal, tehat a roll forward utan az undo logot is hasznalni kell roll back-re, de most egyszerusitsuk le.

Innentol kezdve amit irok az teljesen a hatterben tortenik, aszinrkon a felhasznaloi irasokhoz kepest. elobb vagy utobb, ki kell irni a dirty page-et disk-re. Ennek tobb oka lehet: lehet fogy a buffer pool, es kell a hely masnak, lehet hogy annyira a vegen van a redo logoknak, hogy nemsokara kirotalodik, es ki kell irni. Arrol, hogy ez a dontes mi alapjan szuletik meg, hogy egy page-et ki kell e irni vagy nem egy masik hasonloan hosszu vagy hosszabb hozzaszolast is tudnek irni. De, tegyuk fel, hogy a dontes megszuletett, es ki kell irni a page-et a diskre. Ez az ugynevezett checkpointing process vegzi (ezt a legtobb adatbazis engine-ben ugyanigy hivjak).

Mivel az InnoDB 16k-s page-ekkel dolgozik, 16K-t irni pedig nem atomi, ezert nem lehet csak ugy a vegleges helyere irni a page-et. Ekkor elofordulhatna az, hogy pl csak 8k van belole kiirva, es jon az aramszunet, ekkor a felig megirt valtozatbol es az eredetin levo valtoztatasokbol nem lehet az adatot visszaallitani. Ezert van a shared tablespace-ben egy doublewrite buffer nevu terulet, ami fixen 128 page. Amikor a checkpointing process irja az adatbazist, eloszor a doublewrite buffert fogja irni, utana pedig a vegleges filet.

Ekkor az adat ismet biztonsagban van:
- Ha a doublewrite buffer irasa alatt lesz aramszunet, az adat visszaallithato a redo log rekordbol es az eredeti page-bol. 
- Ha a page irasa kozben van aramszunet, akkor az uj page megvan a doublewrite bufferben.

Ha az iras sikeres, akkor a page allapota a buffer pool-ban clean lesz.

Ezert aramszunet esetben mindig megvan az adat, barhanybol barhanyszor. Ez hasonloan igaz a legtobb adatbazis, engine-re, ha valaki azt mondja magarol, hogy teljesiti az ACID-bol a D-t, arra ez igaz. Ami kulonbseg lehet a MySQL-hez kepest, hogy sok engine sokkal kesobb vezette be a partial page logging-ot. Regebbi engine-eknel a redo logokba teljes page-ek kerultek, latszik az int update-es peldabol hogy az miert nem hatekony. Kis kitero, hogy a postgres partial logging implementacioja pl kifejezetten tetszik, ok azt csinaljak, hogy a doublewrite buffer helyett szamon tartjak, hogy az adott page-bol van e full verzio a redo logban, es ha van, akkor csak a valtoztatasokat irjak ki.

Volt meg par dolog ami feljott, pl a binlogok. A binlogok mysql server szintjen vannak, tehat logikai valtoztatasokat tartalmaznak. Replikaciohoz, point in time recoveryhez lehet oket hasznalni, majdnem fuggetlenek a fenti mechanizmustol. Azert majdnem, mert ha a binlogokkal egyutt szeretnenk durabilityt, akkor a sync_binlog opciora is szukseg van. Ekkor a binlog irasa resze lesz az InnoDB tranzakcional (erre a MySQL belul XA-t es 2 phase commitot hasznal, hogy szinkronizalja a server es a storage engine szintu valtoztatasokat).

Volt kerdes, hogy akkor hogy lehet megis korrupt az adatbazis. Volt is olyan valasz, hogy ha jo a hardver, akkor nem lesz az, de nem mindig jo a hardver. Lattunk pl olyat, hogy a raid controller elkezdett hulyeseget irni a diskre, es azert crashelt a MySQL, meg a redo log rekord checksumja nem volt megfelelo. Ilyenkor segithet a force recovery, ami a legmagasabb szinten kb azt csinalja, hogy figyelmen kivul hagyja a redo logokat. Ennek a hasznalata vegso eset kell legyen, mert adatvesztessel jar, lehet olyan MySQL HA megoldast epiteni, ami nem veszit adatot full cluster leallas esetben sem (semisync replikacio, xtradb cluster vagy barmi galera alapu).
Olyat is lattunk mar, hogy InnoDB page compressiont hasznaltak, es egy zlib bug miatt a compressed page lett korrupt. Ha aramszunet miatt ilyen problema lep fel, az vagy hardver hiba, vagy bug valahol a stackben, semmikeppen nem normalis. Sokszor latom sajnos, hogy crash-eket nem vizsgalnak meg, nem ertik, hogy mi tortenik, hanem ratudnak hogy ez ilyen. Ilyenkor a debugolas (illetve annak a kepessegenek) a hianya a problema.

Szinten feljott a ZFS es a ZFS snapshotokbol mentes. A ZFS nagy elonye, ha MySQL-t futtat az ember rajta, hogy az IO atomi. A ZFS iraskor mindig egy uj verziojat irja a blokknak, es az iras vegen egy pointert atir atomi modon az uj verziora. Ezert olyan "olcsok" a zfs snapshotok, mert csak nem kell torolni a regi verziot (a ZFS snapshotoknak torleskor van koltseguk). Igy ZFS-en pl ki lehet kapcsolni a doublewrite buffert nyugodtan. Sokan egyebkent is kikapcsoljak, mert nem ertik, hogy mit csinal, es azt latjak, hogy gyorsabb tole az adatbazis, majd meglepodnek, hogy korrupt lesz.

Barmilyen snapshot alapu mentesnel semmit nem kell csinalni az adatbazissal, hogy a durability kriteriumot teljesitse. Amiert megis szoktak az az, hogy a mentessel konziszens binary log pozicio is meglegyen point in time recovery-hez. Ezt el lehet erni egy FLUSH TABLES WITH READ LOCK majd SHOW MASTER STATUS parancsokkal. Itt sokan azt hiszik, hogy a FLUSH TABLES WITH READ LOCK miatt nem irodik az adatbazis, ezert crash recovery sem kell majd, ha abbol a snapshotbol indit egy uj instance-ot az ember. Ez azonban nincs igy, hiszen az csak logikai szinten allitja meg az irasokat (nem jon be az UPDATE), a checkpointing a hatterben ugyanugy zajlik. Ha crash recovery mentes snapshotot szeretnenk azt is lehet, csak akkor FLUSH TABLES WITH READ LOCK alatt arrol is meg kell gyozodni, hogy nincs dirty page.

Az xtrabackuprol igertem meg, hogy irok (ha valaki eddig elolvasta, es erdekesnek talalta, irja be egy hozzaszolasba, hogy fapapucs, hogy tudjam, hogy erdemes volt ezt megirni :) ). Az xtrabackup elinditas utan az eloterben elkezdi streamelni a redo logokat. Tehat mielott barmit csinalna, elkezdi lementeni a valtoztatasokat, es meglesz neki mind. Ezutan ugy, hogy kozben az adatbazis mukodik, elkezdi lemasolni a page-eket. Tegyuk fel, hogy az xtrabackup reggel 7-tol 8-ig dolgozik. A mentes eleje a 7 orasi allapot lesz, a vege a 8 orasi, a kozepe meg valahol kozte. Ekkor jon a --apply-log lepes, ami pont a crash recovery folyamatot fogja vegigcsinalni az igy lementett page-eken. Tehat fogja az elso page-et, megnezi az LSN-t, es megnezi a streamelt redo logokban az azon a page-en levo valtoztatasokat, majd ezt megcsinalja az osszessel. A valosagban ez annyival bonyolultabb, hogy tobbet nez egyszerre, ezert ha tobb memoriat adunk az apply-log-nak jelentosen gyorsithato a folyamar. Igy az --apply-log utan a teljes visszaallitott adatbazis a 8 orasi allapotot fogja tukrozni. Ezert szeretik az emberek uj slave instance-ok beallitasahoz hasznalni, hiaba tart orakig a mentes, mivel az uj adatbazis allapota a mentes vegi allapot lesz, nem kell sokat "behozni" ahhoz, hogy a replika up to date legyen.

Ha snapshot alapon mentunk, akkor viszont a kezdeti allapotot. Szo volt az xtrabackup IO igenyerol, ez attol fugg, hogy el kell e "vinni" a mentest a geprol. Ha el kell, akkor az xtrabackup es a zfs send fogja a legkevesebb IO-t hasznalni, hiszen ott a masolason kivul minimalis plusz IO lesz (ZFS-nel a torles, xtrabackupnal pedig  redo log masolasa). Ha LVM snapshot van, ott van a snapshot masolasanak az IO-ja plusz ami a copy on write-bol jon. Amiert azt szoktak mondani, hogy az xtrabackup IO igenyes az az, hogy "sajnos" gyors, ezert ki tudja haszalni a meglevo IO kapacitast. Erre vannak beepitett throttling mechanizmusok is (hany io muvletetet hasznalhat), illetve ha streaming modban hasznalja az ember (--stream=xbstream, a legtobben igy hasznaljak), akkor pv-vel vagy throttle-lel is remekul lehet szabalyozni, hogy milyen gyorsan mentsen.

A topicnyitonak: az xtrabackup egy az egyben megoldas a problemadra. 

Ez megint lehetne nagyon hosszu, de megprobalom roviden :).

A rovid valasz a kerdesre az, hogy attol fugg, a mentesi strategia kialakitasanal figyelembe veszed milyen RTO/RPO-ra van szukseg, megnezed melyik modszer mit tud, es ez alapjan szuletik meg a dontes idealis esetben.

A mantrakban en nem hiszek. Alapvetoen fizikai es logikai mentest tudsz csinalni, mind a kettonek vannak elonyei es hatranyai. A fizikai mentesnel eleg a file-okat visszamasolnod a helyere, es elinditani az adatbazis instance-ot. A logikainal ujraepited az indexeket 0-rol. Ennek van elonye is, pl egy xtrabackup nem fog elkapni egy page corruption-t, csak ha van a page-hez tartozo valtozas a redo logban. Egy logikai mentes el fog. A menteseket ellenorizni is szokas. Sok helyen csinaljak azt, hogy a fizikai menteseket ellenorzeskor logikai mentesse konvertaljak, es azt is elteszik (nyilvan ezt nem mindegyik mentessel csinaljak meg koltsegtakarekossagi okokbol). 
Nagyon sok helyen a legfontosabb a legujabb adat. Egy megfelelo logikai mentesnel, lehet "idorendi sorrendben visszafele" is visszaallitani, es kozben az instance elerheto tud lenni, amig egy fizikai mentesnel meg kell varni a teljes visszaallitast. 

200 GB korul valoszinu siman xtrabackup a nyero, bar nem tartom kizartnak hogy van olyan adatbazis, ahol a logikai mentes jobb ilyenkor. Ezert szerintem jobb a mantrak helyett az, ha megertjuk a problemat, megertjuk az opciokat, es abbol valasztunk. 9-10 TB-s adatbazisokat nem ritkan latok, de lattam mar 40 TB felett is az xtrabackup ott is mukodik. 

Erdemes megnezni a facebook talkjait arrol, hogy hogy mentenek mysqlt https://www.percona.com/live/19/sessions/mysql-backup-and-restore-at-fa… es https://www.percona.com/live/18/sites/default/files/slides/The_Evolutio…, ok pl logikai mentest hasznalnak, el is mondjak ebben, hogy miert, erdemes megnezni, hogy gyozodnek meg arrol, hogy jok a menteseik, ez nagyon fontos, es resze kell hogy legyen a backup strategianak.

A nagyobb adatbazisok jellemzoen fizikai mentest hasznalnak (kivetelek mindig vannak, lasd facebook), es jellemzoen xtrabackup-ot.

Alapvetoen 2 dolog all a rendelkezesedre:
- Maguk a mentesek
- A binlogok

A binlogok segitsegevel lehet "idoben elore menni" a fizikai menteshez kepest, a binlog viszont rekord/tranzakcio granularitasu ami nem mindig jo ha gyors visszaallitast szeretnenk. Tegyuk fel, hogy a fizikai mentes 10 oras (marmint a kora, tehat 10 oranyi binlogot kell meg ragorgetni az utolso allapothoz), az adott rekord irodhat tobb ezerszer/szazezerszer is, a binlogokban ez mind benne lesz. 

Az xtrabackup ezert a 2 szint koze rak egy harmadikat az inkrementalis fizikai mentes formajaban. Ennek egy LSN-t kell megadni, es csak azokat a page-eket fogja lementeni (milyen jo, hogy ezt mar kifejtettem az elozo hozzaszolasban, es itt nem kell :) ), amik megvaltoztak azota az LSN ota, viszont ehhez minden page-et el kell olvasni. A Percona Serverben van page change tracking https://www.percona.com/doc/percona-server/8.0/management/changed_page_…
, amivel csak azokat a page-eket fogja csak elolvasni, amiket el kell.

Remelem segitettem, az a baj, hogy errol nagyon sokat tudnek beszelni meg irni :).
 

Köszönöm!

Én meg sokat tudnék kérdezni, de emészteni kell!

Azt gondolom mysql -ből nincsenek ilyen izmos adatbázisaim, marad a dump.

~15 éve: Oracle archiver log üzemmódban és nem volt dump - nem is derült ki, hogy blokk hibás a DB csak a könyvelés(Áfabevallás) zárásakor.

Hozzácsaptam az exportot a logban pedig kerestem a "CORRUPT" kifejezést ellenőrzés gyanánt.

A mérete és a használata nem indokolta ezt a fajta üzemmódot.

köszönjük a részletes leírást... 

nekem az volt a tapasztalatom az xtrabackup-pal, hogy nem egy kiforrott valami...

napi full backuppal kezdte, majd óránkénti inkrementális backupot csinált...

elég nagy loadot rakott a szerverre és valahányszor szükség volt egy backup visszaállítására (ok, megnézni az akkori adatot), folyton kellett piszkálni, crash-selt, próbálgatni a különböző verziókat, stb. soha nem ment simán

A nem mukodik resz akkor volt regen jellemzo, ha nem a megfelelo mysql verziohoz tartozo xtrabackup volt hasznalva (--ibbackup parameterrel lehet allitani), illetve ha valamiert az auto-detection nem mukodott jol, es nem tudta kitalalni melyik kell. Amiota az perl wrapper ki lett dobva ez rengeteget fejlodott.

Az orankent inkrementalis backup orankent vegigolvassa a teljes adatabazist, ha nincs a page change tracking bekapcsolva, az varhato, hogy nagy terhelest csinal. Ilyen oras/oran beluli dolgokra mar binlogokat szoktak hasznalni.

Nem tudok nalad/nalatok mi lehetett a baj, vagy hogy mikor volt ez, de nagyon sokan hasznalnak xtrabackupot nagyon nagy meretekben, az elmult kb 9 evben szinte (90% felett) azt hasznaltak kicsit is nagyobb adatbazisokra.

Ha van valami konkret hibauzeneted ranezek en is szivesen.

Csinalsz egy primary-secondary (regebben master-slave) replikaciot, majd a replikaciobol csinalsz dumpot. :) 

Error: nmcli terminated by signal Félbeszakítás (2)

Én Arcserve UPD-t használok nagyméretű MySQL mentésére. A DB egy zabbix adatbázis SSD-n, gigabiten, napi 60GB körüli növekménnyel vagyis historyval amit trenddé számol át. A DB mérete MySQL szerint kb 900GB, de a lemezen sajnos több, évek óta megy tökéletesen és stabilan és nem csak a DB van mentve, hanem az egész rendszer így könnyű diasterre is felkészülni, mert BMR restore is lehetséges azonnal.

Egyetlen dolog amire figyelni kell, az a / vagy a /tmp szabad területének mennyisége,m ert amíg fut a backup, addig az összes írási művelet egy kernel drive segítségével egy ideiglenes állományba van írva ami ha megtölti a /-ot akkor törlődik és nem történik semmi, de a mentés megszakad. Az eljárás érdekes, nagyon stabil és biztos is.

Azért én a mentés átmeneti területét nem a rootvg-ben tartanám, hanem valami olyan helyen, ami ha telemegy, akkor legfeljebb a mentést "viheti magával", mert azért egy telerottyantott / vagy /tmp másra is kifejezetten negatív hatással tud lenni.

Igen, lehet is paraméterezni, hogy mol legyen, így máris bárhova csatolható. Elég érdekes és trükkös, így csak támogatott distriken működik (Red Hat és rokonai, SUSE család, Debian, Ubuntu) amiknél az aktuális kernel verzióhoz automatikusan beszerzi a gyártótól a modul. Igen automata a dolog