Backup og gjenoppretting i SQL Server
En backup er bare så god som den siste vellykkede gjenopprettingen du har testet. SQL Server har et fleksibelt og robust backupsystem, men det forutsetter at du forstår hvordan gjenopprettingsmodeller, fullbackup, differensielle backuper og loggbackuper henger sammen. Denne guiden forklarer begrepene, viser hvordan du lager en backupstrategi ut fra hvor mye data du tåler å miste, og går gjennom gjenoppretting til et bestemt tidspunkt.
- Start med to spørsmål: Hvor mye data tåler vi å miste (RPO), og hvor lenge kan systemet være nede (RTO)?
- Med gjenopprettingsmodellen Full og jevnlige loggbackuper kan du gjenopprette til et hvilket som helst tidspunkt.
- Med Simple kan du bare gjenopprette til siste full- eller differensielle backup.
- Bruk alltid
CHECKSUM, og test gjenoppretting regelmessig på en annen server. - Ha minst én kopi utenfor serveren, og helst én som ikke kan endres eller slettes (beskyttelse mot løsepengevirus).
RPO og RTO: start med kravene
En backupstrategi skal svare på forretningskrav, ikke tekniske preferanser:
- RPO (Recovery Point Objective): Hvor mye data kan vi miste? «Maks 15 minutter» betyr at du trenger loggbackup minst hvert 15. minutt.
- RTO (Recovery Time Objective): Hvor raskt må vi være oppe igjen? Det avgjør hvor backupen må ligge, hvor raske diskene må være, og om du i tillegg trenger løsninger for høy tilgjengelighet.
Snakk med de som eier systemet. Svaret «vi kan ikke miste noe» betyr i praksis høy tilgjengelighet med synkron replikering i tillegg til backup – backup alene gir aldri null datatap.
Gjenopprettingsmodeller
Hver database har en gjenopprettingsmodell (recovery model) som styrer hvordan transaksjonsloggen brukes, og dermed hvilke backuper som er mulige.
| Modell | Loggbackup | Gjenoppretting til tidspunkt | Passer for |
|---|---|---|---|
| Simple | Nei – loggen tømmes automatisk ved checkpoint | Nei, bare til siste full/differensielle backup | Test, utvikling, datavarehus som kan lastes på nytt |
| Full | Ja, og påkrevd | Ja, til et vilkårlig tidspunkt | De fleste produksjonsdatabaser |
| Bulk-logged | Ja | Begrenset i perioder med masseoperasjoner | Midlertidig under store importer |
-- Se gjenopprettingsmodell for alle databaser
SELECT name, recovery_model_desc
FROM sys.databases
ORDER BY name;
ALTER DATABASE Salg SET RECOVERY FULL;
Backuptypene
Fullbackup
En komplett kopi av databasen, pluss nok av transaksjonsloggen til at den kan gjenopprettes i en konsistent tilstand. Utgangspunktet for all gjenoppretting.
Differensiell backup
Alle endringer siden siste fullbackup (ikke siden forrige differensielle). Den vokser derfor gjennom uken hvis du tar fullbackup søndag. Ved gjenoppretting trenger du bare fullbackupen og den nyeste differensielle.
Loggbackup
Alle transaksjoner siden forrige loggbackup. Loggbackupene danner en sammenhengende kjede (log chain), og alle må være tilgjengelige fra fullbackupen frem til tidspunktet du vil gjenopprette til. Mister du én, stopper kjeden der.
Copy-only
En fullbackup som ikke påvirker den vanlige backupsekvensen. Bruk den når du trenger en kopi «på siden», for eksempel for å kopiere databasen til et testmiljø. En vanlig fullbackup tatt på siden, flytter utgangspunktet for de differensielle backupene og kan gi en ubehagelig overraskelse ved gjenoppretting.
Tail-log backup
En siste loggbackup av den aktive delen av loggen, tatt når databasen er skadet eller rett før du gjenoppretter over den. Den sørger for at du ikke mister transaksjonene etter siste planlagte loggbackup.
Et typisk backupoppsett
| Backup | Frekvens | Kommentar |
|---|---|---|
| Full | Daglig eller ukentlig | Ukentlig for store databaser, daglig for mindre. |
| Differensiell | Daglig (når full er ukentlig) | Gjør gjenopprettingen raskere enn å spille av en hel ukes logg. |
| Logg | Hvert 5.–15. minutt | Styres av RPO. Hyppig loggbackup holder også loggfilen liten. |
| Systemdatabaser | Daglig | master, msdb og model. Uten msdb mister du jobber og backuphistorikk. |
Backup med T-SQL
-- Fullbackup med komprimering og kontrollsum
BACKUP DATABASE Salg
TO DISK = N'B:\Backup\Salg_FULL_20261112.bak'
WITH COMPRESSION, CHECKSUM, STATS = 10;
-- Differensiell backup
BACKUP DATABASE Salg
TO DISK = N'B:\Backup\Salg_DIFF_20261113.bak'
WITH DIFFERENTIAL, COMPRESSION, CHECKSUM;
-- Loggbackup
BACKUP LOG Salg
TO DISK = N'B:\Backup\Salg_LOG_20261113_1015.trn'
WITH COMPRESSION, CHECKSUM;
-- Kontroller at backupfilen er lesbar (erstatter ikke en ekte gjenopprettingstest)
RESTORE VERIFYONLY
FROM DISK = N'B:\Backup\Salg_FULL_20261112.bak'
WITH CHECKSUM;
CHECKSUM gjør at SQL Server kontrollerer sidenes kontrollsummer mens backupen tas, og stopper hvis den finner skadde sider. Da oppdager du korrupsjon før den havner i alle backupene dine.
I praksis skriver få disse kommandoene selv. Gratisløsningen til Ola Hallengren (DatabaseBackup) eller PowerShell-modulen dbatools håndterer filnavn, opprydding av gamle filer og nye databaser automatisk. Se guiden om vedlikehold.
Gjenoppretting steg for steg
Gjenoppretting skjer i rekkefølge: full, deretter nyeste differensielle, deretter alle loggbackuper. Alle steg unntatt det siste kjøres med NORECOVERY, slik at databasen venter på flere backuper. Det siste steget kjøres med RECOVERY, som ruller tilbake ufullførte transaksjoner og åpner databasen.
-- 1. Ta tail-log backup hvis databasen fortsatt finnes (tar den samtidig offline for brukere)
BACKUP LOG Salg
TO DISK = N'B:\Backup\Salg_TAIL.trn'
WITH NORECOVERY, CHECKSUM;
-- 2. Fullbackup
RESTORE DATABASE Salg
FROM DISK = N'B:\Backup\Salg_FULL_20261112.bak'
WITH NORECOVERY, REPLACE;
-- 3. Nyeste differensielle
RESTORE DATABASE Salg
FROM DISK = N'B:\Backup\Salg_DIFF_20261113.bak'
WITH NORECOVERY;
-- 4. Loggbackupene i rekkefølge, og stopp på et bestemt tidspunkt
RESTORE LOG Salg FROM DISK = N'B:\Backup\Salg_LOG_20261113_1015.trn' WITH NORECOVERY;
RESTORE LOG Salg FROM DISK = N'B:\Backup\Salg_TAIL.trn'
WITH STOPAT = '2026-11-13T10:22:00', RECOVERY;
Gjenopprette til en ny database
Ofte vil du ikke overskrive produksjonsdatabasen, men hente ut data fra et tidligere tidspunkt – for eksempel etter at noen kjørte en DELETE uten WHERE. Gjenopprett da til et nytt navn og flytt filene med MOVE:
RESTORE FILELISTONLY FROM DISK = N'B:\Backup\Salg_FULL_20261112.bak';
RESTORE DATABASE Salg_Kopi
FROM DISK = N'B:\Backup\Salg_FULL_20261112.bak'
WITH MOVE 'Salg' TO N'D:\SQLData\Salg_Kopi.mdf',
MOVE 'Salg_log' TO N'L:\SQLLog\Salg_Kopi.ldf',
STATS = 10;
Hvor skal backupene ligge?
En backup på samme disk som databasen beskytter mot logiske feil, men ikke mot diskfeil, en tapt server eller løsepengevirus. Følg 3-2-1-regelen: tre kopier av dataene, på to ulike typer lagring, hvorav én utenfor huset. Moderne løsepengevirus leter aktivt etter og krypterer backupfiler, så minst én kopi bør være uforanderlig (immutable) – for eksempel i objektlagring med låsing, eller på et backupsystem som SQL Server-tjenesten ikke kan slette fra.
SQL Server kan skrive backup direkte til skyen:
- Azure Blob Storage med
BACKUP ... TO URL, autentisert med en SAS-token lagret som credential. - S3-kompatibel objektlagring fra SQL Server 2022, også lokale S3-løsninger.
Kryptering av backup
Backupfiler inneholder hele databasen. Krypter dem hvis de lagres utenfor et sikkert miljø:
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Et-langt-og-unikt-passord!';
CREATE CERTIFICATE BackupSertifikat WITH SUBJECT = 'Backupkryptering';
BACKUP DATABASE Salg
TO DISK = N'B:\Backup\Salg_FULL.bak'
WITH COMPRESSION, CHECKSUM,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = BackupSertifikat);
-- Uten sertifikatet kan backupen ikke gjenopprettes. Ta backup av det og lagre det trygt:
BACKUP CERTIFICATE BackupSertifikat
TO FILE = N'B:\Sikkert\BackupSertifikat.cer'
WITH PRIVATE KEY (FILE = N'B:\Sikkert\BackupSertifikat.pvk',
ENCRYPTION BY PASSWORD = 'Et-annet-langt-passord!');
Det samme gjelder databaser med Transparent Data Encryption (TDE): uten sertifikatet er både databasefilene og backupene ubrukelige på en annen server.
Test gjenopprettingen
En backup som aldri er gjenopprettet, er en antakelse, ikke en backup. Gjenopprett jevnlig til en testserver, kjør DBCC CHECKDB på resultatet, og mål hvor lang tid det tar – det er din faktiske RTO. Med dbatools kan du automatisere hele løpet:
# Gjenoppretter siste backup av alle databaser til en testserver, kjører CHECKDB og rydder opp
Test-DbaLastBackup -SqlInstance PROD01 -Destination TEST01
Sjekk også at backupene faktisk kjøres. Denne spørringen viser siste backup per type for hver database:
SELECT d.name AS DatabaseNavn,
d.recovery_model_desc,
MAX(CASE WHEN b.type = 'D' THEN b.backup_finish_date END) AS SisteFull,
MAX(CASE WHEN b.type = 'I' THEN b.backup_finish_date END) AS SisteDiff,
MAX(CASE WHEN b.type = 'L' THEN b.backup_finish_date END) AS SisteLogg
FROM sys.databases AS d
LEFT JOIN msdb.dbo.backupset AS b ON b.database_name = d.name
WHERE d.name <> 'tempdb'
GROUP BY d.name, d.recovery_model_desc
ORDER BY d.name;
Vanlige spørsmål
Er snapshot av den virtuelle maskinen nok som backup?
Ikke alene. VM-snapshots og backupverktøy på hypervisornivå kan være gode supplementer hvis de bruker VSS og er «SQL-aware», men de gir sjelden gjenoppretting til et vilkårlig tidspunkt, og de bryter ofte loggkjeden hvis de ikke er satt opp riktig. Behold SQL Server-backup som grunnmuren, og sjekk at VM-backupen tas med copy-only.
Hvor lenge skal jeg ta vare på backupene?
Det avhenger av krav fra virksomheten og lovverket. Et vanlig oppsett er noen dager lokalt for rask gjenoppretting, og uker eller måneder i rimeligere lagring. Husk at personopplysninger i backuper også er omfattet av personvernregelverket.
Kan jeg gjenopprette en backup til en eldre versjon av SQL Server?
Nei. En backup kan bare gjenopprettes på samme eller nyere versjon. Skal du flytte data til en eldre versjon, må du bruke eksport, for eksempel med BACPAC, skript eller verktøy som dbatools.