Categories
Database Backup

** Discover the hidden dangers of DIY database backup scripts. Learn why custom Bash scripts fail in production, the risks of logical dumps, and how to secure your data with enterprise solutions.

Sérhver gagnagrunnsstjóri (DBA) og kerfisverkfræðingur hefur einhvern tímann á ferlinum skrifað sérsniðið skeljaforskrift (shell script) til að taka afrit af gagnagrunni. Það er nánast eins og vígsla. Á fyrstu stigum verkefnis virðist einföld cron-vinnsla sem keyrir mysqldump eða pg_dump og sendir úttakið í gegnum gzip vera glæsileg, létt og hagkvæm lausn.

Hins vegar, eftir því sem innviðir stækka, gagnamagn eykst og kröfur um uppitíma (SLA) verða strangari, breytist þessi 10 lína Bash-skrift hljóðlega í tímasprengju. Framleiðsluumhverfi krefjast mikillar framboðs (high availability), strangra markmiða um endurheimtarpunkt (RPO) og skjótra markmiða um endurheimtartíma (RTO). Að treysta á DIY-afritunarforskriftir í þessu umhverfi skapar alvarlega áhættu tengda samræmi gagna, hljóðlátum bilunum, öryggisveikleikum og óviðráðanlegum endurheimtarferlum.

Í þessari grein munum við greina arkitektúrsgalla og falin hættumerki DIY-afritunarforskrifta, kanna tæknilegar gildrur röklegra (logical) vs. líkamlegra (physical) afrita og ræða hvernig hægt er að skipta yfir í lausnir á fyrirtækjastigi eins og CloudSave til að vernda mikilvægustu gögnin þín.

Tálmynd einfaldleikans: Greining á klassísku DIY-forskriftinni

Til að skilja hættuna verðum við fyrst að skoða uppbyggingu dæmigerðrar DIY-afritunarforskriftar. Hefðbundin nálgun fyrir MySQL-gagnagrunn lítur oft svona út:

#!/bin/bash
# Einföld DIY MySQL afritunarforskrift
BACKUP_DIR="/mnt/backups"
DATE=$(date +%F)
DB_USER="admin"
DB_PASS="SuperSecret123!"

mysqldump -u $DB_USER -p$DB_PASS my_database | gzip > $BACKUP_DIR/mydb_$DATE.sql.gz

# Eyða afritum eldri en 30 daga
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -exec rm {} ;

Við fyrstu sýn nær þessi skrift markmiðinu: hún dregur út gögnin, þjappar þeim og stýrir varðveislu. En undir yfirborðinu er hún full af alvarlegum göllum sem munu að lokum leiða til gagnataps í framleiðsluumhverfi.

Hætta 1: Hljóðlátar bilanir og pípu-gildran

Ein af lúmskustu hættunum við DIY-forskriftir er hljóðláta bilunin. Í skriftinni hér að ofan er mysqldump skipuninni beint (|) í gzip.

Í Bash er útgöngustaða pípu (pipeline) sú sama og útgöngustaða síðustu skipunarinnar í pípunni. Ef gagnagrunnsþjónninn verður minnislaus, missir tenginguna eða lendir í læstri töflu miðja vegu í afrituninni, mun mysqldump mistakast og kasta villu. Hins vegar mun gzip þjappa því sem það fékk og skila útgöngustöðu 0 (árangur).

Vöktunarkerfið þitt, sem athugar útgöngukóða cron-vinnslunnar, mun tilkynna um árangursríka afritun. Þú munt hafa gilda .gz skrá á disknum, en inni í henni verður afskorin, ónýt SQL-skrá. Þú munt ekki uppgötva þetta fyrr en þú reynir mikilvæga endurheimt.

Úrbætur (og takmarkanir þeirra)

Verkfræðingar reyna oft að laga þetta með því að virkja stranga villumeðhöndlun í Bash:

set -e
set -o pipefail

Þótt set -o pipefail tryggi að skriftin mistakist ef einhver skipun í pípunni mistekst, krefst það samt að þú byggir upp öfluga viðvörun, skráningu (logging) og endurkeyrslukerfi í kringum skriftina. Þegar tímabundin netvilla veldur bilun klukkan 2:00 að nóttu, deyr DIY-skriftin einfaldlega. Fyrirtækjalausnir meðhöndla þessar tímabundnu villur með snjöllum endurkeyrslum.

Hætta 2: Samræmi gagna og læsingar-martraðir

DIY-forskriftir reiða sig mikið á rökleg afrit (mysqldump, pg_dump). Rökleg afrit draga út gögn með því að keyra SELECT skipanir yfir allar töflur. Í mjög virkum framleiðslugagnagrunni breytast gögn stöðugt. Ef skrift tekur 45 mínútur að afrita 100GB gagnagrunn, verða gögnin í upphafi afritunarinnar 45 mínútum eldri en gögnin í lokin, sem brýtur gegn ACID-samræmi.

MySQL viðskiptasamræmi

Til að ná samræmdri skyndimynd í MySQL með InnoDB verður þú að nota sérstaka fána:

mysqldump --single-transaction --quick --routines --events -u user -p db > dump.sql

--single-transaction fáninn setur einangrunarstigið á REPEATABLE READ og byrjar færslu (transaction) áður en afritun hefst. Hins vegar, ef gagnagrunnurinn inniheldur enn eldri MyISAM-töflur, mun þessi fáni ekki koma í veg fyrir að þær læsist, sem gæti stöðvað framleiðsluumferð á meðan afritunin keyrir. Ennfremur munu allar ALTER TABLE, DROP TABLE eða RENAME TABLE skipanir sem forritarar keyra á meðan afritunin stendur yfir rjúfa REPEATABLE READ skyndimyndina og valda því að afritunin mistekst.

PostgreSQL og WAL-skjalavistun

Fyrir PostgreSQL veitir pg_dump samræmd rökleg afrit, en rökleg afrit ein og sér geta ekki veitt endurheimt á ákveðnum tímapunkti (Point-in-Time Recovery – PITR). Ef gagnagrunnurinn hrynur klukkan 16:00 og síðasta cron-skriftin þín keyrði á miðnætti, taparðu 16 klukkustundum af gögnum.

Til að ná PITR þarf samfellda skjalavistun á Write-Ahead Logs (WAL). Það er mjög erfitt að skrifa DIY-skrift til að meðhöndla archive_command á öruggan hátt.

# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /mnt/wal_archive/%f && cp %p /mnt/wal_archive/%f'

Ef geymsluplássið (/mnt/wal_archive/) fyllist eða verður óaðgengilegt, mun archive_command mistakast. PostgreSQL mun þá safna WAL-skrám staðbundið þar til aðaldiskurinn fyllist, sem veldur algjöru hruni gagnagrunnsins. DIY-skriftir hafa sjaldan þá fjarmælingu sem þarf til að fylgjast með WAL-söfnun og vara stjórnendur við áður en hrun verður.

Hætta 3: Varðveislu-rúlettan

Líttu aftur á varðveislu-skipunina í upphaflegu skriftinni okkar:

find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -exec rm {} ;

Þetta er hörmulegt gagnatap sem bíður þess að gerast. Ímyndaðu þér að breyting á stillingum eyðileggi auðkenningu mysqldump. Skriftin mistekst við að búa til ný afrit, en find skipunin heldur áfram að keyra á hverju kvöldi og eyðir dyggilega skrám sem eru eldri en 30 daga.

Eftir 30 daga af hljóðlátum afritunarbilunum mun find skipunin eyða síðasta góða afritinu þínu. Þú stendur nú uppi með núll afrit.

Fyrirtækja-afritunarhugbúnaður eins og CloudSave notar ríkisbundnar (stateful) varðveislustefnur. Hann skilur muninn á „eyða afritum eldri en 30 daga“ og „tryggja að að minnsta kosti 30 árangursríkir endurheimtarpunktar séu til staðar áður en gömlum gögnum er eytt.“

Hætta 4: Öryggi, dulkóðun og blindir blettir í samræmi

Á tímum lausnarhugbúnaðar (ransomware) og strangra samræmisramma (GDPR, HIPAA, SOC 2) eru afrit aðalmarkmið. DIY-skriftir brjóta oft gegn bestu starfsvenjum í öryggismálum:

  1. Harðkóðaðir aðgangskóðar: Að geyma lykilorð gagnagrunna í skriftum eða cron-skilgreiningum er gríðarleg öryggisáhætta. Þótt verkfæri eins og mysql_config_editor í MySQL eða .pgpass skráin í PostgreSQL dragi úr þessu, krefjast þau samt stjórnunar á staðbundnum lyklaskrám á þjóninum.
  2. Skortur á dulkóðun í hvíld: Að dæla hráum SQL-gögnum á disk skilur viðkvæmar persónuupplýsingar eftir óvarðar.
  3. Flóknar dulkóðunarpípur: Tilraunir til að dulkóða afrit á flugi með GPG valda miklu álagi á örgjörva og flækja stjórnun lykla.
# DIY dulkóðuð afritunarpípa
pg_dump mydb | gzip | gpg --symmetric --cipher-algo AES256 --passphrase-file /etc/keys/backup.key > backup.sql.gz.gpg

Ef þjónninn er kominn í hendur óviðkomandi hefur árásarmaðurinn aðgang að bæði dulkóðuðu afrituninni og /etc/keys/backup.key skránni, sem gerir dulkóðunina gagnslausa. Ennfremur, ef DBA-inn sem bjó til GPG-lykilinn hættir hjá fyrirtækinu og lykillinn týnist, eru afritin óendurheimtanleg.

Hætta 5: RTO-raunveruleikinn (Endurheimt er erfiðari en afritun)

Fullkomið próf á afriti er endurheimtin. Rökleg afrit sem DIY-skriftir búa til eru þekkt fyrir að vera hæg í endurheimt. 500GB SQL-afrit gæti tekið 15 mínútur að búa til, en endurheimt þess krefst þess að gagnagrunnsvélin lesi SQL-kóðann, endurbyggi vísanir (indexes) og endurreikni skorður (constraints). Þetta getur tekið klukkustundir eða jafnvel daga, sem eyðileggur RTO-markmiðin þín.

