USE [master]
GO
/****** Object: StoredProcedure [dbo].[pr_DBA_RestoreTimeDatabase] Script Date: 01/10/2018 11:29:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— =============================================
— Author: <echo>
— Create date: <2016-04-28>
— Description: <还原trn>
— =============================================
ALTER PROCEDURE [dbo].[pr_DBA_RestoreTimeDatabase]
@dbName VARCHAR(100),
@Time DATETIME
AS
BEGIN

SET NOCOUNT ON;

DECLARE @IP VARCHAR(100)
declare @time1 nvarchar(50)
DECLARE @dbfile VARCHAR(200)
DECLARE @SQL VARCHAR(2000)
–获取数据库的IP(这个地方是通过之前创建的统计所有数据库信息的一张表来实现的)

SELECT @IP=IP FROM BeisenStatistics.dbo.tbl_MachineDbName where DBName=@dbName
–print @ip

–拼接数据库备份的文件名
select @dbfile=@dbName+CONVERT(varchar(10),@Time,112)+’.day’
–print @dbfile
–建立互信
SET @SQL = N”

set @SQL = ‘
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N”’+@dbName+””
–print @sql
exec(@sql)

SET @SQL = ‘xp_cmdshell ”net use ‘+’\\ip\db_backup\’+@IP+’ “密码” /user:prod\pro”’
–print @sql
EXEC(@SQL)

SET @SQL = ‘xp_cmdshell ”net use \\ip\AllDbStandbyLog “密码” /user:prod\pro”’
–print @sql
EXEC(@SQL)
–robocopy拷贝备份文件
set @SQL= ‘xp_cmdshell ”Robocopy.exe \\1ip\db_backup\’+@IP+’\ E:\cyt ‘+@dbfile+’ /ipg:30”’
–print @sql
exec(@sql)
–还原备份
set @SQL = ‘RESTORE DATABASE ‘+@dbName+’ FROM DISK = N”E:\cyt\’+@dbfile+”’ WITH FILE = 1, MOVE N”’+@dbName+”’ TO N”F:\datafile\’+@dbName+’_1.mdf”, MOVE N”’+@dbName+’_log” TO N”F:\logfile\’+@dbName+’_1.ldf”, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10′
–print @sql
exec(@sql)

—-将所有数据库trn文件导入临时表alltrn
–drop table #alltrn

CREATE TABLE #alltrn(name VARCHAR(500),filetime as stuff(STUFF(name,1,charindex(‘__’,name)+1,”),charindex(‘.’,STUFF(name,1,charindex(‘__’,name)+1,”)),4,”))

SET @SQL = ‘xp_cmdshell ”dir \\ip\AllDbStandbyLog\’+@dbName+’/b /o:d”’

–print @sql

INSERT INTO #alltrn
EXEC (@SQL)

–select * from #alltrn
–获取数据库备份的还原时间
DECLARE @date DATETIME
SELECT @date = MAX(backup_finish_date) FROM msdb.dbo.backupset where database_name=@dbName

–数据库需要的trn文件信息导入临时表trnfile
–drop table #trnfile

select * into #trnfile from #alltrn where dbo.fn_timestamp_to_datetime(filetime) >@date and dbo.fn_timestamp_to_datetime(filetime) <= DATEADD(N,15,@Time) and name is not null

–select * from #trnfile

–将数据库库需要的trn文件拷贝到本地
DECLARE @name NVARCHAR(200)
SET @name = N”

DECLARE cur CURSOR FOR
SELECT name from #trnfile where name IS NOT NULL
OPEN cur
FETCH NEXT FROM cur INTO @name
WHILE @@FETCH_STATUS=0
BEGIN
SET @SQL = ‘xp_cmdshell ”copy /Y \\ip\AllDbStandbyLog\’+@dbName+’\’+@name+ ‘ E:\cyt\trn\’+@name+””
–PRINT @SQL
EXEC(@SQL)
FETCH NEXT FROM cur into @name
END
CLOSE cur
DEALLOCATE cur

–还原数据库日志文件

— SELECT name FROM #trnfile
–WHERE dbo.fn_timestamp_to_datetime(filetime) >@date and dbo.fn_timestamp_to_datetime(filetime) < @Time
–ORDER BY dbo.fn_timestamp_to_datetime(filetime) ASC

DECLARE @noRestoredTrn VARCHAR(200)
DECLARE my_cursor1 CURSOR FOR
SELECT name FROM #trnfile
WHERE dbo.fn_timestamp_to_datetime(filetime) >@date and dbo.fn_timestamp_to_datetime(filetime) < @time
ORDER BY dbo.fn_timestamp_to_datetime(filetime) ASC
OPEN my_cursor1
FETCH NEXT FROM my_cursor1 INTO @noRestoredTrn
WHILE @@FETCH_STATUS = 0
BEGIN

SET @SQL = ‘RESTORE LOG [‘+@dbName+’] FROM DISK = N”E:\cyt\trn\’+@noRestoredTrn+”’ WITH norecovery ,replace’
–PRINT @SQL
EXEC(@SQL)
FETCH NEXT FROM my_cursor1 INTO @noRestoredTrn
END
CLOSE my_cursor1
DEALLOCATE my_cursor1

declare @trn varchar(200)
SELECT @trn= name FROM #trnfile
WHERE dbo.fn_timestamp_to_datetime(filetime) >= @time
–select @trn

set @sql = ‘RESTORE LOG [‘+@dbName+’] FROM DISK = N”E:\cyt\trn\’+@trn+”’ WITH FILE = 1, KEEP_REPLICATION, NOUNLOAD, STATS = 10, STOPAT = N”’+convert(varchar(20),@Time,126)+””
–print @sql
exec(@sql)

SET @SQL = ‘xp_cmdshell ”forfiles /p ‘+’E:\cyt\’+’ /m *.day /s /c “cmd /c del @file””’
–PRINT @SQL
EXEC(@SQL)

SET @SQL = ‘xp_cmdshell ”forfiles /p ‘+’E:\cyt\trn\’+’ /m *.* /s /c “cmd /c del @file””’
–PRINT @SQL
EXEC(@SQL)

END

版权声明:本文为M-y-S-Q-L原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/M-y-S-Q-L/p/8257700.html