sql >> Database >  >> RDS >> Sqlserver

Een SQL Server-database herstellen (T-SQL)

Als u SQL Server Management Studio (SSMS) of een andere GUI gebruikt om uw databases te beheren, bent u misschien gewend om back-ups te maken en databases te herstellen met behulp van "aanwijzen en klikken".

Meestal houdt dit in dat u met de rechtermuisknop op de database klikt en Herstellen . selecteert of vergelijkbaar, en volg daarna de aanwijzingen (bijvoorbeeld bij het herstellen van een database in Azure Data Studio).

Maar als u het ooit met T-SQL moet doen, kunt u de RESTORE DATABASE gebruiken verklaring.

Voorbeeld

Hier is een eenvoudig voorbeeld:

RESTORE DATABASE World
  FROM DISK = N'/var/opt/mssql/Bak/World.bak' 
  WITH FILE = 1;

Dit is bijna zo eenvoudig als het maar zijn kan. De RESTORE DATABASE instructie heeft een vrij complexe syntaxis (zoals met de meeste dingen T-SQL), maar deze instructie is voldoende voor een standaard, standaard herstelbewerking.

In dit geval heb ik een database hersteld met de naam World uit een .bak-bestand. Ik gebruikte FROM DISK om aan te geven dat het uit een .bak-bestand kwam, en ik gaf het volledige pad naar dat bestand. Andere opties hier zijn FROM TAPE en FROM URL .

Ik heb ook WITH FILE = 1 hier, maar dat is sowieso de standaardwaarde. Deze clausule specificeert het te gebruiken back-upsetbestand. Dat wil zeggen, welke back-upset in het bestand moet worden gebruikt (een bestand kan meerdere back-upsets hebben).

Een lijst met back-upsets ophalen

U kunt RESTORE HEADERONLY . gebruiken om een ​​lijst met back-upsets in het bestand te krijgen. Meer specifiek, het retourneert een resultaatset van back-upheaderinformatie voor alle back-upsets.

Voorbeeld:

RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Dit levert veel kolommen op, dus ik zal ze hier niet allemaal presenteren.

Een van de kolommen heet Positie . Dit moet worden gebruikt met de FILE = optie bij het herstellen van de database.

Voorbeeld met meer opties

Hier is een voorbeeld met meer opties:

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;

Dit is eigenlijk het script dat Azure Data Studio voor mij heeft gegenereerd toen ik de GUI-interface gebruikte om een ​​herstelbewerking te starten. Wanneer u dat doet, geeft Azure Data Studio u de mogelijkheid om het herstel onmiddellijk uit te voeren of een script te genereren met de T-SQL-code dat u later kunt uitvoeren.

In dit geval gebruikt het script de MOVE argument om elke logische bestandsnaam in het back-upbestand te verplaatsen naar de opgegeven fysieke bestandslocatie op het besturingssysteem. In dit geval gebruikte het .bak-bestand een andere fysieke bestandslocatie (en gebruikte Windows-bestandspaden) en dit moest dus worden aangepast aan mijn systeem. Zie hieronder voor een uitleg over het verkrijgen van deze informatie.

De NOUNLOAD is eigenlijk een tape-optie. Het zorgt ervoor dat de tape niet van het station wordt verwijderd nadat het herstel is voltooid. Aangezien ik niet van tape aan het herstellen was, werd deze optie genegeerd.

De STATS argument kunt u de voortgang van de herstelbewerking meten. Het geeft aan dat er een bericht wordt weergegeven telkens wanneer een ander percentage is voltooid. Als u hier geen percentage invoert, geeft SQL Server een bericht weer nadat elke 10% is voltooid.

ALLEEN FILELISTEN HERSTELLEN

Als u een instructie wilt maken zoals de vorige, die de MOVE . gebruikt argument om elke logische bestandsnaam in het back-upbestand naar de opgegeven fysieke bestandslocatie op het besturingssysteem te verplaatsen, kunt u RESTORE FILELISTONLY gebruiken om de logische bestandsnamen (en meer) terug te geven.

RESTORE FILELISTONLY retourneert een resultatenset met een lijst van de database en logbestanden in de back-upset.

Hier is een voorbeeld met hetzelfde WideWorldImporters .bak-bestand uit het eerdere voorbeeld:

RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Resultaat (met verticale uitvoer):

-[ 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

We kunnen dus zien dat de fysieke locaties van dit bestand Windows-bestandspaden gebruiken. Bijvoorbeeld de eerste (met een logische naam van WWI_Primary ) heeft een fysieke locatie van D:\Data\WideWorldImporters.mdf .

In mijn geval heb ik de database hersteld naar SQL Server voor Linux (draaiend in een Docker-container op mijn Mac), dus toen ik dit .bak-bestand op mijn systeem herstelde, moest ik de fysieke paden aanpassen aan mijn systeem.

Natuurlijk kunt u indien nodig ook de bestandspaden wijzigen wanneer u het op een Windows-computer terugzet.

De volledige syntaxis

Het maken van back-ups en het herstellen van databases kan behoorlijk ingewikkeld zijn, afhankelijk van uw vereisten. De RESTORE verklaring is ontworpen om veel verschillende scenario's te dekken. Het omvat in het bijzonder de volgende herstelscenario's:

  • Herstel een volledige database vanaf een volledige databaseback-up (een volledig herstel).
  • Herstel een deel van een database (een gedeeltelijk herstel).
  • Specifieke bestanden of bestandsgroepen terugzetten naar een database (een bestandsherstel).
  • Specifieke pagina's terugzetten naar een database (een paginaherstel).
  • Herstel een transactielogboek in een database (een transactielogboekherstel).
  • Een database terugzetten naar het tijdstip vastgelegd door een database-snapshot.

De volledige syntaxis bevat veel opties, dus als uw vereisten het bestek van dit artikel overschrijden, bekijk dan de Microsoft-documentatie voor de officiële RESTORE syntaxis en uitleg.

Lees ook Microsoft's Restore and Recovery Overview voor een overzicht van de verschillende overwegingen en benaderingen voor het herstellen van databases.


  1. SQL Server-blokkeringsquery

  2. Controleer of de huidige datum tussen twee data ligt Oracle SQL

  3. Een getal opmaken als valuta in MariaDB

  4. Waarom neemt de automatische verhoging van MySQL toe bij mislukte invoegingen?