sql >> Databasteknik >  >> RDS >> Sqlserver

Återställ en SQL Server-databas (T-SQL)

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.


  1. Hur man visar ett datum i tyskt format i SQL Server (T-SQL)

  2. Lista över MySQL-datumformatspecifikationer

  3. Hur man installerar Microsoft SQL på Linux

  4. Hur man installerar MySQL med phpMyAdmin på Ubuntu 12.04