Categories
Database Backup

** Discover why mysqldump fails large MySQL databases and learn how to implement enterprise-grade physical backups using Percona XtraBackup and CloudSave to drastically reduce your RTO.

Že desetletja je mysqldump nepogrešljiv švicarski nož za varnostno kopiranje baz podatkov MySQL. Je vseprisoten, preprost in vnaprej nameščen v vsaki distribuciji MySQL in MariaDB. Za majhne do srednje velike baze podatkov deluje odlično.

Vendar pa se z rastjo organizacij in ko nabori podatkov presežejo meje 100 GB, 500 GB ali več terabajtov, zanašanje na mysqldump preide iz najboljše prakse v kritično arhitekturno ranljivost. Če ste skrbnik baz podatkov (DBA) ali DevOps inženir, ki upravlja obsežne produkcijske baze, ste verjetno že izkusili tihe napake, poslabšanje delovanja produkcije in nesprejemljive ciljne čase okrevanja (RTO), povezane z logičnimi izvozi.

V tem članku bomo razčlenili arhitekturne omejitve orodja mysqldump, raziskali, zakaj pri velikih obremenitvah odpove, in podrobno opisali, kako implementirati fizične strategije varnostnega kopiranja na ravni podjetja za zaščito vaših kritičnih podatkov.

Arhitekturne omejitve orodja mysqldump

Da bi razumeli, zakaj mysqldump pri velikem obsegu odpove, moramo preučiti, kako deluje v ozadju. mysqldump izvaja logične varnostne kopije. Poizveduje po pogonu baze podatkov, bere podatke in jih prevaja v niz SQL stavkov (predvsem CREATE TABLE in INSERT INTO).

Čeprav to ustvari zelo prenosljivo in človeško berljivo datoteko, v okoljih z visokim pretokom podatkov povzroča resna ozka grla.

1. Ozko grlo enojne niti

mysqldump je zasnovan kot operacija z eno nitjo. Obdeluje eno tabelo naenkrat, vrstico po vrstico. Medtem ko se sodobna strojna oprema ponaša z desetinami procesorskih jeder in NVMe shrambami, ki zmorejo gigabajte pretoka na sekundo, mysqldump izkoristi le delček teh virov.

Tudi pri uporabi standardnih zastavic za tabele InnoDB:

mysqldump -u root -p --single-transaction --routines --triggers --events --quick production_db > backup.sql

Zastavica --quick prisili mysqldump, da pridobiva vrstice eno po eno, namesto da bi celotno tabelo shranil v pomnilnik, kar preprečuje napake pomanjkanja pomnilnika (OOM) na strani odjemalca. Vendar pa narava enojne niti pomeni, da lahko izvoz 500 GB baze podatkov traja od 10 do 15 ur, kar resno vpliva na vaš ciljni časovni okvir obnovitve (RPO).

2. Onesnaženje medpomnilnika InnoDB (Buffer Pool)

Ko mysqldump prebere vsako vrstico vsake tabele, prisili pogon MySQL, da te podatke naloži s diska v medpomnilnik InnoDB. V produkcijskem okolju je vaš medpomnilnik skrbno napolnjen z vašimi “vročimi” delovnimi podatki.

Ogromen logični izvoz bo izpraznil medpomnilnik in izrinil pogosto dostopane indekse ter podatkovne strani, da bi naredil prostor za hladne podatke, ki se varnostno kopirajo. To povzroči nenaden, ogromen skok v I/O diska, saj so produkcijske poizvedbe prisiljene brati z diska, kar vodi do resnih zakasnitev aplikacije.

3. Zaklepanje metapodatkov in konflikti DDL

Za ohranjanje doslednosti se skrbniki baz zanašajo na zastavico --single-transaction, ki nastavi raven izolacije transakcij na REPEATABLE READ in začne transakcijo pred izvozom podatkov.

Čeprav se s tem izognemo zaklepanju branja na ravni tabele (FLUSH TABLES WITH READ LOCK), to ne ščiti pred spremembami jezika za definicijo podatkov (DDL). Če se med izvajanjem mysqldump na tabeli izvede ukaz ALTER TABLE, DROP TABLE ali TRUNCATE TABLE, se bo varnostno kopiranje sesulo z napako table definition has changed, please retry transaction. V CI/CD okoljih s pogostimi migracijami shem to povzroča nenehne napake pri varnostnem kopiranju.

4. Nočna mora RTO: Časi obnovitve

Najbolj katastrofalna napaka orodja mysqldump se ne pokaže med varnostnim kopiranjem, temveč med obnovitvijo.

