En guide till backup av databaser

– O, inget skydd kan stĂ„ emot en meteorits trĂ€ff. Men precis som alla har ni en reserv, sĂ„ ni behöver inte oroa er.

Stanislaw Lem, "StjÀrndagböckerna av Ijon Tichy"

SÀkerhetskopiering kallas för att spara en kopia av data nÄgonstans utanför det primÀra lagringsstÀllet.

En guide till backup av databaser

Huvudsyftet med sÀkerhetskopiering Àr att ÄterstÀlla data efter att de har gÄtt förlorade. DÀrför hörs det ofta att om det finns en kopia av databasen kan man alltid ÄterstÀlla data frÄn den, och sÀkerhetskopiering Àr inte nödvÀndig. I verkligheten hjÀlper sÀkerhetskopiering till att lösa minst tre problem som inte kan lösas med en kopia, och man kan inte heller initiera en kopia utan en backup.

För det första möjliggör en sÀkerhetskopiering ÄterstÀllning av data efter en logisk felaktighet. Till exempel, om en bokförare har raderat en grupp transaktioner eller om en databasadministratör har förstört ett tabellutrymme. BÄda operationerna Àr helt legitima i förhÄllande till databasen, och replikeringen kommer att Äterge dem i repliken.

För det andra Àr moderna databashanteringssystem mycket pÄlitliga programvaror, men ibland kan Àven interna strukturer i databasen skadas, vilket gör att Ätkomst till data försvinner. SÀrskilt frustrerande Àr det att sÄdana störningar vanligtvis sker under hög belastning eller vid installation av nÄgon uppdatering. Men bÄde hög belastning och regelbundna uppdateringar innebÀr att databasen inte Àr en testversion, och data som lagras i den Àr vÀrdefulla.

Slutligen, den tredje uppgiften som krÀver tillgÄng till en sÀkerhetskopiering Àr kloning av databasen, till exempel för testÀndamÄl.

SÀkerhetskopiering av databaser baseras pÄ antingen av de tvÄ principerna:

  • Utsökning av data med efterföljande lagring i ett godtyckligt format;
  • Ett ögonblick av databasens filers tillstĂ„nd och lagring av loggar.

LÄt oss gÄ igenom dessa principer och verktygen som implementerar dem mer i detalj.

Export av data

I uppsÀttningen verktyg som medföljer varje databashanteringssystem finns det nödvÀndigtvis verktyg för export och import av data. Data kan sparas antingen i textformat eller i ett binÀrt format som Àr specifikt för det aktuella databashanteringssystemet. Tabellen nedan visar sÄdana verktyg:

BinÀrt format
Textformat

Oracle
DataPump Export/DataPump Import
Exportera/Importera
SQL*Plus/SQL*Loader

PostgreSQL
pg_dump, pg_dumpall/pg_restore
pg_dump, pg_dumpall/psql

Microsoft SQL Server
bcp
bcp

DB2
unload/ladda
unload/ladda

MySQL

mysqldump, mysqlpump/mysql, mysqlimport

MongoDB
mongodump/mongorestore
mongoexport/mongoimport

Cassandra
nodetool snapshot/sstableloader
cqlsh

Textformatet Àr bra eftersom det kan redigeras eller till och med skapas av externa program, medan det binÀra formatet Ä sin sida Àr bra eftersom det möjliggör snabbare exportering och importering av data genom att spara resurser vid omvandling av format.

Trots enkelheten och tydligheten i idén att exportera data anvÀnds denna metod sÀllan för att sÀkerhetskopiera belastade industriella databaser. HÀr Àr anledningarna till varför export inte Àr lÀmplig för en fullstÀndig sÀkerhetskopiering:

  • exportprocessen skapar en betydande belastning pĂ„ kĂ€llsystemet;
  • exporten tar mycket tid - vid tidpunkten för exportens avslutande kommer den redan att vara förĂ„ldrad;
  • att göra en konsekvent export av hela databasen vid hög belastning Ă€r praktiskt taget omöjligt, eftersom DBMS mĂ„ste lagra en avbildning av sitt tillstĂ„nd vid tidpunkten för exportens början. Ju fler transaktioner som har genomförts sedan exportens början, desto större blir volymen av avbildningen (förĂ„ldrade kopior av data i PostgreSQL, undo-utrymme i Oracle, tempdb i Microsoft SQL Server, osv.);
  • exporten bevarar den logiska strukturen hos data, men inte deras fysiska struktur - parametrarna för den fysiska lagringen av tabeller, index m.m.

