sql >> Database >  >> RDS >> Database

Back-up en herstel van FILESTREAM-enabled database

In mijn vorige artikelen heb ik uitgelegd hoe u de FILESTREAM-functie in een SQL-serverinstantie kunt maken en configureren. Bovendien heb ik laten zien hoe je een tabel kunt maken met een FILESTREAM-kolom en hot om de gegevens erin in te voegen en te verwijderen.

In dit artikel ga ik uitleggen hoe u een back-up kunt maken van de FILESTREAM-database en deze kunt herstellen. Bovendien ga ik demonstreren hoe je de FILESTREAM-bestandsgroep kunt herstellen zonder de database offline te maken.

Zoals ik in mijn vorige artikelen heb uitgelegd, moeten we bij het inschakelen van FILESTREAM op SQL Server-instantie een FILESTREAM-container maken met de FILESTREAM-bestandsgroep. Wanneer we een back-up maken van de FILESTREAM-enabled database, wordt een back-up van de FILESTREAM-bestandsgroep opgenomen in de back-upset. Wanneer we de database herstellen, herstelt SQL Server de database en de FILESTREAM-container en bestanden erin.

Wanneer we een back-up maken van een FILESTREAM-enabled database, zal het:

  • Maak een back-up van alle beschikbare gegevensbestanden van de database.
  • Maak een back-up van de FILESTREAM-bestandsgroep en de bestanden erin.
  • Back-up T-Log.

SQL Server biedt de flexibiliteit om alleen een back-up te maken van de FILESTREAM-container. Als bestanden in de FILESTREAM-container beschadigd raken, hoeven we niet de hele database te herstellen. We kunnen alleen de FILESTREAM-bestandsgroep herstellen.

In deze demo ga ik:

  • Leg uit hoe u een volledige back-up van de FS-database maakt en alleen een back-up van de FILESTREAM-container.
  • Leg uit hoe u de FILESTREAM-enabled database kunt herstellen.
  • Hoe de FILESTREAM-container online en offline te herstellen. Opmerking:SQL Server Enterprise-editie en ontwikkelaarseditie ondersteunen ONLINE herstel.

Demo instellen:

In deze demo ga ik het volgende gebruiken:

  1. Database :SQL Server 2017
  2. Software :SQL Server-beheerstudio.

Back-up maken van FILESTREAM-enabled database

Om het back-upproces te demonstreren, heb ik een FILESTREAM-enabled database gemaakt met de naam FileStream_Demo . Het heeft een FILESTREAM-tabel met de naam Document_Content .

Volledige databaseback-up

Het maken van een back-up van een FILESTREAM-database is een eenvoudig proces. Voer het volgende T-SQL-script uit om er een volledige back-up van te maken.

BACKUP DATABASE [FileStream_Demo] TO  DISK = N'E:\Backups\FileStream_Demo.bak'
 WITH NOFORMAT, NOINIT,  NAME = N'FileStream_Demo-Full Database Backup', 
 SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Het volgende is het back-uplogboek dat is gegenereerd door het uitvoeren van de bovenstaande back-upopdracht:

/*Begin Backup DataFile*/

Processed 568 pages for database 'FileStream_Demo', file 'FileStream_Demo' on file 1.

/*Begin backup of FILESTREAM container*/

10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
Processed 111106 pages for database 'FileStream_Demo', file 'Dummy-Documents' on file 1.

/*Begin backup of FILESTREAM container*/

Processed 4 pages for database 'FileStream_Demo', file 'FileStream_Demo_log' on file 1.
100 percent processed.

BACKUP DATABASE successfully processed 111677 pages in 18.410 seconds (47.391 MB/sec).

Zoals ik aan het begin van het artikel al zei, maakt de SQL-server eerst een back-up van het primaire gegevensbestand, vervolgens van secundaire gegevensbestanden en ten slotte van transactielogboeken. Zoals u kunt zien in het back-uplogboek, maakt u eerst een back-up van het primaire gegevensbestand van de SQL-server, vervolgens de FILESTREAM-bestandsgroep en de bijbehorende gegevens en ten slotte de transactielogboeken.

Back-up van FILESTREAM-container

Zoals ik aan het begin van het artikel al zei, kunnen we ook een back-up van de FILESTREAM-container genereren. Voer het volgende T-SQL-script uit om een ​​back-up van de FILESTREAM-container te maken.

BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO  DISK = N'E:\Backups\FS_Container.bak' 
WITH NOFORMAT, NOINIT,  NAME = N'FileStream_Demo-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Herstel FILESTREAM-enabled database

Wanneer we de FILESTREAM-database herstellen, herstelt SQL de FileStream-container samen met alle bestanden in de FILESTREAM-container.

Voer de volgende taken uit om de database te herstellen:

  1. Klik in SSMS met de rechtermuisknop op de database en selecteer Database herstellen .
  2. Selecteer in het dialoogvenster Herstellen Apparaat en klik op Bladeren . Er wordt een ander dialoogvenster geopend. Klik in het dialoogvenster op  Toevoegen .
  3. In het Back-upbestand zoeken dialoogvenster, navigeer door de mappenstructuur, klik op een goede back-up en klik op OK .
  4. Zodra de back-upinformatie is geladen in de Back-upsets om te herstellen rasterweergave, klik op OK om het proces te herstellen.

Als alternatief kunt u een database herstellen door de volgende opdracht uit te voeren:

USE [master]
RESTORE DATABASE [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Demo.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5
GO

FILESTREAM-enabled databaseherstelscenario

De FILESTREAM bestandsgroep herstelt het proces zoals het proces van het herstellen van bestandsgroepen.

Om het herstelscenario te genereren, maakt u een FILESTREAM-enabled database met de naam FileStream-Demo . De database heeft een FILESTREAM-tabel met de naam Document_Content . Voeg wat willekeurige gegevens en bestanden toe aan de Document_Content tafel.

Voer de volgende query uit om details in te vullen van bestanden die in de tabel zijn ingevoegd.

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

De uitvoer is als volgt:

Het volgende is een screenshot van de FILESTREAM-container:

Genereer eerst een volledige back-up van de database. Voer hiervoor het volgende commando uit.

BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\Full_FileStream_Demo_20180810.bak' WITH NOFORMAT, NOINIT,NAME = N'FileStream_Demo-Full Database Backup'

Genereer vervolgens een FILEGROUP-back-up van de FILESTREAM-bestandsgroep met de naam Dummy-Document door het volgende commando uit te voeren:

BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO  DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' 
WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full FILEGROUP Backup'

Om de FILESTREAM-corruptie te genereren, verwijdert u enkele bestanden uit de FILESTREAM-container. Zodra die bestanden zijn verwijderd, probeert u gegevens op te halen uit "Document_Content" door de volgende opdracht uit te voeren:

Use FileStream_Demo
Go
select * from Document_Content

U krijgt de volgende foutmelding:

Msg 233, Level 20, State 0, Line 122
A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, 
error: 0 - No process is on the other end of the pipe.)

Zie de volgende schermafbeelding:

Nu moeten we de FILESTREAM-container herstellen om deze fout te herstellen. We hebben een volledige back-up en back-up gemaakt van het Dummy-document bestandsgroep.

We kunnen de volledige FILESTREAM-container herstellen door de FILESTREAM-bestandsgroep te herstellen. Ik ga laten zien:

  1. Offline herstel van FILESTREAM bestandsgroep.
  2. Online herstel van FILESTREAM bestandsgroep.

Offline herstel van FILESTREAM container Filegroup

Omdat ik bestanden uit de FILESTREAM-container had verwijderd, hoeven we niet de hele database te herstellen. Daarom zullen we in plaats van de hele database te herstellen, de enige bestandsgroep herstellen. Om dat te doen, genereert u eerst een Tail-Log-back-up om de gegevenswijzigingen vast te leggen waarvan geen back-up is gemaakt. De Tail-log-back-up moet worden gemaakt met behulp van de NORECOVERY-optie om de database in de herstelstatus te brengen, en dat geeft de mogelijkheid om back-ups op de database toe te passen. Voer hiervoor de volgende query uit:

backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log_1.trn' With NORECOVERY

Zodra de Tail-log-back-up is gegenereerd, bevindt de database zich in de herstelmodus. Nu kunnen we de FILEGROUP-back-up toepassen op een database met de NORECOVERY-optie. Voer hiervoor het volgende commando uit:

use master
go
RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY,REPLACE;

Pas nu de Tail-log-back-up toe met de HERSTEL-optie. Voer hiervoor het volgende commando uit:

RESTORE LOG [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log_1.trn'

Zodra de back-up is hersteld, is de database online en worden alle bestanden hersteld in de FILESTREAM-container. Voer het volgende commando uit om het te verifiëren:

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

De uitvoer van de bovenstaande vraag is als volgt:

Online herstel van FILESTREAM bestandsgroep

Met behulp van SQL Server Enterprise Edition kunnen we de back-up herstellen wanneer de database online is. Als een bestand F1 van secundaire bestandsgroep FG-1 bijvoorbeeld beschadigd is, kunnen we bestand F1 herstellen terwijl de database online blijft. Herstelvolgorde van offline herstel en online herstel zijn hetzelfde.

Zoals hierboven vermeld, om een ​​online herstel van de FILESTREAM-bestandsgroep uit te voeren, maakt u het Dummy-Document gegevensbestand offline. Voer hiervoor het volgende commando uit.

use master
go
Alter database [FileStream_Demo] MODIFY FILE (NAME='Dummy-Documents',OFFLINE)

Voer de volgende vraag uit om de status van het bestand te controleren:

Use [FileStream_Demo]
Go
select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files

De uitvoer is als volgt:

We hebben al een back-up gemaakt van het Dummy-document bestandsgroep. Daarom, zodra het gegevensbestand offline is, herstelt u de FILEGROUP-back-up op een database met de NORECOVERY-optie. Voer hiervoor het volgende commando uit:

use master
go
RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY, REPLACE;

Maak nu een logback-up van de database om er zeker van te zijn dat het punt waarop het databestand offline ging, wordt vastgelegd. Voer hiervoor het volgende commando uit:

backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log1.trn'

Voer de volgende opdracht uit om de laatste T-Log-back-up te herstellen.

use master
go
RESTORE LOG [FileStream_Demo] FROM  DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log1.trn'

Zodra de logback-up is hersteld, worden alle bestanden in de FILESTREAM-container hersteld en is de bestandsgroep online. Om dat te verifiëren, voert u de volgende query uit:

Use [FileStream_Demo]
Go
select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files

De uitvoer is als volgt:

Zodra de back-up is hersteld, is de database online en worden alle bestanden hersteld in de FILESTREAM-container. Voer het volgende commando uit om het te verifiëren:

SELECT  
RootDirectory,  
FileName,  
FileAttribute,   
FileCreateDate,   
FileSize,  
FileStreamCol.PathName() AS FilePath FROM Document_Content  order by filesize desc

De uitvoer is als volgt:

Samenvatting

In dit artikel heb ik uitgelegd:

  1. Hoe maak je een back-up en herstel je de FILESTREAM-enabled database en FILESTREAM-bestandsgroep.
  2. Hoe FILESTREAM-bestandsgroep online en offline te herstellen.

  1. Foreign key naar een van de vele tabellen?

  2. MySQL - UPDATE meerdere rijen met verschillende waarden in één query

  3. Over het V-formaatelement in Oracle

  4. Python en MySQL gebruiken in het ETL-proces:Python en SQLAlchemy gebruiken