More complex script when full file paths are required
This one is not my script, but it's too useful not to share. I ran into an issue while trying to move from a source of SQL 2008 to a destination of SQL 2008 R2 that my restore failed because the file paths were not the same. So I used this script to generate the backup and restore commands.
SET NOCOUNT ON
DECLARE @Table TABLE (LogicalName varchar(128),[PhysicalName] varchar(128), [Type] varchar, [FileGroupName] varchar(128), [Size] varchar(128),
[MaxSize] varchar(128), [FileId]varchar(128), [CreateLSN]varchar(128), [DropLSN]varchar(128), [UniqueId]varchar(128), [ReadOnlyLSN]varchar(128), [ReadWriteLSN]varchar(128),
[BackupSizeInBytes]varchar(128), [SourceBlockSize]varchar(128), [FileGroupId]varchar(128), [LogGroupGUID]varchar(128), [DifferentialBaseLSN]varchar(128), [DifferentialBaseGUID]varchar(128), [IsReadOnly]varchar(128), [IsPresent]varchar(128), [TDEThumbprint]varchar(128))
DECLARE @CMDTable TABLE (Command varchar(4000))
DECLARE @CMDTable2 TABLE (Command varchar(4000))
DECLARE @Name varchar(255),
@FullFilePath varchar(255),
@DiffFilePath varchar(255),
@cmd varchar(4000),
@LogicalNameData varchar(128),
@LogicalNameLog varchar(128)
DECLARE MyCursor CURSOR FOR SELECT name FROM sys.databases WHERE NOT owner_sid = 0x01
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @FullFilePath = '\\BJOCA4AFGNSP102\B$\SQL\FULL\'+ @Name +'.BAK'
SET @DiffFilePath = '\\BJOCA4AFGNSP102\B$\SQL\DIFF\'+ @Name +'.BAK'
SET @cmd = 'BACKUP DATABASE ['+ @Name +'] TO DISK = ''' + @FullFilePath + ''' WITH FORMAT, STATS=10'
INSERT INTO @CMDTable(Command) VALUES (@cmd)
SET @cmd = 'BACKUP DATABASE ['+ @Name +'] TO DISK = ''' + @DiffFilePath + ''' WITH FORMAT, DIFFERENTIAL, STATS=10'
INSERT INTO @CMDTable(Command) VALUES (@cmd)
INSERT INTO @table EXEC('RESTORE FILELISTONLY FROM DISK=''' + @FullFilePath + '''')
SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')
SET @cmd = 'RESTORE DATABASE ['+ @Name +'] FROM DISK = ''' + @FullFilePath + ''' WITH MOVE ''' + @LogicalNameLog + ''' TO ''L:\LogFiles\' + @Name + '.LDB'', MOVE ''' + @LogicalNameData + ''' TO ''M:\DATA\' + @Name + '.MDB'', REPLACE, NORECOVERY'
INSERT INTO @CMDTable2(Command) VALUES (@cmd)
SET @cmd = 'RESTORE DATABASE ['+ @Name +'] FROM DISK = ''' + @DiffFilePath + ''' WITH MOVE ''' + @LogicalNameLog + ''' TO ''L:\LogFiles\' + @Name + '.LDB'', MOVE ''' + @LogicalNameData + ''' TO ''M:\DATA\' + @Name + '.MDB'', RECOVERY'
INSERT INTO @CMDTable2(Command) VALUES (@cmd)
DELETE @Table
FETCH NEXT FROM MyCursor INTO @Name
END
CLOSE MyCursor
DEALLOCATE MyCursor
SELECT Command AS 'Run at source' FROM @CMDTable
SELECT Command AS 'Run at destination' FROM @CMDTable2
SET NOCOUNT ON
DECLARE @Table TABLE (LogicalName varchar(128),[PhysicalName] varchar(128), [Type] varchar, [FileGroupName] varchar(128), [Size] varchar(128),
[MaxSize] varchar(128), [FileId]varchar(128), [CreateLSN]varchar(128), [DropLSN]varchar(128), [UniqueId]varchar(128), [ReadOnlyLSN]varchar(128), [ReadWriteLSN]varchar(128),
[BackupSizeInBytes]varchar(128), [SourceBlockSize]varchar(128), [FileGroupId]varchar(128), [LogGroupGUID]varchar(128), [DifferentialBaseLSN]varchar(128), [DifferentialBaseGUID]varchar(128), [IsReadOnly]varchar(128), [IsPresent]varchar(128), [TDEThumbprint]varchar(128))
DECLARE @CMDTable TABLE (Command varchar(4000))
DECLARE @CMDTable2 TABLE (Command varchar(4000))
DECLARE @Name varchar(255),
@FullFilePath varchar(255),
@DiffFilePath varchar(255),
@cmd varchar(4000),
@LogicalNameData varchar(128),
@LogicalNameLog varchar(128)
DECLARE MyCursor CURSOR FOR SELECT name FROM sys.databases WHERE NOT owner_sid = 0x01
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @FullFilePath = '\\BJOCA4AFGNSP102\B$\SQL\FULL\'+ @Name +'.BAK'
SET @DiffFilePath = '\\BJOCA4AFGNSP102\B$\SQL\DIFF\'+ @Name +'.BAK'
SET @cmd = 'BACKUP DATABASE ['+ @Name +'] TO DISK = ''' + @FullFilePath + ''' WITH FORMAT, STATS=10'
INSERT INTO @CMDTable(Command) VALUES (@cmd)
SET @cmd = 'BACKUP DATABASE ['+ @Name +'] TO DISK = ''' + @DiffFilePath + ''' WITH FORMAT, DIFFERENTIAL, STATS=10'
INSERT INTO @CMDTable(Command) VALUES (@cmd)
INSERT INTO @table EXEC('RESTORE FILELISTONLY FROM DISK=''' + @FullFilePath + '''')
SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')
SET @cmd = 'RESTORE DATABASE ['+ @Name +'] FROM DISK = ''' + @FullFilePath + ''' WITH MOVE ''' + @LogicalNameLog + ''' TO ''L:\LogFiles\' + @Name + '.LDB'', MOVE ''' + @LogicalNameData + ''' TO ''M:\DATA\' + @Name + '.MDB'', REPLACE, NORECOVERY'
INSERT INTO @CMDTable2(Command) VALUES (@cmd)
SET @cmd = 'RESTORE DATABASE ['+ @Name +'] FROM DISK = ''' + @DiffFilePath + ''' WITH MOVE ''' + @LogicalNameLog + ''' TO ''L:\LogFiles\' + @Name + '.LDB'', MOVE ''' + @LogicalNameData + ''' TO ''M:\DATA\' + @Name + '.MDB'', RECOVERY'
INSERT INTO @CMDTable2(Command) VALUES (@cmd)
DELETE @Table
FETCH NEXT FROM MyCursor INTO @Name
END
CLOSE MyCursor
DEALLOCATE MyCursor
SELECT Command AS 'Run at source' FROM @CMDTable
SELECT Command AS 'Run at destination' FROM @CMDTable2
Comments
Post a Comment