Trots detta har export ocksÄ sina fördelar:

  • hög selektivitet: det gĂ„r att exportera enskilda tabeller, specifika fĂ€lt och till och med enskilda rader;
  • de exporterade data kan laddas in i en databas av en annan version, och om exporten görs i textformat, Ă€ven i en annan databas.

SÄledes anvÀnds export huvudsakligen för sÄdana uppgifter som sÀkerhetskopiering av smÄ tabeller (t.ex. referenstabeller) eller distribution av datamÀngder med nÀsta version av applikationen.

Den vanligaste metoden för sÀkerhetskopiering av databaser Àr att kopiera databasfilerna.

"Kall" sÀkerhetskopiering av databasfiler

En uppenbar idé Àr att stoppa databasen och kopiera alla dess filer. En sÄdan sÀkerhetskopiering kallas "kall". Metoden Àr extremt pÄlitlig och enkel, men den har tvÄ uppenbara nackdelar:

  • FrĂ„n en "kall" sĂ€kerhetskopiering kan endast den databasens tillstĂ„nd Ă„terstĂ€llas som fanns vid tidpunkten för stoppet; transaktioner som utförts efter att databasen startat igen kommer inte att ingĂ„ i den "kalla" sĂ€kerhetskopieringen;
  • Det finns inte alltid ett tekniskt fönster för varje databas dĂ€r databasen kan stoppas.

Om "kall" sÀkerhetskopiering passar dig, behöver du komma ihÄg att

  • "kall" kopia ibland mĂ„ste inkludera loggar. Metoder för att bestĂ€mma vilka loggar som ska ingĂ„ i den "kalla" kopian Ă€r individuella för varje DBMS. Till exempel, i Oracle Ă€r det nödvĂ€ndigt att kopiera sĂ„ kallade online redo, det vill sĂ€ga ett bestĂ€mt antal loggfiler i en speciell mapp, Ă€ven nĂ€r databasen stoppas korrekt. I PostgreSQL mĂ„ste alla loggar sparas frĂ„n loggen som innehĂ„ller den senaste kontrollpunkten, information om vilken finns i kontrollfilen.
  • Databasens katalog kan innehĂ„lla ganska stora filer för temporĂ€ra tabellutrymmen som inte nödvĂ€ndigtvis behöver inkluderas i sĂ€kerhetskopieringen. För övrigt Ă€r denna observation ocksĂ„ giltig för "het" sĂ€kerhetskopiering.

"Het" filbevarande

De flesta sÀkerhetskopior av moderna databaser görs genom att kopiera databasfiler utan att stoppa databasen. HÀr syns flera problem:

  • Vid början av kopieringen kan innehĂ„llet i databasen skilja sig frĂ„n innehĂ„llet i filerna, eftersom en del information finns i cachen och Ă€nnu inte Ă€r skriven till disken.
  • Under kopieringen kan innehĂ„llet i databasen förĂ€ndras. Om förĂ€nderliga datatyper anvĂ€nds, Ă€ndras filinnehĂ„llet, och vid anvĂ€ndning av oförĂ€nderliga strukturer Ă€ndras filuppsĂ€ttningen: nya filer dyker upp medan gamla tas bort.
  • Eftersom skrivning av data till databasen och lĂ€sning av DB-filer inte Ă€r synkroniserade kan sĂ€kerhetskopieringsprogrammet lĂ€sa en felaktig sida, dĂ€r hĂ€lften Ă€r frĂ„n den gamla versionen av sidan och den andra hĂ€lften Ă€r frĂ„n den nya.

För att sÀkerhetskopian ska bli konsekvent finns det en kommando för varje DBMS som signalerar att sÀkerhetskopieringsprocessen har pÄbörjats. Syntaktiskt kan detta kommando se olika ut:

  • i Oracle Ă€r det ett separat kommando ALTER DATABASE/TABLESPACE BEGIN BACKUP;
  • i PostgreSQL – funktionen pg_start_backup();
  • I Microsoft SQL Server och DB2 förbereds sĂ€kerhetskopieringen implicit under exekveringen av kommandot BACKUP DATABASE;
  • I MySQL Enterprise, Cassandra och MongoDB förbereds det implicit av externa verktyg – mysqlbackup, OpsCenter och Ops Manager respektive.

Trots syntaktiska skillnader ser processen för förberedelse av sÀkerhetskopiering likadan ut.

SÄ hÀr ser förberedelsen för sÀkerhetskopiering ut i databashanterare med Ànderliga diskstrukturer, det vill sÀga i alla traditionella disk-baserade relationssystem:

  1. Tidpunkten för början av sÀkerhetskopieringen registreras; sÀkerhetskopian mÄste innehÄlla databasloggar frÄn denna tidpunkt.
  2. En kontrollpunkt utförs, vilket innebÀr att alla Àndringar som har skett i databladen fram till den registrerade tidpunkten skrivs till disk. Detta sÀkerstÀller att loggarna fram till början av sÀkerhetskopieringen inte krÀvs vid ÄterstÀllning.
  3. Ett sÀrskilt loggningslÀge aktiveras: om ett datablad Àndras första gÄngen efter att det har laddats frÄn disk, kommer databasen att skriva hela sidan till loggen istÀllet för att registrera förÀndringen. Vid den förberedande proceduren skrivs alla sidor ut till disk, och dÀrför kommer den första förÀndringen alltid att skrivas helt till loggen. Men om sidan under sÀkerhetskopieringen skrivs ut till disk igen, kommer nÀsta förÀndring ocksÄ att leda till en fullstÀndig kopia av sidan i loggen. Detta sÀkerstÀller att om sidan blir felaktig vid kopiering av datafilen, gör loggen den korrekt igen.
  4. Ändringar av databasfilernas huvuden blockeras, det vill sĂ€ga den del av dem vars förĂ€ndringar inte Ă„terspeglas i loggarna. Detta sĂ€kerstĂ€ller att huvudet kopieras korrekt och att loggarna sedan tillĂ€mpas korrekt pĂ„ datafilen.

NĂ€r alla ovan nĂ€mnda procedurer har slutförts kan man kopiera datafiler med hjĂ€lp av operativsystemets verktyg – cp, rsync och andra. Aktivering av backupsystemet minskar databasens prestanda: för det första ökar volymen av loggar, och för det andra, om det under backupsystemet skulle uppstĂ„ ett fel, kommer Ă„terstĂ€llningen att ta lĂ€ngre tid, eftersom filrubrikerna inte uppdateras. Ju snabbare backupen avslutas, desto bĂ€ttre för databasen, dĂ€rför Ă€r det lĂ€mpligt att anvĂ€nda verktyg som snapshots av filsystemet eller BCV (break copy volume) i RAID-arrayen. Vissa DBMS (Oracle, PostgreSQL) ger administratören möjlighet att sjĂ€lv vĂ€lja kopieringsmetod, medan andra (Microsoft SQL Server) erbjuder ett grĂ€nssnitt för att integrera egna backupverktyg med filsystemets eller lagringssystemets mekanismer.

Efter att backupen har slutförts mÄste databasen ÄterstÀllas till sitt normala tillstÄnd. I Oracle görs detta med kommandot ALTER DATABASE/TABLESPACE END BACKUP, i PostgreSQL - genom att anropa funktionen pg_stop_backup(), och i andra databaser - med interna rutiner frÄn motsvarande kommandon eller externa tjÀnster.

