Om du använder SQL Server Management Studio (SSMS) eller något annat GUI för att hantera dina databaser, kan du vara van vid att säkerhetskopiera och återställa databaser med "peka och klicka".
Vanligtvis innebär detta att högerklicka på databasen och välja Återställ eller liknande, och följ sedan anvisningarna (till exempel när du återställer en databas i Azure Data Studio).
Men om du någonsin behöver göra det med T-SQL kan du använda RESTORE DATABASE
uttalande.
Exempel
Här är ett grundläggande exempel:
RESTORE DATABASE World
FROM DISK = N'/var/opt/mssql/Bak/World.bak'
WITH FILE = 1;
Detta är nästan så enkelt som det kan bli. RESTORE DATABASE
satsen har en ganska komplex syntax (som med det mesta av T-SQL), men den här satsen är tillräcklig för en grundläggande standardåterställningsoperation.
I det här fallet återställde jag en databas som heter World från en .bak-fil. Jag använde FROM DISK
för att ange att det var från en .bak-fil, och jag angav den fullständiga sökvägen till den filen. Andra alternativ här inkluderar FROM TAPE
och FROM URL
.
Jag har också inkluderat WITH FILE = 1
här men det är standardvärdet ändå. Den här klausulen anger säkerhetskopieringsuppsättningens filnummer som ska användas. Det vill säga vilken säkerhetskopieringsuppsättning som ska användas i filen (en fil kan ha flera säkerhetskopior).
Få en lista över säkerhetskopior
Du kan använda RESTORE HEADERONLY
för att få en lista över säkerhetskopior i filen. Mer specifikt returnerar den en resultatuppsättning av säkerhetskopiorhuvudinformation för alla säkerhetskopior.
Exempel:
RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Detta ger många kolumner så jag kommer inte att presentera dem alla här.
En av kolumnerna heter Position . Detta ska användas med FILE =
alternativet när du återställer databasen.
Exempel med fler alternativ
Här är ett exempel med fler alternativ:
RESTORE DATABASE [WideWorldImporters]
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak'
WITH FILE = 1,
MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',
MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',
MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',
MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',
NOUNLOAD,
STATS = 5;
Det här är faktiskt skriptet som Azure Data Studio genererade åt mig när jag använde GUI-gränssnittet för att initiera en återställningsåtgärd. När du gör det ger Azure Data Studio dig möjlighet att köra återställningen omedelbart eller generera ett skript med T-SQL-koden som du kan köra senare.
I det här fallet använder skriptet MOVE
argument för att flytta varje logiskt filnamn i backupfilen till den angivna fysiska filplatsen i operativsystemet. I det här fallet använde .bak-filen en annan fysisk filplats (och använde Windows-filsökvägar) och detta måste ändras för att passa mitt system. Se nedan för en förklaring av hur du får denna information.
NOUNLOAD
är faktiskt ett tejpalternativ. Det säkerställer att bandet inte laddas ur enheten när återställningen är klar. Eftersom jag inte återställde från band ignorerades det här alternativet.
STATS
argument låter dig mäta hur återställningen fortskrider. Den anger att ett meddelande kommer att visas varje gång en annan procentsats slutförs. Om du inte inkluderar ett procentvärde här, kommer SQL Server att visa ett meddelande efter att varje 10 % är klar.
ÅTERSTÄLL ENDAST FILELISTA
Om du ville skapa en sats som den tidigare, som använder MOVE
argument för att flytta varje logiskt filnamn i säkerhetskopian, till den angivna fysiska filplatsen i operativsystemet, kan du använda RESTORE FILELISTONLY
för att returnera de logiska filnamnen (och mer).
RESTORE FILELISTONLY
returnerar en resultatuppsättning som innehåller en lista över databasen och loggfilerna som finns i säkerhetskopian.
Här är ett exempel som använder samma WideWorldImporters .bak-fil från det tidigare exemplet:
RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------- LogicalName | WWI_Primary PhysicalName | D:\Data\WideWorldImporters.mdf Type | D FileGroupName | PRIMARY Size | 1073741824 MaxSize | 35184372080640 FileId | 1 CreateLSN | 0 DropLSN | 0 UniqueId | 8d30f4f9-a463-404f-805a-9bd1c634b66b ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 11993088 SourceBlockSize | 512 FileGroupId | 1 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 2 ]------------------------- LogicalName | WWI_UserData PhysicalName | D:\Data\WideWorldImporters_UserData.ndf Type | D FileGroupName | USERDATA Size | 2147483648 MaxSize | 35184372080640 FileId | 3 CreateLSN | 37000000095200001 DropLSN | 0 UniqueId | 28d406e0-78ff-4400-9a4b-3a05d136b1f3 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 434962432 SourceBlockSize | 512 FileGroupId | 2 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 3 ]------------------------- LogicalName | WWI_Log PhysicalName | E:\Log\WideWorldImporters.ldf Type | L FileGroupName | NULL Size | 104857600 MaxSize | 2199023255552 FileId | 2 CreateLSN | 0 DropLSN | 0 UniqueId | 6ac6807e-8774-415b-8efc-e8c569b0855e ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 0 SourceBlockSize | 512 FileGroupId | 0 LogGroupGUID | NULL DifferentialBaseLSN | 0 DifferentialBaseGUID | 00000000-0000-0000-0000-000000000000 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 4 ]------------------------- LogicalName | WWI_InMemory_Data_1 PhysicalName | D:\Data\WideWorldImporters_InMemory_Data_1 Type | S FileGroupName | WWI_InMemory_Data Size | 0 MaxSize | 0 FileId | 65537 CreateLSN | 624000000336200003 DropLSN | 0 UniqueId | f65663c8-a250-433e-bbe6-e13a5599a607 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 980090880 SourceBlockSize | 512 FileGroupId | 3 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL
Så vi kan se att de fysiska platserna för denna fil använder Windows-filsökvägar. Till exempel den första (med det logiska namnet WWI_Primary ) har en fysisk plats för D:\Data\WideWorldImporters.mdf .
I mitt fall återställde jag databasen till SQL Server för Linux (körs i en Docker-container på min Mac), så när jag återställde den här .bak-filen till mitt system var jag tvungen att ändra de fysiska sökvägarna för att passa mitt system.
Naturligtvis kan du också ändra filsökvägarna när du återställer den till en Windows-maskin om det behövs.
Den fullständiga syntaxen
Säkerhetskopiering och återställning av databaser kan vara ganska involverat, beroende på dina krav. RESTORE
uttalandet är utformat för att täcka många olika scenarier. I synnerhet täcker den följande återställningsscenarier:
- Återställ en hel databas från en fullständig databassäkerhetskopiering (en fullständig återställning).
- Återställ en del av en databas (en partiell återställning).
- Återställ specifika filer eller filgrupper till en databas (en filåterställning).
- Återställ specifika sidor till en databas (en sidåterställning).
- Återställ en transaktionslogg till en databas (en återställning av transaktionsloggar).
- Återställ en databas till den tidpunkt som fångats av en ögonblicksbild av databasen.
Den fullständiga syntaxen innehåller många alternativ, så om dina krav överskrider omfattningen av denna artikel, kolla in Microsofts dokumentation för den officiella RESTORE
syntax och förklaring.
Läs även Microsofts återställnings- och återställningsöversikt för en översikt över olika överväganden och metoder för att återställa databaser.