Created
May 2, 2012 13:38
-
-
Save duncansmart/2576562 to your computer and use it in GitHub Desktop.
Restore SQL Server Database from BAK file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SET NOCOUNT ON | |
DECLARE @bakfile nvarchar(max) = 'C:\Temp\MyDb.BAK'; | |
DECLARE @dbname nvarchar(max) = 'MyDb'; | |
--DECLARE @datapath nvarchar(max) = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA'; | |
DECLARE @datapath nvarchar(max) = (SELECT TOP(1) left(physical_name, len(physical_name) - len('\master.mdf')) FROM master.sys.database_files) | |
--SELECT @datapath | |
--Drop db if exists | |
IF db_id(@dbname) IS NOT NULL | |
BEGIN | |
print '* Dropping ' + @dbname + '...' | |
USE master; | |
EXEC('ALTER DATABASE [' + @dbname + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; | |
DROP DATABASE [' + @dbname + ']'); | |
END | |
DECLARE @filelist TABLE( | |
LogicalName varchar(max), PhysicalName varchar(max), Type varchar(max), FileGroupName varchar(max), Size varchar(max), MaxSize varchar(max) | |
, FileId varchar(max), CreateLSN varchar(max), DropLSN varchar(max), UniqueId varchar(max), ReadOnlyLSN varchar(max), ReadWriteLSN varchar(max) | |
, BackupSizeInBytes varchar(max), SourceBlockSize varchar(max), FileGroupId varchar(max), LogGroupGUID varchar(max), DifferentialBaseLSN varchar(max) | |
, DifferentialBaseGUID varchar(max), IsReadOnly varchar(max), IsPresent varchar(max), TDEThumbprint varchar(max) | |
) | |
INSERT @filelist EXEC('RESTORE FILELISTONLY FROM DISK = N'''+ @bakfile +'''') | |
DECLARE @sql nvarchar(max) = 'RESTORE DATABASE ['+ @dbname +'] | |
FROM DISK = N'''+ @bakfile +''' | |
WITH FILE = 1 '; | |
--append WITH MOVEs... | |
SELECT @sql = @sql + char(10) + ', MOVE N''' + LogicalName + ''' TO N'''+ @datapath + '\' + @dbname | |
+ coalesce('_' + FileGroupName, '') | |
+ CASE Type WHEN 'D' THEN '.mdf' ELSE '_LOG.ldf' END | |
+ '''' | |
FROM @filelist; | |
PRINT '* Restoring ' + @dbname + '...' | |
--print @sql; | |
EXEC(@sql); | |
PRINT '* Setting to simple recovery and shrinking...' | |
EXEC('ALTER DATABASE [' + @dbname + '] SET RECOVERY SIMPLE'); | |
EXEC('DBCC SHRINKDATABASE(N''' + @dbname + ''') WITH NO_INFOMSGS'); | |
-- TODO: wire up users/logins |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment