- Obnova celotne baze iz Google Cloud disk-snapshota
- Identifikacija zadnjega timestampa pred odpovedjo – Poišči timestamp v
local.oplog.rs
, ki je najbližji času odpovedi. - Obnova incrementalnih backupov v vmesno tabelo – Incrementalni backupi se restavrirajo v vmesno bazo
local_restore.oplog.rs
. Ta vmesna baza je namenjena pripravi podatkov za nadaljnji proces. Po restavriranju so v tej tabeli shranjeni tako potrebni kot tudi podvojeni zapisi (tisti, ki se že nahajajo vlocal.oplog.rs
). Namen vmesne baze je, da omogoči prečiščevanje podatkov, kjer se izbrišejo vsi zapisi, ki niso potrebni, in ohranijo samo manjkajoči podatki za dokončno obnovo. - Odstranitev podvojenih zapisov – Iz vmesne baze
local_restore.oplog.rs
odstrani vse zapise, ki se prekrivajo z obstoječimi zapisi vlocal.oplog.rs
. To zagotavlja, da v končni obnovi ne pride do konfliktov ali podvajanja podatkov. - Izvoz
oplog.rs
izlocal_restore.oplog.rs
datotečni sistem - Uvoz v predhodnem koraku izvoženih podatkov
local.oplog.rs
z uporabo--oplogReplay
switcha
Bodi pozorn, da imaš v terminalski seji pravilno nastavljene spremenljivke, in da kažejo na pravo instaco:
username=
password=
mongohost=..internal
mongo_auth_options="--authenticationDatabase admin"
prav tako pa bodi POZOREN da imaš v skripti restoreOplogFromIncrementalBackup.sh
prave vrednosti, ki pravtako kažejo na oravo bazo/instanco.
Inkrementalni backupi so locirani v folderu /mongo-oplog-dump/data/
, ki je ločen disk na google cloud-u in je pripret na VM. Arhiviranje se izvaja na 5 minutnem intervalu. in je nastavljeno preko cron
-a.
1. Obnova celotne baze iz Google Cloud disk-snapshota
Restavriraj snapshot in ga pripni k instanci .
2. Identifikacija zadnjega timestampa pred odpovedjo
Zadnji timestemp je zapis ts
v bazi local.oplog.rs
. Vrednost zgleda: Timestamp({ t: 1736947493, i: 1 })
. kjer je številčna vrednost 1736947493
čas od leta 1970 v milisekundah. in i
iteracija znotraj timestampa.
oplog.rs
je živa baza in tudi ko miruje, se v njo dogajajo dodajajo zapisi. Po restavriraju diska iz snapshota z Google Clouda in zagonu se v oplog.rs začenjo takoj dodajati novi zapisi. Zato zadnji zapis (TIMESTEMP
) v bazi oplog.rs
ni "pravi" zadnji zapis.
Pravi zadnji zapis TIMSTEMPA je tisti, ki je najbljižji času odpovedi ali času od katerega želiš naprej restavrirati.
Ponavadi se išče večji skok TIMESTEMPA kar nakazuje, da je bilo v vmesnem času mirovanje (recimo odpoved) in restore.
Na primer: če restavrirmo mongo iz snepshota in je od časa zadnjega backupa (snepshota) do restora minilo nekaj ur se išče poskok v timestampu nekaj ur.
na primer:
TS: 1726217553
TS: 1726217555
TS: 1726217557 (zadnji zapis TS: ki, je bil v snapshotu, pred odpovedjo) *
TS: 1726221157 (nadaljevanje oploga po restoru) *
med prvo in drugo * je izrazit poskok v času (TIMESTEMPU), in se recimo ujema z časom odpovedi. potem je 1726217557 pravi TIMESTEMP
3. Obnova incrementalnih backupov v vmesno tabelo
Kaj naredi skripta restoreOplogFromIncrementalBackup.sh
?
Inkrementalni backupi so v časovnem zaporedju shranjeni na disk vsak v sojo mapo. V času pisanja je časovni okvir izvoza 5 minut.
Skripta v trenutnem direktoriju inkrementalnih backupov poišče vse folder-je med zapisom vnešenega/izbranega timestampa(LAST_TIMESTAMP
) do zadnjega narejenega incrementalnega backupa in le te restavrira v vmesno novo bazo local_restore.oplog.rs
.
!!!POMEMBNO PRED IZVAJANJE SKRIPT PREVERI, DA SO SPREMENLJIVKE MONGOHOST IN USERNAME IN PASSWORD PRAVILNI!!!
TIMESTEMP
iz prejšnjega koraka (2) se nastavi v skripti restoreOplogFromIncrementalBackup.sh
na način, da ga nastaviš za vrednost spremenljivke LAST_TIMESTAMP
.
Skripta restoreOplogFromIncrementalBackup.sh
se mora nahajati v folderju, kjer so inkamentalni backup-i V času pisanja je bilo to /mongo-oplog-dump/data/
zagon skripte:
./restoreOplogFromIncrementalBackup.sh
4. Odstranitev podvojenih zapisov
Ker smo v prejšnjem koraku izvedli restore v vmesno bazo local_restore.oplog.rs
in ta lahko vsebuje tudi zapise, ki se prekrivajo z zapisi v local.oplog.rs
je potrebno izbrisati podvojene zapise iz local_restore.oplog.rs
.
Zakaj pridemo do podvojenih zapisov?
Full backup snapshot se lahko izvede v intervalu, ko se je zgodil tudi incremental backup. Tako je del vsebine že v backupu/restavrirani bazi in v inkrementalnem backupu.
Zato je potrebno podvojene zapise v restavriranem backupu izbrisati. Pomemba podatka TIMESTEMP
in IERATION
.
Če v local.oplog.rs
"pravi" zadnji zapis 1736947493
in ITERATION 7
potem je potrebno iz local_restore.oplog.rs izbrisati vse zapise ki so manjši ali eneki 1736947493
in 7
Ukazi za ki prikaže koliko dokumnetov bi bilo potrebno izbrisati (Uporabi prevae vrednosti _TIMESTEMP_
in _ITERATION_
):
mongosh mongodb://${username}:${password}@${mongohost} ${mongo_auth_options} --quiet --eval 'printjson(db.getSiblingDB("local_restore").oplog.rs.find({ ts: { $lte: Timestamp({ t: _TIMESTEMP_, i: _ITERATION_ }) } }).count())'
Izvedi brisanje:
mongosh mongodb://${username}:${password}@${mongohost} ${mongo_auth_options} --quiet --eval 'db.getSiblingDB("local_restore").oplog.rs.deleteMany({ ts: { $lte: Timestamp({ t: _TIMESTEMP_, i: _ITERATION_ }) } })'
5. Izvoz oplog.rs
iz local_restore.oplog.rs
datotečni sistem
V prejšnjem koraku smo pripravili natančno manjkajoči del oploga.rs
. Zdaj ga moramo restavrirati nazaj v bazo local.oplog.rs
.
Spodnji ukaz nam bo izvozil local_restore.oplog.rs
v folder restore_data_from_specific_iteration_on/
, ki ga bomo kasneje restavrirali v bazo local.oplog.rs
.
Ukaz:
sudo mongodump mongodb://${username}:${password}@${mongohost} ${mongo_auth_options} --db local_restore --collection oplog.rs --out restore_data_from_specific_iteration_on/
Ko so podatki izvoženi preimenujemo folder local_restore
v local
sudo mv restore_data_from_specific_iteration_on/local_restore restore_data_from_specific_iteration_on/local
6. Uvoz v predhodnem koraku izvoženih podatkov local.oplog.rs
z uporabo --oplogReplay
switcha
Izvoženi podatki v mapi restore_data_from_specific_iteration_on/local
so pripravljeni za uvoz v bazo local.oplog.rs
ukaz za uvoz:
mongorestore mongodb://${username}:${password}@${mongohost} ${mongo_auth_options} --oplogReplay restore_data_from_specific_iteration_on/