
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;