Restore av senaste trn loggar


Tag : SQL Server

Här är ett T-sql script som i sin tur skapar ett restore script.

Ange vilka databaser source och destination, därefter läser scriptet in vilken trn logg som senast användes för restore.
Vidare ner så hämtar jag det in info kring vilka trn filer som finns men inte har lästs på än.
Sedan skapas ett script för att köra restore av databaserna med NoRecovery.

Tänk på att man eventuellt behöver lägga på en linked server eller liknande för att komma åt antingen dest eller source server.
Har du inte någon länk mellan maskinerna kan man även skriva in senast pålagda trn logg fil, hela sökvägen behövs.

-- Ange senaste trn filer om du inte kan nå source servern via t-sql
-- DECLARE @lastAppliedDb1 NVARCHAR(255) = N'Lastapplieddb1.trn';
-- DECLARE @lastAppliedDb2 NVARCHAR(255) = N'Lastapplieddb2.trn';

Här följer scriptet.

 

-- Define variables for databases

DECLARE @Sourcedb1 NVARCHAR(255) = N'Databas1'; DECLARE @Sourcedb2 NVARCHAR(255) = N'Databas2'; DECLARE @Destdb1 NVARCHAR(255) = N'Databas1'; DECLARE @Destdb2 NVARCHAR(255) = N'Databas2'; DECLARE @latestDb1 NVARCHAR(MAX); DECLARE @latestDb2 NVARCHAR(MAX);

-- Ange senaste trn filer om du inte kan nå source servern via t-sql -- DECLARE @lastAppliedDb1 NVARCHAR(255) = N'Lastapplieddb1.trn'; -- DECLARE @lastAppliedDb2 NVARCHAR(255) = N'Lastapplieddb2.trn';

-- Senaste pålagda trn för DB1 DECLARE @lastAppliedDb1 NVARCHAR(255); SELECT TOP 1 @lastAppliedDb1 = b.physical_device_name FROM msdb.dbo.restorehistory rh INNER JOIN msdb.dbo.backupset bs ON rh.backup_set_id = bs.backup_set_id INNER JOIN msdb.dbo.backupmediafamily b ON bs.media_set_id = b.media_set_id WHERE bs.database_name = @Destdb1 AND bs.type = 'L' -- Log backup ORDER BY rh.restore_date DESC;

-- Senaste pålagda trn för DB2 DECLARE @lastAppliedDb2 NVARCHAR(255); SELECT TOP 1 @lastAppliedDb2 = b.physical_device_name FROM msdb.dbo.restorehistory rh INNER JOIN msdb.dbo.backupset bs ON rh.backup_set_id = bs.backup_set_id INNER JOIN msdb.dbo.backupmediafamily b ON bs.media_set_id = b.media_set_id WHERE bs.database_name = @Destdb2 AND bs.type = 'L' -- Log backup ORDER BY rh.restore_date DESC;

-- Senaste trn från db1 WITH BackupFiles AS ( SELECT b.physical_device_name AS FileName, bs.backup_finish_date AS FileDate FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily b ON bs.media_set_id = b.media_set_id WHERE bs.database_name = @Sourcedb1 AND bs.type = 'L' -- Log backup ) SELECT @latestDb1 = STRING_AGG('RESTORE LOG [' + @Destdb1 + '] FROM DISK = ''' + FileName + ''' WITH NORECOVERY;', CHAR(13) + CHAR(10)) FROM BackupFiles WHERE FileName > @lastAppliedDb1;

-- Senaste trn från db2 WITH BackupFiles AS ( SELECT b.physical_device_name AS FileName, bs.backup_finish_date AS FileDate FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily b ON bs.media_set_id = b.media_set_id WHERE bs.database_name = @Sourcedb2 AND bs.type = 'L' -- Log backup ) SELECT @latestDb2 = STRING_AGG('RESTORE LOG [' + @Destdb2 + '] FROM DISK = ''' + FileName + ''' WITH NORECOVERY;', CHAR(13) + CHAR(10)) FROM BackupFiles WHERE FileName > @lastAppliedDb2;

-- Output restore script PRINT '--- SCRIPT FOR DB1 ---'; PRINT @latestDb1;

PRINT '--- SCRIPT FOR DB2 ---'; PRINT @latestDb2;

About

Det här är min digitala anteckningsbok för allt som har med databaser, automatisering och teknik att göra.
Här samlar jag alla de där skripten, lösningarna och knepen jag byggt på mig under åren – främst inom SQL Server och PowerShell.
Istället för att de ska ligga och damma i en glömd mapp delar jag med mig av dem här, så att både jag själv (när minnet sviker) och du förhoppningsvis kan spara några timmars klickande.