--SCRIPT TO RESTORE BACKUP FOR ALL DATABASES, PLACED IN FOLDER CALLED
--ORIGIN_FOLDER, WITH THE INITIALS 'DBVF' AND EXTENSION '.BAK'
Additional instruction in code.
Regards.
--SCRIPT TO RESTORE BACKUP FOR ALL DATABASES, PLACED IN FOLDER CALLED
--ORIGIN_FOLDER, WITH THE INITIALS 'DBVF' AND EXTENSION '.BAK'
Additional instruction in code.
Regards.
--SCRIPT TO RESTORE BACKUP FOR ALL DATABASES, PLACED IN FOLDER CALLED --ORIGIN_FOLDER, WITH THE INITIALS 'DBVF' AND EXTENSION '.BAK' SET NOCOUNT ON --------------------------------------------------------------------- DECLARE @RESTORE_TYPE INT --VARIÁVEL UTILIZADA PARA INDICAR SE O RESTORE POSSUI OU NÃO --THIS VAR INDICATE THE EXIST ADITIONAL INCREMENTAL OR TRANSACTION LOGS --IF =0 FULL BACKUP IS RESTORED --IF =1 TRANSACTIONAL AND INCREMENTAL ADITIONAL BACKUPS ARE ALOWED --BACKUPS INCREMENTAIS E TRANSACTION LOG A SER APLICADOS --SE O VALOR DA VARIÁVEL @RESTORE_TYPE FOR IGUAL A 1, --É EFETUADO O RESTORE --DO ULTIMO BACKUP FULL E NÃO SERÁ POSSÍVEL COLOCAR INCREMENTAIS OU --TRANSACION LOGS ADICIONAIS. COM O VALOR PARA @RESTORE_TYPE=0 A BASE --FICA ABERTA AOS RESTORES ADICIONAIS PORÉM INATIVA ATÉ A FINALIZAÇÃO --DO RESTORE DE TODOS OS INCREMENTAIS OU LOGS SET @RESTORE_TYPE = 0 ----------------------------------------------------------------------- DECLARE @START_FOLDER VARCHAR(130), @END_FOLDER VARCHAR(130), @STOPAT SMALLDATETIME SET @END_FOLDER = 'E:\MSSQL\Data\' SET @START_FOLDER = 'E:\Backups\' --THE VAR @STOPAT IS USED FOR STOP RESTORE AT SPECIFIED DATETIME IF @RESTORE_TYPE=1 SET @STOPAT = '' --'2010-02-18 18:30:00' DECLARE @DEBUG INT,@CHECK INT --ADDITIONAL VARS FOR DEBUG PRINT MESSAGES AND CHECK NUMBER OF FILES --@DEBUG=0 - NO DEBUG --@DEBUG=1 - DEBUG SET @DEBUG=0 --------------------------------------------------------------------- DECLARE @DBID INT, @DATABASE VARCHAR(30), @COMANDO NVARCHAR(300), @COMANDO2 NVARCHAR(300), @SQL NVARCHAR(2000) DECLARE @DATAFILE VARCHAR(60), @DATAFILE2 VARCHAR(60), --IF YOU HAVE MORE THEN 2 DATA FILES IN YOU DATABASES, PLEASE CREATE ADDITIONAL VARS @DATALOG VARCHAR(30) --PRINT @COMANDODOS IF EXISTS ( SELECT * FROM TempDb.dbo.SysObjects WHERE NAME = '##db_restore' ) DROP TABLE ##db_restore IF EXISTS ( SELECT * FROM TempDb.dbo.SysObjects WHERE NAME = '##teste' ) DROP TABLE ##teste IF EXISTS ( SELECT * FROM TempDb.dbo.SysObjects WHERE NAME = '##HISTORY_BACKUP ' ) DROP TABLE ##HISTORY_BACKUP DECLARE @DEVICE VARCHAR(100), @COMANDODOS VARCHAR(200) SET @COMANDODOS = 'DIR /B ' + @START_FOLDER + '*.bak ' --FOLDER IS LOCATED IN YOU SQL SERVER, OFF COURSE CREATE TABLE ##teste ( texto NVARCHAR(255) ) INSERT INTO ##teste EXEC MASTER..XP_CMDSHELL @COMANDODOS PRINT @COMANDODOS CREATE TABLE ##db_restore ( DBID INT IDENTITY, BASE NVARCHAR(60), DEVICE NVARCHAR(100), COMANDO NVARCHAR(200), COMANDO2 NVARCHAR(200) ) DECLARE DEVICE CURSOR FOR SELECT texto FROM ##teste WHERE texto LIKE '%bdvf%' OPEN DEVICE FETCH NEXT FROM DEVICE INTO @DEVICE WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO ##db_restore ( BASE, DEVICE, COMANDO, COMANDO2 ) VALUES ( UPPER(REPLACE(REPLACE(@DEVICE, 'BDVF_', ''), '.bak', '')), @DEVICE, '''RESTORE FILELISTONLY FROM DISK =''''' + @START_FOLDER + @DEVICE + '''''''', '''RESTORE HEADERONLY FROM DISK =''''' + @START_FOLDER + @DEVICE + '''''''' ) FETCH NEXT FROM DEVICE INTO @DEVICE END CLOSE DEVICE DEALLOCATE DEVICE IF EXISTS ( SELECT * FROM TempDb.dbo.SysObjects WHERE NAME = '##HISTORY_BACKUP' ) DROP TABLE ##HISTORY_BACKUP EXEC SP_EXECUTESQL @SQL -- --------------------------------------------------------------- CREATE TABLE ##HISTORY_BACKUP ( BackupName NVARCHAR(300), BackupDescription NVARCHAR(2000), BackupType INT, ExpirationDate SMALLDATETIME, Compressed BIT, Position INT, DeviceType INT, UserName NVARCHAR(100), ServerName NVARCHAR(100), DatabaseName NVARCHAR(100), DatabaseVersion NVARCHAR(100), DatabaseCreationDate SMALLDATETIME, BackupSize NVARCHAR(30), FirstLsn NVARCHAR(100), LastLsn NVARCHAR(100), CheckpointLsn NVARCHAR(100), DifferentialBaseLsn NVARCHAR(100), BackupStartDate SMALLDATETIME, BackupFinishDate SMALLDATETIME, SortOrder INT, CodePage INT, UnicodeLocaleId INT, UnicodeComparisonStyle INT, CompatibilityLevel INT, SoftwareVendorId INT, SoftwareVersionMajor NVARCHAR(100), SoftwareVersionMinor NVARCHAR(100), SoftwareVersionBuild NVARCHAR(100), MachineName NVARCHAR(100), Flags BIT, BindingId NVARCHAR(100), RecoveryForkId NVARCHAR(100), Collation NVARCHAR(100) ) --------------------------------------------------------------- DECLARE DEVICE CURSOR FOR SELECT DBID, BASE, COMANDO, COMANDO2 FROM ##db_restore ORDER BY DBID OPEN DEVICE FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO, @COMANDO2 WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = 'IF EXISTS ( SELECT * FROM TempDb.dbo.SysObjects WHERE NAME = ''##' + @DATABASE + ''' ) DROP TABLE ##' + @DATABASE + '' EXEC SP_EXECUTESQL @SQL SET @SQL = 'create table ##' + @DATABASE + ' ( LogicalName VARCHAR(200), PhysicalName VARCHAR(200), Type VARCHAR(1),FilegroupName VARCHAR(200), Size VARCHAR(200),MaxSize VARCHAR(200))' EXEC SP_EXECUTESQL @SQL SET @SQL = 'insert ##' + @DATABASE + ' exec (' + @COMANDO + ')' EXEC SP_EXECUTESQL @SQL IF @@ERROR <>0 BEGIN SET @SQL = 'insert ##HISTORY_BACKUP exec (' + @COMANDO2 + ')' EXEC SP_EXECUTESQL @SQL END FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO, @COMANDO2 END CLOSE DEVICE DEALLOCATE DEVICE IF @DEBUG <>0 BEGIN SELECT * FROM ##HISTORY_BACKUP END ELSE BEGIN --RESTAURA DECLARE @TOTAL_ARQUIVOS_BASE INT DECLARE @VARLOOP INT DECLARE @BACKUP_TYPE INT DECLARE DEVICE CURSOR FOR SELECT DBID, BASE, COMANDO FROM ##db_restore --WHERE BASE='ARCMEDICOS' ORDER BY DBID OPEN DEVICE FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO WHILE @@FETCH_STATUS = 0 BEGIN --OBTEM OS NOMES DOS DATAFILES DAS BASES SET @SQL = N'SELECT @CHECK =COUNT (TYPE) FROM ##' + @DATABASE + ' WHERE TYPE=''D''' EXEC SP_EXECUTESQL @QUERY = @SQL, @params = N'@CHECK INT OUTPUT', @CHECK = @CHECK OUTPUT IF @DEBUG <>0 --PRINT @CHECK IF @CHECK >1 BEGIN SET @SQL = N'SELECT @DATAFILE =LOGICALNAME FROM ##' + @DATABASE + ' WHERE TYPE=''D'' AND FILEGROUPNAME = ''PRIMARY''' IF @DEBUG <>0 PRINT @SQL EXEC SP_EXECUTESQL @QUERY = @SQL, @params = N'@DATAFILE VARCHAR(60) OUTPUT', @DATAFILE = @DATAFILE OUTPUT SET @SQL = N'SELECT @DATAFILE2 =LOGICALNAME FROM ##' + @DATABASE + ' WHERE TYPE=''D'' AND FILEGROUPNAME <> ''PRIMARY''' EXEC SP_EXECUTESQL @QUERY = @SQL, @params = N'@DATAFILE2 VARCHAR(60) OUTPUT', @DATAFILE2 = @DATAFILE2 OUTPUT IF @DEBUG <>0 PRINT @SQL END ELSE BEGIN SET @SQL = N'SELECT @DATAFILE =LOGICALNAME FROM ##' + @DATABASE + ' WHERE TYPE=''D'' AND FILEGROUPNAME = ''PRIMARY''' EXEC SP_EXECUTESQL @QUERY = @SQL, @params = N'@DATAFILE VARCHAR(30) OUTPUT', @DATAFILE = @DATAFILE OUTPUT END IF @DEBUG <>0 PRINT @DATAFILE2 --OBTAIN DATALOGS NAMES SET @SQL = 'SELECT @DATALOG =LOGICALNAME FROM ##' + @DATABASE + ' WHERE TYPE=''L''' EXEC SP_EXECUTESQL @QUERY = @SQL, @params = N'@DATALOG VARCHAR(30) OUTPUT', @DATALOG = @DATALOG OUTPUT IF @DEBUG <>0 BEGIN PRINT @DATALOG PRINT 'DATA FILE= ' + @DATAFILE + '---- LOG FILE= '+ @DATALOG PRINT @DATALOG END --CHECK EXISTING ANOTHER BACKUPS TO BE RESTORED SET @TOTAL_ARQUIVOS_BASE = ( SELECT COUNT(BACKUPTYPE) FROM ##HISTORY_BACKUP WHERE DATABASENAME = @DATABASE AND backuptype <> 1 ) IF @TOTAL_ARQUIVOS_BASE > 0 --IF EXISTING SET ADDITIONAL RESTORE ON SET @RESTORE_TYPE = 1 ELSE SET @RESTORE_TYPE = 0 --IF NOT EXIST, SET FULL RESTORE --START RESTORE, MOVING DATA AND LOG FILES TO DESTINATION FOLDERS --RENAME FILES TO FORMAT @DATABASE.MDF E @DATABASE.LDF IF @RESTORE_TYPE = 1 --NOT FULL BEGIN IF @DEBUG <>0 PRINT 'NOT FULL' SET @SQL = 'RESTORE DATABASE ' + @DATABASE + ' FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH MOVE ''' + @DATAFILE + ''' TO ''' + @END_FOLDER + @DATABASE + '.mdf'', MOVE ''' + @DATALOG + ''' TO ''' + @END_FOLDER + @DATABASE + '.ldf'', NORECOVERY, NOUNLOAD, STATS = 10, FILE=1' IF @DEBUG <>0 BEGIN PRINT @DATABASE +' - total de backups='+ CONVERT(VARCHAR,@TOTAL_ARQUIVOS_BASE) PRINT @SQL END EXEC SP_EXECUTESQL @SQL --loop FOR ALL FILES IN BACKUPSET SET @VARLOOP = 0 WHILE @TOTAL_ARQUIVOS_BASE <> @VARLOOP - 1 BEGIN SET @VARLOOP = @VARLOOP + 1 --CHECK BACKUP TYPE IF=5 INCREMENTAL IF=2 BACKUP LOG SET @BACKUP_TYPE = ( SELECT BACKUPTYPE FROM ##HISTORY_BACKUP WHERE DATABASENAME = @DATABASE AND POSITION = @VARLOOP ) IF @TOTAL_ARQUIVOS_BASE >= @VARLOOP BEGIN IF @BACKUP_TYPE = 2 SET @SQL = 'RESTORE LOG [' + @DATABASE + '] FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH FILE = ' + CONVERT(VARCHAR, @VARLOOP) + ', NORECOVERY, NOUNLOAD, STATS = 10' IF @BACKUP_TYPE = 5 SET @SQL = 'RESTORE DATABASE [' + @DATABASE + '] FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH FILE ' + CONVERT(VARCHAR, @VARLOOP) + ', NORECOVERY, NOUNLOAD, STATS = 10' IF @DEBUG <>0 BEGIN PRINT @BACKUP_TYPE PRINT 'NOT CLOSE'--@SQL END EXEC SP_EXECUTESQL @SQL END ELSE BEGIN IF @BACKUP_TYPE = 2 SET @SQL =--'RESTORE FILE' + '-- WITH FILE =' + CONVERT (VARCHAR,@VARLOOP) 'RESTORE LOG [' + @DATABASE + '] FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH FILE = ' + CONVERT(VARCHAR, @VARLOOP) + ', NOUNLOAD, STATS = 10' IF @BACKUP_TYPE = 5 SET @SQL = 'RESTORE DATABASE [' + @DATABASE + '] FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH FILE ' + CONVERT(VARCHAR, @VARLOOP) + ', NOUNLOAD, STATS = 10' IF ISNULL(@STOPAT, '') <> '' SET @SQL = @SQL + ' ,STOPAT=N''' + CONVERT(VARCHAR, @STOPAT) + '''' IF @DEBUG <>0 BEGIN PRINT @BACKUP_TYPE PRINT @SQL END EXEC SP_EXECUTESQL @SQL END END END ELSE --FULL RESTORE, NO ADDITIONAL FILES BEGIN IF @DEBUG <>0 PRINT 'RESTORE FULL' SET @SQL = 'RESTORE DATABASE ' + @DATABASE + ' FROM DISK = N''' + @START_FOLDER + 'BDVF_' + @DATABASE + '.BAK'' WITH MOVE ''' + @DATAFILE + ''' TO ''' + @END_FOLDER + @DATABASE + '.mdf'',' IF @CHECK > 1 SET @SQL=@SQL + 'MOVE ''' + @DATAFILE2 + ''' TO ''' + @END_FOLDER + @DATABASE + '_FILE2.mdf'',' SET @SQL=@SQL +' MOVE ''' + @DATALOG + ''' TO ''' + @END_FOLDER + @DATABASE + '.ldf''' IF @DEBUG <>0 PRINT @SQL EXEC SP_EXECUTESQL @SQL END IF @@ERROR <> 0 PRINT 'RESTORE ERROR - ' + CONVERT(VARCHAR,@@ERROR) + @DATABASE + ' ---> ' + @SQL FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO END CLOSE DEVICE DEALLOCATE DEVICE --END RESTORE END --END OD PROCESS, DESTROY ALL TEMP TABLES DECLARE DEVICE CURSOR FOR SELECT DBID, BASE, COMANDO FROM ##db_restore ORDER BY DBID OPEN DEVICE FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = 'DROP TABLE ##' + @DATABASE PRINT @sql EXEC SP_EXECUTESQL @SQL FETCH NEXT FROM DEVICE INTO @DBID, @DATABASE, @COMANDO END CLOSE DEVICE DEALLOCATE DEVICE