SÄ hÀr ser tidsdiagrammet för backup-processen ut:

En guide till backup av databaser

  • Förberedelser för backup (begin backup) tar tid, ibland betydande. Även om speglade volymer eller filsystem med snapshots anvĂ€nds, kommer backup-processen inte att vara ögonblicklig.
  • Tillsammans med datafilerna mĂ„ste loggarna sparas frĂ„n början av backupförberedelserna till ögonblicket dĂ„ databasen Ă„terstĂ€lls till normalt tillstĂ„nd.
  • Det gĂ„r att Ă„terstĂ€lla frĂ„n denna backup vid tidpunkten dĂ„ databasen Ă„terstĂ€lls till normalt tillstĂ„nd. ÅterstĂ€llning till en tidigare tidpunkt Ă€r inte möjligt.

För databaser som anvÀnder oförÀnderliga datakonstruktioner (minnessnapshots, LSM-trÀd) Àr situationen enklare. Förberedelserna för backup bestÄr av följande steg:

  1. Data frÄn minnet skrivs till disken.
  2. En lista över filer som ingÄr i backupen registreras. SÄ lÀnge backup-processen pÄgÄr Àr databasen förbjuden att ta bort dessa filer, Àven om de blir onödiga.

Vid signal om att sÀkerhetskopieringen Àr klar kan databasen med oförÀnderliga strukturer Äter igen radera onödiga filer.

ÅterstĂ€llning till punkt

En sÀkerhetskopiering tillÄter att ÄterstÀlla databasen till det tillstÄnd den hade nÀr kommandot för ÄtergÄng frÄn sÀkerhetskopieringslÀge avslutades. Men en krasch som krÀver ÄterstÀllning kan intrÀffa nÀr som helst. Uppgiften att ÄterstÀlla databasens tillstÄnd till en godtycklig tidpunkt kallas "ÄterstÀllning till punkt" (point-in-time recovery).

För att möjliggöra detta bör loggar för databasen sparas frÄn och med det att sÀkerhetskopieringen avslutades, och under ÄterstÀllningsprocessen ska loggar fortsÀtta att tillÀmpas pÄ den ÄterstÀllda kopian. NÀr databasen har ÄterstÀllts frÄn sÀkerhetskopian vid tidpunkten för avslutningen av kopieringen, Àr tillstÄndet för databasen (filer och cachade sidor) garanterat korrekt, sÄ en speciell loggningsmetod behövs inte. Genom att tillÀmpa loggar fram till den önskade tidpunkten kan man fÄ databasens tillstÄnd vid vilken tidpunkt som helst.

Om hastigheten för Ă„terstĂ€llning av sĂ€kerhetskopian begrĂ€nsas endast av diskens bandbredd, Ă€r hastigheten för tillĂ€mpning av loggarna vanligtvis begrĂ€nsad av processorns prestanda. Om Ă€ndringar i den primĂ€ra databasen sker parallellt, utförs alla Ă€ndringar sekventiellt vid Ă„terstĂ€llning – i den ordning de lĂ€ses frĂ„n loggen. DĂ€rför Ă€r Ă„terstĂ€llningstiden linjĂ€rt relaterad till hur lĂ„ngt Ă„terstĂ€llningspunkten ligger frĂ„n tidpunkten för avslutningen av sĂ€kerhetskopieringen. Detta gör att man mĂ„ste göra fullstĂ€ndiga sĂ€kerhetskopior ganska ofta – minst en gĂ„ng i veckan för databaser med lĂ„g transaktionsbelastning och upp till en gĂ„ng om dagen för högbelastade databaser.

Inkrementell sÀkerhetskopiering

För att snabba upp ÄterstÀllningen till punkt vill man gÀrna kunna utföra sÀkerhetskopiering sÄ ofta som möjligt, men samtidigt inte upptar för mycket utrymme pÄ diskarna och inte belastar databasen med sÀkerhetskopieringsuppgifter.

Lösningen pÄ problemet Àr inkrementell sÀkerhetskopiering, det vill sÀga att endast de datorsidor som har Àndrats sedan den senaste sÀkerhetskopieringen kopieras.
Inkrementell sÀkerhetskopiering Àr meningsfullt endast för databashanterare som anvÀnder förÀnderliga datastrukturer.

Inkrementet kan rÀknas frÄn en fullstÀndig sÀkerhetskopia (kumulativ kopia) eller frÄn vilken tidigare kopia som helst (differentiell kopia).

En guide till backup av databaser

TyvÀrr finns det ingen enhetlig terminologi, och olika tillverkare anvÀnder olika termer:

Differentiell
Kumulativ

Oracle
Differential
Cumulative

PostgresPro
Inkrementell
—

Microsoft SQL Server
—
Differential

IBM DB2
Delta
Inkrementell

Vid förekomsten av inkrementella kopior ser ÄterstÀllningsprocessen till en viss punkt ut pÄ följande sÀtt:

  • den senaste fullstĂ€ndiga sĂ€kerhetskopian som gjorts innan Ă„terstĂ€llningen Ă„terstĂ€lls;
  • inkrementella kopior Ă„terstĂ€lls över den fullstĂ€ndiga kopian;
  • loggar tillĂ€mpas frĂ„n den punkt dĂ€r sĂ€kerhetskopiering pĂ„börjades till Ă„terstĂ€llningspunkten.

NÀr en kumulativ kopia finns tilhandahÄller det en snabbare ÄterstÀllningsprocess. Till exempel, för att ÄterstÀlla databasen till en punkt mellan T3 och T4, mÄste tvÄ inkrementella kopior ÄterstÀllas, medan endast en behövs för att ÄterstÀlla efter T4.
Det Àr uppenbart att volymen av en kumulativ kopia Àr mindre Àn volymen av flera differentiella kopior, eftersom vissa sidor kan ha Àndrats flera gÄnger och varje inkrementell kopia innehÄller sin version av sidan.

Det finns tre sÀtt att skapa en inkrementell kopia:

  1. skapa en fullstÀndig kopia och berÀkna skillnaden mot den föregÄende fullstÀndiga kopian;
  2. bearbeta loggar, skapa en lista över Àndrade sidor och sÀkerhetskopiera sidorna i listan;
  3. frÄga databasen efter Àndrade sidor.

Det första sÀttet sparar diskutrymme, men löser inte problemet med att minska belastningen pÄ databasen. Dessutom, om vi har en fullstÀndig sÀkerhetskopia, Àr det meningslöst att omvandla den till en inkrementell, eftersom ÄterstÀllning av en fullstÀndig kopia Àr snabbare Àn att ÄterstÀlla en tidigare fullstÀndig kopia och inkrementet. Problemet med att spara diskutrymme med en sÄdan metod bör bÀttre överlÀmnas till speciella komponenter med inbyggda dedupliceringsmekanismer. Detta kan vara antingen speciella lagringssystem (EMC DataDomain, HPE StorageWorks VLS, hela NetApp-sortimentet) eller programprodukter (ZFS, Veritas NetBackup PureFile, Windows Server Data Deduplication).

Den andra och tredje metoden skiljer sig Ät i hur de identifierar listan över Àndrade sidor. Att bearbeta loggar Àr mer resurskrÀvande, plus att för att genomföra det mÄste man kÀnna till loggfilernas struktur. Att frÄga databasen sjÀlv vilka sidor som har Àndrats Àr det enklaste, men för detta mÄste databashanteringssystemets kÀrna ha funktionalitet för att spÄra Àndrade block (block change tracking).

Funktionen för inkrementell sÀkerhetskopiering skapades först i Oracle Recovery Manager (RMAN), som introducerades i Oracle 8i. Oracle implementerade omedelbart spÄrning av Àndrade blok, sÄ det finns ingen anledning att bearbeta loggar.

