M-y-S-Q-L

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

分类:

技术点:

相关文章: