83512 Wasserburg,Herrengasse 5 0152 53 55 26 40 Janke@innsql.de Mo-Fr. 09:00-16:00

Restore vom Directory

Dieses Script Restored alle bak Dateien  als Datenbank in den aktuellen SQL-Server.

Oftmals werden bei Migrationen zunächst die auf dem Quell-Server erstellten Bakup-Dateien in ein Verzeichnis des Zielservers kopiert. Das können durchaus, z.B. auf einem Pool-Server, hunderte Dateien sein.
"Von Hand" - wir sagen, das wäre viel zu aufwändig.
Das vorliegende Script, welches Sie auf dem Ziel-Server ausführen müssen, erwartet, das Sie das Verzeichnis mit den Bakup-Quellen angeben:

DECLARE @SourceDirBackupFiles nvarchar(200)='G:\LSIR1DB_BACKUP\'

Den Rest übernimmt dann das Skript alleine. Alle vorgefundenen Backups werden eingespielt.

{code lang:sql lines:false hidden:true

--- Erstellt automatisch die Restore Kommandos um Restore für alle Dateien aus einem

--- Verzeichnis zu erstellen.

--- bak und sav werden berücksichtigt

DECLARE @SourceDirBackupFiles nvarchar(200)='F:\Daten\SQL\Backup\Usr-DB\'

Declare @Whatif bit = 1 ---1 Kommandos ausgeben ---0 Kommandos direkt ausführen

Declare @DestDirDbFiles nvarchar(200)=null

Declare @DestDirLogFiles nvarchar(200) =null

declare @rc int

Declare @datadir nvarchar(4000) = NULL

if @DestDirDbFiles is null

SET @DestDirDbFiles= cast (SERVERPROPERTY ('InstanceDefaultDataPath') as varchar(255)) --- nur 2016!

IF @DestDirLogFiles is null

SET @DestDirLogFiles=cast (SERVERPROPERTY ('InstanceDefaultLogPath') as varchar(255)) --- nur 2016!

 

SET NOCOUNT ON

DECLARE @crlf char(2) = CHAR(13) + CHAR(10)

 

CREATE TABLE #Files(fname varchar(200),depth int, file_ int)

INSERT #Files

EXECUTE master.dbo.xp_dirtree @SourceDirBackupFiles, 1, 1

 

SELECT fname FROM #Files

Where ( fname Like ('%.sav') or fname Like ('%.bak') )

 

CREATE TABLE #HeaderResult(

BackupName nvarchar(128)

,BackupDescription nvarchar(255)

,BackupType smallint

,ExpirationDate datetime

,Compressed tinyint

,Position smallint

,DeviceType tinyint

,UserName nvarchar(128)

,ServerName nvarchar(128)

,DatabaseName nvarchar(128)

,DatabaseVersion bigint

,DatabaseCreationDate datetime

,BackupSize numeric(20,0)

,FirstLSN numeric(25,0)

,LastLSN numeric(25,0)

,CheckpointLSN numeric(25,0)

,DatabaseBackupLSN numeric(25,0)

,BackupStartDate datetime

,BackupFinishDate datetime

,SortOrder smallint

,[CodePage] smallint

,UnicodeLocaleId bigint

,UnicodeComparisonStyle bigint

,CompatibilityLevel tinyint

,SoftwareVendorId bigint

,SoftwareVersionMajor bigint

,SoftwareVersionMinor bigint

,SoftwareVersionBuild bigint

,MachineName nvarchar(128)

,Flags bigint

,BindingID uniqueidentifier

,RecoveryForkID uniqueidentifier

,Collation nvarchar(128)

,FamilyGUID uniqueidentifier

,HasBulkLoggedData bigint

,IsSnapshot bigint

,IsReadOnly bigint

,IsSingleUser bigint

,HasBackupChecksums bigint

,IsDamaged bigint

,BegibsLogChain bigint

,HasIncompleteMetaData bigint

,IsForceOffline bigint

,IsCopyOnly bigint

,FirstRecoveryForkID uniqueidentifier

,ForkPointLSN numeric(25,0)

,RecoveryModel nvarchar(128)

,DifferentialBaseLSN numeric(25,0)

,DifferentialBaseGUID uniqueidentifier

,BackupTypeDescription nvarchar(128)

,BackupSetGUID uniqueidentifier

,CompressedBackupSize bigint

,Containment bigint

,KeyAlgorithm nvarchar(32)

,EncryptorThumbprint varbinary(20)

,EncryptorType nvarchar(23)

)

 