Obnovitev logičnega izvoza zahteva, da pogon MySQL razčleni in izvede milijone INSERT stavkov. Za vsako vstavljeno vrstico mora MySQL:
* Preveriti omejitve (tuji ključi, unikatni ključi).
* Sprotno obnoviti sekundarne indekse.
* Pisati v dnevnik InnoDB redo.
* Izprazniti v binlog (če je omogočen).

Obnovitev 1 TB baze podatkov iz logičnega izvoza lahko traja več dni. Če ima vaše podjetje RTO 4 ure, vam mysqldump zagotavlja, da boste kršili svoj sporazum o ravni storitev (SLA).

Alternative na ravni podjetja: Prehod na fizične varnostne kopije

Za doseganje hitrih varnostnih kopij in obnovitev za velike nize podatkov morate opustiti logične varnostne kopije v korist fizičnih varnostnih kopij.

Fizične varnostne kopije popolnoma zaobidejo pogon za izvajanje SQL v MySQL. Namesto tega kopirajo osnovne binarne podatkovne datoteke (datoteke .ibd, dnevnike redo in dnevnike undo) neposredno iz datotečnega sistema. Ker gre le za kopiranje datotek, lahko delujejo pri največji hitrosti sekvenčnega branja/pisanja vaše strojne opreme in jih je mogoče močno paralelizirati.

Percona XtraBackup: Industrijski standard

Za pogona InnoDB in XtraDB je Percona XtraBackup vrhunsko odprtokodno orodje za fizično varnostno kopiranje. Izvaja vroče, neblokirajoče varnostne kopije baz podatkov MySQL.

Kako deluje XtraBackup

  1. Kopiranje podatkov: XtraBackup začne kopirati podatkovne datoteke InnoDB (.ibd).
  2. Sledenje dnevnikom: Ker je baza podatkov aktivna, se bodo podatki med kopiranjem datotek spreminjali. XtraBackup zažene nit v ozadju, ki spremlja in kopira dnevnik InnoDB redo (ib_logfile0 itd.) za vse transakcije, ki se zgodijo med oknom varnostnega kopiranja.
  3. Priprava (obnovitev po sesutju): Po varnostnem kopiranju so kopirane datoteke v nedoslednem stanju. XtraBackup uporabi kopirane dnevnike redo na podatkovnih datotekah (podobno kot MySQL izvaja obnovitev po sesutju ob zagonu), kar rezultira v popolnoma doslednem posnetku baze podatkov v trenutku, ko se je varnostno kopiranje končalo.

Implementacija strategije fizičnega varnostnega kopiranja

Tukaj je tehnični pregled implementacije strategije fizičnega varnostnega kopiranja z uporabo Percona XtraBackup.

1. korak: Pretakanje varnostne kopije

Pisanje ogromne varnostne kopije na lokalni disk pogosto povzroči težave s kapaciteto. Najboljša praksa narekuje pretakanje varnostne kopije neposredno v arhivski format, njeno stiskanje in pošiljanje v pripravljalno območje ali neposredno na platformo za varnostno kopiranje.

Z uporabo xbstream lahko varnostno kopijo paraleliziramo in jo sproti stisnemo:

xtrabackup --backup 
  --user=backup_user 
  --password=SecurePassword! 
  --parallel=4 
  --stream=xbstream | lz4 > /mnt/backups/mysql_prod_backup.xbstream.lz4
  • --parallel=4: Uporabi 4 niti za sočasno branje podatkovnih datotek.
  • --stream=xbstream: Izpiše varnostno kopijo v Perconinem formatu za pretakanje.
  • lz4: Zagotavlja izjemno hitro stiskanje z nizko obremenitvijo procesorja.

2. korak: Priprava varnostne kopije za obnovitev

Preden lahko fizično varnostno kopijo obnovite, jo je treba “pripraviti” (uporabiti dnevnike redo). Najprej ekstrahirajte in dekomprimirajte tok:

mkdir -p /data/restore
lz4 -d /mnt/backups/mysql_prod_backup.xbstream.lz4 | xbstream -x -C /data/restore

Nato zaženite fazo priprave. Ta korak zahteva pomnilnik, zato zagotovite, da ima strežnik dodeljenega dovolj RAM-a:

xtrabackup --prepare --use-memory=4G --target-dir=/data/restore

3. korak: Obnovitev baze podatkov

Za obnovitev mora biti ciljni podatkovni imenik MySQL popolnoma prazen. Ustavite storitev MySQL, počistite imenik in kopirajte datoteke nazaj:

systemctl stop mysql
rm -rf /var/lib/mysql/*

xtrabackup --copy-back --target-dir=/data/restore

Na koncu popravite dovoljenja datotečnega sistema pred zagonom storitve:

chown -R mysql:mysql /var/lib/mysql
systemctl start mysql

Ker so podatkovne datoteke že zgrajene in indeksi že prevedeni, se baza podatkov zažene takoj. Obnovitev, ki je z mysqldump trajala 48 ur, zdaj traja le toliko časa, kolikor je potrebno za kopiranje datotek prek vašega omrežja ali diska – kar pogosto skrajša RTO na nekaj minut.

Optimizacija logičnih obnovitev (ko jih morate uporabiti)

Če ste prisiljeni obnoviti velik logični izvoz (npr. pri migraciji med različnimi večjimi različicami MySQL ali različnimi arhitekturami procesorjev, kjer fizične datoteke niso združljive), morate začasno prilagoditi konfiguracijo MySQL za optimizacijo za ogromen pretok pisanja.

Pred začetkom logične obnovitve uporabite te nastavitve v svoji my.cnf:

[mysqld]
# Začasno onemogočite binlogging, če gre za samostojno obnovitev
disable_log_bin

# Zakasnite izpraznitev na disk za povečanje hitrosti pisanja
innodb_flush_log_at_trx_commit = 2

# Povečajte medpomnilnik, da se prilega čim večjemu delovnemu naboru
innodb_buffer_pool_size = <Nastavite na 70 % celotnega RAM-a>

# Povečajte velikost datoteke dnevnika za preprečevanje agresivnega preverjanja
innodb_log_file_size = 2G

# Onemogočite medpomnilnik dvojnega pisanja (tvegano za produkcijo, varno za začetno nalaganje)
innodb_doublewrite = 0

Opomba: Vedno povrnite te nastavitve na njihove privzete vrednosti, skladne z ACID (innodb_flush_log_at_trx_commit = 1, innodb_doublewrite = 1), in znova zaženite storitev MySQL, preden dovolite produkcijski promet.

Avtomatizacija in zavarovanje varnostnih kopij s CloudSave

Medtem ko orodja, kot je Percona XtraBackup, rešujejo mehaniko učinkovitega pridobivanja podatkov, prava strategija za obnovo po nesreči na ravni podjetja zahteva orkestracijo, varno zunanjo shrambo in upravljanje življenjskega cikla. Zanašanje na skripte bash in opravila cron za upravljanje fizičnih varnostnih kopij uvaja visoko tveganje tihih napak in kršitev skladnosti.

Tu postane integracija vaše plasti baze podatkov s platformo za podjetja, kot je CloudSave, ključnega pomena.

CloudSave premosti vrzel med surovimi pripomočki za baze podatkov in skladnostjo na ravni podjetja. Z uporabo zmožnosti pred- in po-skriptiranja v CloudSave lahko ekipe DevOps sprožijo XtraBackup za ustvarjanje doslednega fizičnega posnetka. CloudSave nato brezhibno sprejme tok varnostne kopije, uporabi šifriranje AES-256 in odstrani podvojene podatke, preden jih replicira v nespremenljivo shrambo v oblaku.

Ta arhitektura zagotavlja, da:
1. Se ohrani zmogljivost produkcije: Varnostne kopije se izvajajo s hitrostjo shrambe brez onesnaževanja medpomnilnika InnoDB.
2. Zaščita pred izsiljevalsko programsko opremo: Politike nespremenljive shrambe v CloudSave preprečujejo zlonamernim akterjem brisanje ali šifriranje vaših arhivov baz podatkov.
3. Avtomatizirano hranjenje: Politike hranjenja GFS (Grandfather-Father-Son) se obravnavajo samodejno, kar zagotavlja skladnost z zahtevami glede suverenosti podatkov in revizije.
4. Predvidljiv RTO: Ker CloudSave upravlja arhive fizičnih datotek, je mogoče obnovitev večterabajtne baze podatkov v novo instanco hitro orkestrirati, s čimer se dosežejo strogi cilji RTO.

Zaključek

Nadaljnja uporaba mysqldump za obsežne baze podatkov je igra na srečo z neprekinjenim delovanjem in celovitostjo podatkov vaše organizacije. Narava enojne niti, onesnaževanje medpomnilnika in katastrofalni časi obnovitve jo naredijo temeljno neprimerno za sodobna okolja z visokim pretokom podatkov.

S prehodom na fizične varnostne kopije z uporabo orodij, kot je Percona XtraBackup, ter orkestracijo življenjskega cikla, šifriranja in zunanje replikacije prek robustne platforme, kot je CloudSave, svojo strategijo varnostnega kopiranja baz podatkov spremenite iz krhke obveznosti v odporno sredstvo na ravni podjetja. Danes ocenite svoje trenutne metrike RTO in RPO – če obnovitev traja dlje, kot si vaše podjetje lahko privošči biti brez povezave, je čas, da mysqldump pustite za seboj.