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;