CREATE TABLE #datenbankdateien(

LogicalName nvarchar(128)

,PhysicalName nvarchar(260)

,[Type] char(1)

,FileGroupName nvarchar(128)

,Size numeric(20,0)

,MaxSize numeric(20,0)

,FileId bigint

,CreateLSN numeric(25,0)

,DropLSN numeric(25,0)

,UniqueId uniqueidentifier

,ReadOnlyLSN numeric(25,0)

,ReadWriteLSN numeric(25,0)

,BackupSizeInBytes bigint

,SourceBlockSize bigint

,FilegroupId bigint

,LogGroupGUID uniqueidentifier

,DifferentialBaseLSN numeric(25)

,DifferentialBaseGUID uniqueidentifier

,IsReadOnly bigint

,IsPresent int

,TDEThumbprint uniqueidentifier

,SnapshotUrl nvarchar(360)

)

DECLARE @fname varchar(200)

DECLARE @dirfile varchar(300)

DECLARE @LogicalName nvarchar(128)

DECLARE @PhysicalName nvarchar(260)

DECLARE @type char(1)

DECLARE @DbName sysname

DECLARE @sql nvarchar(1000)

DECLARE files CURSOR FOR

SELECT fname FROM #Files

Where ( fname Like ('%.sav') or fname Like ('%.bak') )

DECLARE dbfiles CURSOR FOR

SELECT LogicalName, PhysicalName, Type FROM #datenbankdateien

OPEN files

FETCH NEXT FROM files INTO @fname

WHILE @@FETCH_STATUS = 0

BEGIN

SET @dirfile = @SourceDirBackupFiles + @fname

 

TRUNCATE TABLE #HeaderResult

INSERT #HeaderResult

EXEC('RESTORE HEADERONLY

FROM DISK = ''' + @dirfile + '''')

SET @DbName = (SELECT DatabaseName FROM #HeaderResult)

SET @sql = 'Alter Database [' + @DbName + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' +@crlf

+ 'go' + + @crlf

+ 'RESTORE DATABASE [' + @DbName + '] ' + @crlf

+ 'FROM DISK = ''' + @dirfile + '''' + @crlf

+ ' WITH REPLACE' + @crlf

+ ', STATS = 10 ' + @crlf

+ ', MOVE '

 

TRUNCATE TABLE #datenbankdateien

INSERT #datenbankdateien

EXEC('RESTORE FILELISTONLY

FROM DISK = ''' + @dirfile + '''')

OPEN dbfiles

 

WHILE 1 = 1

BEGIN

FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type

IF @@FETCH_STATUS <> 0

BREAK

IF @type = 'D'

BEGIN

SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirDbFiles + @LogicalName + '.mdf''' + @crlf

SET @sql = @sql + ', MOVE '

END

ELSE IF @type = 'L'

SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirLogFiles + @LogicalName + '.ldf''' + @crlf END

SET @sql = @sql + @crlf IF @Whatif=1 PRINT @sql ELSE EXEC(@sql) CLOSE dbfiles FETCH NEXT

FROM files INTO @fname END CLOSE files DEALLOCATE dbfiles DEALLOCATE files

DROP TABLE #Files

DROP TABLE #HeaderResult

DROP TABLE #datenbankdateien


{/code}

Download:

(0 Votes)

Uwe Janke

Contact Info

Addresse:
Herrengasse 5, 83512 Wasserburg am Inn

Ruf:
0152-53 55 26 40

Email:
Janke@innsql.de

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.