Fyrir stóra framleiðslugagnagrunna eru líkamleg afrit (afritun á raunverulegum gagnaskrám) nauðsynleg. Þótt verkfæri eins og Percona XtraBackup eða pg_basebackup séu til, er mjög flókið að pakka þeim inn í DIY Bash-skriftir. Þú verður að stjórna LVM-skyndimyndum, meðhöndla stöðvun skráarkerfa og tryggja að afritunin sé flutt út af staðnum án þess að metta netið.

LVM-skyndimyndagildran

Margir verkfræðingar reyna „zero downtime“ líkamlegar afritanir með LVM-skyndimyndum:

# Búa til skyndimynd
lvcreate --size 20G --snapshot --name db_snap /dev/vg0/db_vol

# Mounta og afrita
mount /dev/vg0/db_snap /mnt/snap
tar -czf /backups/db_physical.tar.gz /mnt/snap/mysql

Ef gagnagrunnurinn upplifir skyndilega aukningu í skrif-I/O, getur 20GB LVM-skyndimyndin fyllst samstundis. Þegar LVM-skyndimynd fyllist verður hún ógild og afritunin mistekst. Verra er að mikið notaðar LVM-skyndimyndir geta dregið verulega úr I/O-afköstum aðalgagnagrunnsins, sem veldur töfum í forritum.

Skipt yfir í vernd á fyrirtækjastigi

Skiptingin frá DIY-skriftum yfir í fyrirtækjalausn er mikilvægur áfangi í þroska hvers innviðateymis. Markmiðið er að fara frá því að „vona að skriftin hafi keyrt“ yfir í að hafa dulritunarlega sönnun fyrir endurheimtanleika.

Vettvangar eins og CloudSave eru hannaðir sérstaklega til að útrýma blindum blettum DIY-skriftagerðar. Með því að nota forritavitundar-umboðsmenn (agents), hefur CloudSave bein samskipti við API-viðmót gagnagrunna (MySQL, PostgreSQL, MS SQL, Oracle) til að stýra samræmdum líkamlegum og röklegum afritum án þess að læsa töflum eða draga úr afköstum.

Helstu kostir þess að hætta með skriftir:

  1. Sjálfvirk staðfesting: Nútímalegir vettvangar taka ekki bara afrit; þeir prófa þau. CloudSave getur sjálfkrafa ræst tímabundið gagnagrunnstilvik, endurheimt afritið, keyrt samræmispróf (t.d. DBCC CHECKDB) og eytt því aftur, sem veitir staðfesta skýrslu um að afritið sé í raun nothæft.
  2. Óbreytanleg geymsla (Immutable Storage): Til að berjast gegn lausnarhugbúnaði verða afrit að vera óbreytanleg. DIY-skriftir geta ekki auðveldlega skrifað í WORM-geymslu (Write Once, Read Many). Fyrirtækjalausnir samþættast innbyggt við S3 Object Lock og óbreytanlega skýjageymslu, sem tryggir að jafnvel þótt þjónn sé algjörlega kominn í hendur óviðkomandi, geti árásarmaðurinn ekki eytt eða dulkóðað afritin.
  3. Einfaldað PITR: Í stað þess að sauma handvirkt saman grunn-afrit og hundruð WAL-skráa með flóknum recovery.conf eða postgresql.auto.conf breytum, bjóða vettvangar upp á sjónrænan tímalína. Þú velur einfaldlega nákvæmlega þá mínútu sem þú vilt endurheimta til, og hugbúnaðurinn sér um endurspilun log-skráa sjálfkrafa.
  4. Affjölgun (Deduplication) og þjöppun: DIY-skriftir reiða sig á gzip, sem þjappar hverri skrá fyrir sig. Fyrirtækja-afritunarhugbúnaður notar alþjóðlega affjölgun á blokkarstigi, sem dregur verulega úr geymslukostnaði og netbandbreidd þegar afrit eru flutt út af staðnum.

Niðurstaða

Það er auðvelt að skrifa sérsniðna Bash-skrift til að taka afrit af gagnagrunni. Að skrifa skrift sem meðhöndlar hljóðlátar pípubilanir, tryggir ACID-samræmi, stýrir dulritunarlyklum á öruggan hátt, kemur í veg fyrir gagnatap vegna varðveislu og tryggir ströng RTO/RPO-markmið er nánast ómögulegt.

Í framleiðsluumhverfi er gagnagrunnurinn mikilvægasta eign fyrirtækisins. Að meðhöndla vernd hans sem hliðarverkefni sem viðhaldið er af nokkur hundruð línum af skeljaforskrift er áhætta sem ekkert fyrirtæki hefur efni á. Með því að endurskoða núverandi afritunarstefnur, skilja takmarkanir röklegra afrita og flytja yfir í öfluga, sjálfvirka vettvanga eins og CloudSave, geta DevOps- og DBA-teymi útrýmt „rútu-þættinum“ (bus factor) sérsniðinna skrifta og tryggt að gögn þeirra séu sannarlega örugg.