Firebird Documentation Index → Firebirds nbackup-tool → Backups maken en terugzetten |
Vooraf: nbackup.exe
bevindt zich in de bin
-subdirectory van je Firebird-map. Typische locaties zijn
bijvoorbeeld C:\Program Files\Firebird\Firebird_2_0\bin
(Windows) of /opt/firebird/bin
(Linux). Net als de meeste
meegeleverde tools heeft nbackup geen grafische interface; je start
het vanaf de opdrachtregel of roept het aan vanuit een batchbestand of programma.
Bij zware belasting kunnen nbackup 2.0.3 en lager soms problemen veroorzaken die leiden tot vastlopers of zelfs beschadigde databases. Hoewel deze problemen niet vaak voorkomen, zijn ze toch ernstig genoeg om upgraden naar Firebird 2.0.4 of hoger te rechtvaardigen als je nbackup met een gerust hart wilt gebruiken. Bij grote databases op Posix-systemen kan ook het al dan niet toepassen van rechtstreekse invoer/uitvoer een rol spelen. Zie hiervoor de paragraaf Rechtstreekse I/O.
Om een volledige backup te maken luidt de opdracht:
nbackup [-U<gebr>
-P<wachtw>
] -B 0<database>
[<backupbestand>
]
Voorbeeld:
C:\Data> nbackup -B 0 inventaris.fdb inventaris_1-mrt-2006.nbk
De parameter -B
staat voor backup (goh!). Het
backupniveau 0 betekent dat er een volledige backup wordt
gemaakt. Backupniveaus hoger dan 0 worden gebruikt voor aanvullende backups; deze worden
verderop besproken.
In plaats van een databasebestandsnaam mag ook een alias worden opgegeven.
In plaats van een backupbestandsnaam mag ook stdout
worden opgegeven. De backup wordt dan naar de standaarduitvoer gestuurd en kan vandaar
worden doorgeleid naar bijvoorbeeld een bandarchief of een compressieprogramma.
De parameters -U
(user) en -P
(password) kunnen worden weggelaten als aan minstens één van de volgende voorwaarden is
voldaan:
De omgevingsvariabelen ISC_USER
en ISC_PASSWORD
zijn ingesteld, ofwel op SYSDBA, ofwel op de eigenaar van de
database.
Je bent als root ingelogd op een Posixsysteem. Dit maakt je automatisch SYSDBA.
Onder Windows: trusted authentication (vertrouwde
inlog) is aangezet in firebird.conf
, en het Windows-account
waaronder je bent aangemeld is eigenaar van de database. Dit is mogelijk vanaf
Firebird 2.1.
Onder Windows: je bent lid van de Administrators-groep èn trusted
authentication staat aan in firebird.conf
. In Firebird 2.1 heb
je dan automatisch SYSDBA-rechten. Vanaf Firebird 2.5 geldt als
aanvullende eis dat AUTO ADMIN MAPPING aangezet moet zijn in de
database.
Voor de overzichtelijkheid laten we de parameters -U
en
-P
in de voorbeelden telkens weg.
Met ingang van Firebird 2.5 kan in plaats van -P
<wachtwoord>
ook -FE
<bestandsnaam>
worden opgegeven. In dat geval wordt het
wachtwoord uit het opgegeven bestand gelezen. Voordeel is dat het wachtwoord zo beter
afgeschermd kan worden; het komt niet op de opdrachtregel terecht of in een
script/batchbestand waar mogelijk allerlei mensen bij kunnen.
(-FE
staat voor fetch, haal op.)
In Firebird 2.1 en hoger kan met de parameter -T
worden
voorkomen dat databasetriggers worden afgevuurd bij het maken van de backup. Voor meer
info zie Databasetriggers
onderdrukken.
Met ingang van Firebird 2.1.4 kan de gebruiker zelf bepalen of nbackup
rechtstreekse I/O toepast bij het maken van de backup. Dit gebeurt met de opties
-D
on
en -D
off
. Meer details en achtergronden in de paragraaf Rechtstreekse I/O,
elders in deze handleiding.
De verschillende parameters (-B
, -U
enz.) mogen in elke gewenste volgorde voorkomen. Wel moet elke parameter direct worden
gevolgd door zijn eigen bijbehorende argument(en). Voor -B
zijn
dat er drie: niveaugetal, database en backupbestand — in die volgorde!
Als de -B
-parameter als laatste komt,
mag de naam van het backupbestand worden weggelaten. nbackup stelt
dan zelf een naam samen, gebaseerd op de naam van de database, het backupniveau, de
datum en de tijd. Dit kan overigens tot een botsing leiden (en tot een mislukte backup)
als twee backupopdrachten van hetzelfde niveau in dezelfde minuut worden gegeven.
Gebruik nbackup niet voor databases die uit meerdere bestanden bestaan. Dit kan leiden tot corruptie en gegevensverlies, ondanks het feit dat nbackup niet zal protesteren tegen een dergelijke opdracht.
NB: Wat onder dit kopje volgt is géén noodzakelijke kennis voor het gebruik van
nbackup. Het geeft alleen een globaal (en onvolledig) beeld van wat er onder de motorkap
gebeurt tijdens de uitvoering van nbackup -B
:
Om te beginnen wordt het databasebestand vergrendeld door het wijzigen van een interne toestandsvlag. Vanaf dit moment worden alle wijzigingen in de database weggeschreven naar een tijdelijk bestand — het verschilbestand oftewel deltabestand.
Daarna wordt de feitelijke backup gemaakt. Dit is geen rechttoe-rechtane bestandskopie; terugzetten moet dus ook weer met nbackup gebeuren.
Nadat de backup gemaakt is, wordt de inhoud van het deltabestand geïntegreerd met het hoofdbestand. Vervolgens wordt het hoofdbestand ontgrendeld (vlag gaat weer op “normaal”) en de delta verwijderd.
De functionaliteit van de stappen 1 en 3 wordt verzorgd door twee nieuwe SQL-opdrachten: ALTER DATABASE BEGIN BACKUP en ALTER DATABASE END BACKUP. In tegenstelling tot hetgeen de namen suggereren, zorgen deze opdrachten niet voor het maken van de backup zelf; ze scheppen alleen de noodzakelijke voorwaarden waaronder het hoofdbestand veilig kan worden gebackupt. En voor alle duidelijkheid: je hoeft deze SQL-opdrachten niet zelf te geven; nbackup zorgt hiervoor, op de juiste momenten.
Een volledige backup wordt als volgt teruggezet:
nbackup -R<database>
[<backupbestand>
]
Voorbeeld:
C:\Data> nbackup -R inventaris.fdb inventaris_1-mrt-2006.nbk
Bij het terugzetten wordt geen niveau aangegeven.
Bij het terugzetten moet de parameter
-R
(restore) de laatste zijn; dit om redenen die later duidelijk
zullen worden.
In plaats van een databasebestandsnaam mag ook een alias worden opgegeven.
Als de opgegeven database al bestaat, mislukt het terugzetten en krijg je een foutmelding.
Ook bij het terugzetten mag de naam van het backupbestand worden weggelaten. Nbackup vraagt je dan om de naam alsnog op te geven. (Let op: In Firebird 2.0 is deze interactieve terugzetvoorziening defect; je krijgt dan een foutmelding en het terugzetten mislukt. Hersteld in 2.0.1.)
Het terugzetten werkt puur op bestandsniveau en kan dus ook worden uitgevoerd
zonder dat er een Firebirdserver draait. Eventuele met -U
en
-P
meegegeven inloggegevens worden genegeerd. Ook als de
-FE
-optie is gegeven, wordt het uit het bestand gelezen
wachtwoord niet gebruikt. Het wordt echter in eerste instantie wel ingelezen; treedt
daarbij een probleem op, dan mislukt het terugzetten.
De aanvullende-backupsvoorziening was compleet defect in Firebird 2.1, en weer hersteld in 2.1.1.
Om een aanvullende backup te maken geven we een niveau hoger dan 0 aan. Een
aanvullende backup van niveau N
bevat telkens de wijzigingen in
de database sinds de meest recente backup van niveau N-1
.
Voorbeelden:
Een dag na het maken van de volledige backup (met niveau 0) maak je er een met niveau 1:
C:\Data> nbackup -B 1 inventaris.fdb inventaris_2-mrt-2006.nbk
Deze backup bevat dus alleen de wijzigingen van de laatste dag.
Weer een dag later maak je er nog eentje van niveau 1:
C:\Data> nbackup -B 1 inventaris.fdb inventaris_3-mrt-2006.nbk
Deze backup bevat de wijzigingen van de laatste twee dagen, sinds de volledige backup, dus niet alleen die sinds de vorige niveau-1-backup.
Een paar uur later maken we een backup van niveau 2:
C:\Data> nbackup -B 2 inventaris.fdb inventaris_3-mrt-2006_2.nbk
Deze jongste backup bevat alleen de wijzigingen sinds de meest recente niveau-1-backup, dus die van de laatste paar uren.
Alle opmerkingen die gemaakt zijn bij het maken van volledige backups, gelden ook voor aanvullende backups.
Nogmaals: gebruik nbackup niet voor databases die uit meerdere bestanden bestaan.
Bij het terugzetten van aanvullende backups moet de hele reeks backupbestanden worden gespecificeerd vanaf niveau 0 tot en met het gewenste niveau. De database wordt daarbij altijd vanaf de grond opnieuw opgebouwd, in stappen (dit stapsgewijs aanvullen tot een volledig herstelde database verklaart de Engelse term incremental backup).
De formele syntaxis luidt:
nbackup -R<database>
[<backup0>
[<backup1>
[...
] ] ]
Het terugzetten van de niveau-2-backup uit het voorgaande voorbeeld gaat dus als volgt:
C:\Data> nbackup -R inventaris.fdb inventaris_1-mrt-2006.nbk inventaris_3-mrt-2006.nbk inventaris_3-mrt-2006_2.nbk
Uiteraard is de regel hier alleen gesplitst voor de overzichtelijkheid — in de praktijk typ je alles achter elkaar en drukt dan pas op Enter.
Opmerkingen (in aanvulling op de opmerkingen bij het terugzetten van een volledige backup):
Omdat bij de -R
-optie niet van tevoren bekend is hoeveel
bestandsnamen er zullen volgen (bij terugzetten geven we immers geen niveaugetal op),
gaat nbackup ervan uit dat alle argumenten na de -R
namen van
backupbestanden zijn. Het is hierom dat er na de lijst met bestandsnamen geen andere
parameter meer mag volgen.
Er is geen formele limiet aan het aantal backupniveaus, maar verder gaan dan niveau 3 of 4 zal in de praktijk zelden nut hebben.
Wat gebeurt er als je per ongeluk een bestand weglaat, of een reeks bestanden
opgeeft die niet allemaal bij elkaar passen? Je zou je voor kunnen stellen dat je in het
bovenstaande voorbeeld bij vergissing inventaris_2-mrt-2006.nbk
opgeeft in plaats van inventaris_3-mrt-2006.nbk
. Beide zijn
backupbestanden van niveau 1; in beide gevallen krijgen we dus een keurige niveaureeks 0,
1, 2. Maar het niveau-2-bestand is aanvullend ten opzichte van de niveau-1-backup van 3
maart, niet t.o.v. die van 2 maart.
Gelukkig kan een dergelijke vergissing nooit tot een foutief teruggezette database leiden. Elk backupbestand bevat namelijk een unieke ID. Voorts is in elke backup van niveau 1 of hoger de ID opgeslagen van de backup waarop hij gebaseerd is. Bij het terugzetten controleert nbackup deze gegevens; als er ergens in de keten iets niet klopt, wordt de operatie geannuleerd en krijg je een foutmelding.
Een Firebird-database hoeft geen bestand te zijn, maar kan zich ook op een zogeheten
kaal apparaat, bijvoorbeeld een schijfpartitie zonder bestandssysteem,
bevinden. De vraag waar de delta dan
geplaatst moet worden, is bij het ontwikkelen van nbackup in eerste
instantie over het hoofd gezien. Op Posix-systemen kon het zo gebeuren dat als de database
zich op /dev/hdb5
bevond, een deltabestand
/dev/hdb5.delta
werd aangemaakt. Dat is onwenselijk gezien aard en doel
van de /dev
-map en de meestal geringe beschikbare ruimte.
Vanaf Firebird 2.1 weigert nbackup dan ook te werken met databases op kale apparaten als niet expliciet een locatie voor het deltabestand is ingesteld. Hoe dit moet, wordt besproken in Het deltabestand instellen, verderop in deze handleiding.
Sinds versie 2.1 ondersteunt Firebird het gebruik van
databasetriggers. Deze kunnen o.a. worden afgevuurd bij het maken en
verbreken van een verbinding. Rond het uitvoeren van een backup maakt nbackup via de server
verbinding met de database (in sommige versies zelfs meermalen). Om nu te voorkomen dat
hierbij onbedoeld databasetriggers afgevuurd worden, kan de optie -T
worden meegegeven. NB: de overeenkomstige optie in gbak en
isql heet -nodbtriggers
(we zijn dol op
variatie, hier bij Firebird).
Oorspronkelijk gebruikte nbackup bij het maken van de backup onder Windows NT (en
afgeleiden zoals 2000, 2003 enz.) rechtstreekse invoer/uitvoer, en in alle andere gevallen
niet. Omdat dit op sommige Linuxsystemen voor problemen zorgde, werd in Firebird 2.0.6 en
2.1.3 ook onder Linux voor rechtstreekse I/O gekozen. Maar dit leidde weer tot problemen op
andere Linuxsystemen. Daarom is in 2.1.4 en 2.5 het standaardgedrag weer zoals voorheen, en is
een parameter -D
toegevoegd waarmee de gebruiker zelf de rechtstreekse
I/O aan of uit kan zetten. Het gebruik is als volgt:
nbackup -B 0 glazen.fdb glazen.nbk -D on -- rechtstreekse I/O aan nbackup -B 0 bekers.fdb bekers.nbk -D off -- rechtstreekse I/O uit
De argumenten ON en OFF zijn niet hoofdlettergevoelig, evenmin als de parameterletters zelf.
Rechtstreekse I/O wordt alléén toegepast bij het maken van een backup, niet bij het
terugzetten. Onder Windows wordt hiertoe FILE_FLAG_NO_BUFFERING
aangezet.
Op andere systemen worden O_DIRECT
en
POSIX_FADV_NOREUSE
gebruikt. Deze laatste twee vlaggen zijn soms niet
beschikbaar; in zo'n geval worden ze (of wordt er één) stilzwijgend weggelaten. Ook als de
gebruiker expliciet -D
on
heeft meegegeven,
leidt dit niet tot een waarschuwing of foutmelding.
Behalve de al genoemde parameters -FE
en
-D
zijn in Firebird 2.5 ook nog de volgende twee toegevoegd:
-Z
Toont éénregelige versie-informatie. Deze optie kan los worden gebruikt, maar ook
in combinatie met andere parameters zoals -B
,
-R
, -L
enz.
-?
Geeft een beknopt overzicht van het gebruik van nbackup en de diverse parameters. NB: als deze optie aanwezig is, worden alle andere parameters genegeerd!
Nbackup zelf werkt alleen op lokale databases. Maar vanaf Firebird 2.5 kunnen via de
Service Manager ook op verre machines backups en restores van het nbackup-type worden
uitgevoerd. Hiervoor gebruik je op de lokale machine het programma
fbsvcmgr.exe
, dat in dezelfde map staat als
nbackup.exe
en de overige Firebird-hulpprogramma's. Als eerste argument
geef je “hostnaam
:service_mgr
” op, waarbij je
hostnaam
natuurlijk vervangt door de naam van de verre server.
Overige parameters zijn:
-usergebrnaam
-passwordwachtwoord
-action_nbak -action_nrest -nbk_leveln
-dbnamedatabase
-nbk_filebestnaam
-nbk_no_triggers -nbk_direct on|off
Het maken van een volledige backup op de verre machine frodo
gaat dan bijvoorbeeld zo:
fbsvcmgr frodo:service_mgr -user sysdba -password masterke -action_nbak -nbk_level 0 -dbname C:\databases\landen.fdb -nbk_file C:\databases\landen.nbk
En van een latere aanvullende backup:
fbsvcmgr frodo:service_mgr -user sysdba -password masterke -action_nbak -nbk_level 1 -dbname C:\databases\landen.fdb -nbk_file C:\databases\landen_1.nbk
Terugzetten van de hele zwikzwak gaat als volgt:
fbsvcmgr frodo:service_mgr -user sysdba -password masterke -action_nrest -dbname C:\databases\landen_hersteld.fdb -nbk_file C:\databases\landen.nbk -nbk_file C:\databases\landen_1.nbk
Let op: in werkelijkheid moet elk van de bovenstaande opdrachten als één zin worden getypt, zonder regeleinden. Verder mogen de streepjes voor de parameternamen worden weggelaten, maar juist bij dit soort lange opdrachten is het meestal prettiger om ze wel te gebruiken: je ziet dan duidelijk de afzonderlijke parameters (de argumenten krijgen geen streepje).
Opmerkingen:
De Services Manager verlangt altijd authenticatie, hetzij automatisch (root onder
Posix, “trusted” onder Windows), hetzij expliciet via de parameters
-user
en -password
. De omgevingsvariabelen
ISC_USER
en ISC_PASSWORD
worden echter niet ingelezen.
AUTO ADMIN MAPPING in de database heeft geen effect als je vanaf een
andere machine verbinding maakt (maar misschien is dit afhankelijk van de configuratie van
het netwerk).
NB: Bij Windows trusted krijgt de Services Manager op de verre machine de
gebruikersnaam doorgegeven van de aanroeper op de lokale machine. Is de eigenaar van de
database een Windows-account (bijv. FRODO\PAUL
)
i.p.v. een Firebirdaccount, en komt de Windows-accountnaam van de aanroeper op de lokale
machine overeen met het eigenaar-account op de verre machine, dan wordt de aanroeper als
eigenaar erkend en kan de backup gemaakt worden. Dit kan een veiligheidsrisico opleveren,
want ook binnen een lokaal netwerk hoeft gebruiker PAUL
op de ene machine niet dezelfde persoon te zijn als
PAUL
op de andere.
Ook bij terugzetten (-action_nrest
) is authenticatie vereist,
maar de inloggegevens worden dan verder niet gebruikt. De gebruiker hoeft dus geen
eigenaar, SYSDBA of superuser te zijn. In geval van Windows trusted
authentication hoeft de gebruiker op de verre machine (waar de database zich bevindt)
zelfs helemaal niet te bestaan.
Deze zwakke authenticatie levert ook weer een potentieel veiligheidsrisico op. Stel dat er van een gevoelige database nbackups worden gemaakt, en dat deze op bestandsniveau goed worden beveiligd. Een willekeurige gebruiker kan dan niet met nbackup de database herstellen, want nbackup draait in de procesruimte van de gebruiker. Maar diezelfde gebruiker kan – als hij locatie en bestandsnaam weet, of deze op grond van analogie kan raden – wellicht met fbsvcmgr de database naar een publieke map terugzetten en hem aldus te pakken krijgen. Immers, fbsvcmgr roept de Firebirdserver aan en die heeft mogelijk wèl bestandstoegang tot de backup. Natuurlijk zijn hier oplossingen voor te bedenken, maar het is wel zaak om je van dit risico bewust te zijn.
De Services Manager kan ook lokaal worden gebruikt; het eerste argument wordt dan
service_mgr
, zonder hostnaam. Bij lokaal gebruik heeft
AUTO ADMIN MAPPING wel het normale effect; dit geldt ook als je
bijvoorbeeld localhost:
of de naam van de lokale machine voorvoegt.
Lokaal gebruik van de Services Manager kan van nut zijn als je zelf geen bestandstoegang
hebt tot database en/of backup, en het Firebirdproces wel. Heb je wel voldoende
bestandsrechten, dan kun je beter nbackup zelf gebruiken, met zijn veel kortere
opdrachtregels.
Gebruik van -nbk_no_triggers
of
-nbk_direct
bij -action_nrest
leidt tot een
foutmelding. Nbackup zelf is hier soepeler in: die negeert de parameters
-T
en -D
gewoon als je ze gebruikt waar ze
niet van toepassing zijn.
In plaats van een databasenaam mag ook een alias worden gebruikt.
Een backupschema met gebruik van nbackup zou er als volgt uit kunnen zien:
Elke maand een volledige backup (niveau 0);
Elke week een niveau 1;
Dagelijks een niveau 2;
Elk uur een niveau 3.
Zolang alle backups bewaard worden, kun je met dit schema de database herstellen tot de toestand van elk gewenst uur in het verleden. Hierbij worden voor elke herstelactie maximaal vier backupbestanden gebruikt. Natuurlijk regel je e.e.a. zo dat de grotere, tijdrovende backups op rustige uren gepland worden. In dit geval zouden de backups van de niveaus 0 en 1 in de weekeinden gemaakt kunnen worden, en die van niveau 2 's nachts.
Wil je niet alles voor de eeuwigheid bewaren, dan kun je er een wisschema aan koppelen:
Niveau-3-backups worden gewist als ze ouder zijn dan acht dagen;
Backups van niveau 2 na een maand;
Niveau 1 na zes maanden;
Niveau 0 na twee jaar, behalve bijvoorbeeld de eerste van elk jaar.
Dit is uiteraard maar een voorbeeld. Wat in een bepaald geval nuttig is, hangt af van de toepassing, de databasegrootte, de activiteit, enzovoort.
Je weet nu alles wat nodig is om met nbackup volledige en/of aanvullende backups te maken en terug te zetten. Je hoeft alleen verder te lezen als je backuptools naar keuze wilt gebruiken voor je Firebird-databases (zie Vergrendelen en ontgrendelen), of als je de standaardnaam of -locatie van het deltabestand wilt aanpassen (zie Het deltabestand instellen).
Heb je daar allemaal geen behoefte aan, dan wensen we je veel succes toe bij het werken met nbackup!
Firebird Documentation Index → Firebirds nbackup-tool → Backups maken en terugzetten |