Pełny backup bazy i przyrostowy

Dla baz zwykle w maintance plan trzeba przygotować backup, gdzie np. w weekend/codziennie następuje pełen backup bazy, a w między czasie w krótszych interwałach dziennych/godzinowych następuje backupowanie przyrostowe. 

1) Pełny backup z kompresją:

BACKUP DATABASE [test1]
TO  DISK = N'C:\Baza_MDF\test1_20250815_1601_full.bak' 
WITH 
NOFORMAT, 
NOINIT,  
NAME = N'test1-Full Database Backup', 
SKIP, 
NOREWIND, 
NOUNLOAD, 
COMPRESSION,
STATS = 10, 
CHECKSUM
GO

declare @backupSetId as int
select @backupSetId = position 
from msdb..backupset 
where database_name=N'test1' and
backup_set_id=(select max(backup_set_id) 
from msdb..backupset where database_name=N'test1' )

if @backupSetId is null 
begin raiserror(N'Verify failed. Backup information for database ''test1'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N'C:\Baza_MDF\test1_20250815_1601_full.bak' 
WITH  
FILE = @backupSetId,  
NOUNLOAD,  
NOREWIND
GO

1) Przyrostowy backup z kompresją:

BACKUP DATABASE [test1] 
TO  DISK = N'C:\Baza_MDF\test1_20250815_1605_differential.bak' 
WITH  DIFFERENTIAL , 
NOFORMAT, 
NOINIT,  
NAME = N'test1-Diff Database Backup', 
SKIP, 
NOREWIND, 
NOUNLOAD, 
COMPRESSION,  
STATS = 10, 
CHECKSUM
GO

declare @backupSetId as int
select @backupSetId = position 
from msdb..backupset 
where database_name=N'test1' and
backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'test1' )

if @backupSetId is null 
begin raiserror(N'Verify failed. Backup information for database ''test1'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM  DISK = N'C:\Baza_MDF\test1_20250815_1605_differential.bak' WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND
GO

3) Przywracamy bazę z fulla i danego differential backup

Pamiętać: W SQL Server jak już przywrócisz bazę z FULL do jakiegoś Diff z opcją WITH RECOVERY, to baza wraca do normalnego trybu i łańcuch przywracania się kończy

Jeśli chcesz, aby kolejne backupy były kontynuacją tego stanu po Diff 1, 
to po przywróceniu z Diff 1 robisz od razu nowy full backup

a) Ubijamy sesje do danej bazy 

USE master;
GO

DECLARE @dbName SYSNAME = N'test1'; -- wpisz nazwę bazy
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += 'KILL ' + CAST(s.session_id AS NVARCHAR(10)) + ';'
FROM sys.dm_exec_sessions AS s
JOIN sys.dm_exec_requests AS r
    ON s.session_id = r.session_id
WHERE r.database_id = DB_ID(@dbName)
  AND s.session_id <> @@SPID; -- pomijamy swoje połączenie

-- Dodatkowo uwzględniamy sesje idle z sys.dm_exec_sessions
SELECT @sql += 'KILL ' + CAST(s.session_id AS NVARCHAR(10)) + ';'
FROM sys.dm_exec_sessions AS s
WHERE s.database_id = DB_ID(@dbName)
  AND s.session_id <> @@SPID;

IF @sql <> ''
BEGIN
    PRINT @sql; -- możesz sprawdzić przed wykonaniem
    EXEC sp_executesql @sql;
END
ELSE
    PRINT 'Brak aktywnych połączeń do bazy ' + @dbName;

b) Restore do danego punktu

Mając full i dany differental możemy zrobić restore w oparciu o daną przyrostówkę:

use master
RESTORE DATABASE test1
FROM DISK = 'C:\Baza_MDF\test1_20250815_1637_full.bak'
WITH NORECOVERY, REPLACE;

use master
RESTORE DATABASE test1
FROM DISK = 'C:\Baza_MDF\test1_20250815_1639_differential.bak'
WITH RECOVERY;