数据库快照的脚本1:新建数据库快照
作者:[51ak ]
数据库快照的脚本1:新建数据库快照
数据库快照的脚本2:删除数据库快照
数据库快照的脚本3:更新快照物作业
这是我写的三个存储过程,可以用来快速完成数据库快照的生成和更新
create proc usp_SnapShot_create(
@dbname varchar(255), --数据库名
@snapname varchar(255),--快照名
@snap_dir varchar(255),--保存路径
@ischeck_dir bit =0 --是否检查和创建保存路径
)
as
/*
exec usp_SnapShot_create 'NorthWind','NorthWind','E:\Wokofo_Data_test'
用于创建数据库快照的脚本 2011-7-28
调试实例
declare @dbname varchar(255)
declare @snapname varchar(255)
declare @snap_dir varchar(255)
set @dbname='NorthWind'
set @snapname='NorthWind_snap1'
set @snap_dir='E:\Wokofo_Data_test'
*/
set nocount on
declare @db_files table(fname varchar(255))
insert into @db_files
Select name from master.sys.sysaltfiles where dbid=DB_ID(@dbname) and name not like '%_log'
if not exists(Select fname from @db_files)
begin
print 'ERR:没有找到对应的数据库或数据文件'
RETURN
end
--准备工作
if(RIGHT(@snap_dir,1)<>'\')
begin
set @snap_dir=@snap_dir+'\' ;
end
if(CHARINDEX(@dbname,@snap_dir)<3)
begin
set @snap_dir=@snap_dir+@snapname+'\' ;
end
--检查和创建文件夹
if(@ischeck_dir=1)
begin
begin try
DECLARE @mddir NVARCHAR(255)
SET @mddir='md '+@snap_dir
EXEC sp_configure'show advanced options', 1
reconfigure with override
EXEC sp_configure'xp_cmdshell', 1
reconfigure with override
EXEC master..xp_cmdshell@mddir
EXEC sp_configure'xp_cmdshell', 0
reconfigure with override
EXEC sp_configure'show advanced options', 0
reconfigure with override
end try
BEGIN CATCH
print 'ERR:创建路径时出现错误'+Error_Message();
end catch
end
--开始准备脚本
declare @sqlstr varchar(max)
set @sqlstr='CREATE DATABASE '+@snapname+ ' on'
while exists(Select fname from @db_files)
begin
declare @t_name varchar(255)
Select top 1 @t_name=fname from @db_files
set @sqlstr=@sqlstr+'
(NAME = N'''+@t_name+''', FILENAME = N'''+@snap_dir+@t_name+'.snap'')';
if((Select COUNT(1) from @db_files)>1)
begin
set @sqlstr=@sqlstr+','
end
delete @db_files where fname=@t_name
end
set @sqlstr=@sqlstr+' as snapshot of '+@dbname
print '生成快照的语句'
print @sqlstr
begin try
exec(@sqlstr)
print '创建数据库快照'+@snapname+'成功'
end try
BEGIN CATCH
print 'ERR:创建数据库快照'+@snapname+'失败' +Error_Message();
end catch