[SQL Server]创建某DB的Snapshot,与从shapshot还原某DB

-- create a snapshot for a database.  (caution:  a database can't be backuped if there is a snapshot for it.)

Declare @INT_DB_NAME varchar(30),@INT_DB_NAME_SNAPSHOT varchar(40),@SQL varchar(1000)

set @INT_DB_NAME = 'test_db'

set @INT_DB_NAME_SNAPSHOT = @INT_DB_NAME+'_SNAPSHOT'

IF  EXISTS (SELECT name FROM sys.databases WHERE name = @INT_DB_NAME_SNAPSHOT) exec ('DROP DATABASE '+@INT_DB_NAME_SNAPSHOT)

set @SQL = 'create database  '+@INT_DB_NAME_SNAPSHOT+' ON'+char(13)

select @SQL=@SQL+'(Name = '+DB_FILE.name+',FileName = "'+REPLACE(REPLACE(upper(DB_FILE.physical_name),'.MDF','_snapshot.mdf'),'.NDF','_snapshot.ndf')+ '")'+char(13)+','from    master.sys.databases DB join    master.sys.master_files DB_FILE on DB. database_id= DB_FILE. database_id where DB.name = @INT_DB_NAME and upper(DB_FILE.type_desc)<>'LOG'

set @SQL = left(@SQL,len(@SQL)-1)+'AS SNAPSHOT OF '+@INT_DB_NAME

exec (@SQL)

 

 

-- restore a database from its snapshot

use master

Declare @INT_DB_NAME varchar(30),@INT_DB_NAME_SNAPSHOT varchar(40),@SQL varchar(1000)

set @INT_DB_NAME = 'test_db'

set @INT_DB_NAME_SNAPSHOT = @INT_DB_NAME+'_SNAPSHOT'

set @SQL='ALTER DATABASE '+@INT_DB_NAME+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'

exec (@SQL)

RESTORE DATABASE @INT_DB_NAME from DATABASE_SNAPSHOT = @INT_DB_NAME_SNAPSHOT

set @SQL='ALTER DATABASE '+@INT_DB_NAME+' SET MULTI_USER'

exec (@SQL)

 

你可能感兴趣的:([SQL Server]创建某DB的Snapshot,与从shapshot还原某DB)