Kopiere en MSSQL-database

Bakgrunn

Prosedyren beskriver to metoder for å ta en fullstendig kopi (snapshot) av en database på filnivå. En slik backup gir hurtig restore, og kan med fordel brukes før man tester oppgraderinger eller om man ønsker en kopi av databasen for testformål. Eksemplene er fra en MSSQL 2008 server, men prosedyren kan brukes på de fleste MSSQL versjoner. Grensesnittet er varierer på de forskjellige versjonene, men det bør ikke være så vanskelig å finne igjen bildene på en nyere eller eldre utgave.

Hvilke filer?

Først må du finne ut hvilke filer som tilhører databasen du vil kopiere. En MSSQL database har vanligvis minst 2 filer: en .MDF (databasefil) og en .LDF (transaksjonslogg). Enkelte databaser har flere filer for å bedre ytelsen eller fordi de rett og slett er så store at de trenger flere filer. Dette kan man sjekke i Management Studio under egenskaper for den enkelte database:

clip_image002

Du vil vanligvis få en kopi til å virke uten transaksjonsloggen, men det er best å ta med begge. Bland for all del ikke transaksjonslogg og database fra forskjellige tilstander ved for eksempel bare å legge tilbake den ene filen om du skal gjenopprette, det vil ha katastrofale følger for dataintegriteten.

Dersom du kopierer begge filene må de være fra eksakt samme tilstand, dvs kopiert mens sql serveren var nede uten at det er gjort noen endringer i databasen mellom kopiering av logg og datafil.

Stoppe databasen: Rått og brutalt

clip_image004

For å ta en slik kopi må den aktuelle databasen stoppes helt, noe som medfører at alle brukere må logges av. Dette er av og til vanskelig å oppnå, eller det tar svært lang tid om det er mange påloggede brukere. For å omgå dette kan man rett og slett stoppe hele databaseserveren. Da logges alle brukere av, og ALLE databasene på denne serveren stoppes. Man kan gjøre dette på flere måter, men det greieste er å bruke services.msc.

Den lister alle serverinstanser dersom man har flere og andre SQL tjenester. Det er bare å velge SQL server tjenesten for riktig instans og trykke på den stopp-knappen. Dette vil også stoppe tilhørende tjenester som for eksempel SQL Server Agent. Det er viktig at disse også startes manuelt etter at man er ferdig og har restartet SQL Server tjenesten dersom de var startet før man stoppet serverinstansen. (agent tjenesten styrer blant annet vedlikehold og backup).

 

Stoppe databasen: En mer forsiktig tilnærming

Dersom man ikke vil eller kan stoppe hele serveren, kan man ta enkeltdatabaser offline. Dette gjøres fra Management Studio ved å høyreklikke på databasen og velge Tasks, Take Offline. clip_image006

Dette forutsetter imidlertid at alle brukertilkoblinger til databasen er avlogget, noe som kan være vanskelig om det er aktive brukere som ikke har fått med seg at man skal ta ned systemet for vedlikehold.

Man kan i så tilfelle kjøre følgende transact-sql kommando:

alter database {Databasenavn} set offline with rollback immediate

Dette vil terminere alle active forbindelser og rulle tilbake eventuelle pågående transaksjoner.

Kopiere

Så er det bare å kopiere filene som tilhører databasene man vil ha kopi av. Så lenge databasen er offline kan filene kopieres som en hvilken som helst annen fil.

Det er viktig å være sikker på at den faktisk er offline, da det ikke nødvendigvis kommer noen feilmelding om man kopierer en online database. Kopien er dog verdiløs. Status kan enkelt sjekkes i Server Management Studio. For å være helt sikker på at den er oppdatert kan du restarte studio først. clip_image008

Det kan være lurt å komprimere filene før man koipierer dem. Det vil vanligvis gjøre dem mye mindre, samtidig som det sikrer at man ikke blander forskjellige verjsoner av MDF og LDF filene.

Legge tilbake

Skal men legge tilbake en kopi på den samme serveren er det bare å ta databasen offline som beskrevet over og gi de eksisterende filene nytt navn før man legger tilbake kopien. Pass på at den fortsatt har eksakt det samme navnet som originalen, og at du har et sett med MDF og LDF filer som hører sammen, altså er kopiert ut samtidig. Om man bare har MDF filen må transaksjonsloggene slettes før man prøver å starte databasen. En slik situasjon kan medføre at forsøk på å ta databasen online feiler, men det kan stort sett rettes opp ved hjelp av diverse feilkorrigeringsverktøy. Så fremt databasen var i orden i det man tok kopien så skal den kunne startes opp med bare MDF filen og være intakt.

Online

Man må huske å starte serveren eller sette databasen online når man er ferdig, alt etter hvilken metode man valgte over. Om du tok ned hele serveren, husk at du også må starte de tilhørende tjenestene som SQL Server Manager manuelt.

Author: DizzyBadger

SQL Server DBA, Cluster expert, Principal Analyst

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.