PostgreSQL spĂ„rar inte Ă€ndrade block, dĂ€rför identifierar verktyget pg_probackup, som utvecklades av det ryska företaget Postgres Professional, Ă€ndrade sidor genom att analysera loggarna. Men företaget tillhandahĂ„ller Ă€ven databashanteringssystemet PostgresPro, som inkluderar tillĂ€gget ptrack, som spĂ„rar Ă€ndringar av sidor. NĂ€r pg_probackup anvĂ€nds med PostgresPro-framstĂ€llningen begĂ€r verktyget Ă€ndrade sidor direkt frĂ„n databasen – precis som RMAN.

Microsoft SQL Server, precis som Oracle, spÄrar Àndrade sidor, men kommandot BACKUP tillÄter endast att göra fulla och kumulativa sÀkerhetskopior.

I DB2 finns möjlighet att spÄra Àndrade sidor, men som standard Àr den avstÀngd. NÀr den aktiveras tillÄter DB2 att göra fullstÀndiga, differentierade och kumulativa sÀkerhetskopior.

En viktig skillnad mellan verktygen som beskrivs i den hÀr avsnittet (förutom pg_probackup) och filbaserade sÀkerhetskopieringsverktyg Àr att de begÀr sidbilder frÄn databasen, snarare Àn att lÀsa data frÄn disken sjÀlva. Nackdelen med detta tillvÀgagÄngssÀtt Àr en viss extra belastning pÄ databasen. Dock kompenseras denna nackdel mer Àn vÀl av att den lÀsta sidan alltid Àr korrekt, varför det inte finns nÄgot behov av att aktivera ett sÀrskilt loggningslÀge under sÀkerhetskopieringen.

Observera Äterigen att nÀrvaron av inkrementella kopior inte upphÀver kraven pÄ att ha loggar för ÄterstÀllning till en godtycklig tidpunkt. DÀrför skrivs loggar kontinuerligt över pÄ extern lagring i industriella databaser, och sÀkerhetskopior, bÄde fullstÀndiga och/eller inkrementella, skapas enligt schema.

Den bĂ€sta implementeringen av idĂ©n om inkrementell sĂ€kerhetskopiering idag Ă€r den program- och hĂ„rdvarukonfiguration (i Oracle-terminologi – engineered system) Zero Data Loss Recovery Appliance – en specialiserad lösning frĂ„n Oracle för sĂ€kerhetskopiering av egen databas. Konfigurationen bestĂ„r av en kluster servrar med en stor mĂ€ngd diskar, pĂ„ vilka en modifierad version av Recovery Manager-programvaran Ă€r installerad och kan arbeta bĂ„de med andra program- och hĂ„rdvarukonfigurationer frĂ„n Oracle (Database Appliance, Exadata, SPARC Supercluster) samt med Oracle-databaser pĂ„ traditionell infrastruktur. Till skillnad frĂ„n "vanlig" RMAN implementerar ZDLRA konceptet "evig inkrement" (incremental forever). Systemet skapar en fullstĂ€ndig kopia av databasen en enda gĂ„ng, och sedan gör det endast inkrementella kopior. Ytterligare RMAN-moduler möjliggör att kopior kombineras, vilket skapar nya fullstĂ€ndiga kopior frĂ„n inkrementella.

Till den ryska utvecklarnas Àra bör det noteras att Àven pg_probackup kan kombinera inkrementella kopior.

En guide till backup av databaser

Till skillnad frĂ„n mĂ„nga liknande frĂ„gor har frĂ„gan "vilken sĂ€kerhetskopieringsmetod Ă€r bĂ€ttre" ett entydigt svar – den bĂ€sta Ă€r det inbyggda verktyget för den anvĂ€nda DBMS som möjliggör inkrementell sĂ€kerhetskopiering.

För databasutvecklaren Àr frÄgor om val av sÀkerhetskopieringsstrategi och integration av databaslagringslösningar i företagsinfrastrukturen mycket viktigare. Men dessa frÄgor ligger utanför ramen för denna artikel.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster