需求介紹:天天備份線上正式庫而且把備份文件複製到測試服務器,測試服務器自動把數據庫備份文件還原。html
方案介紹:shell
第1步:在正式庫上建立存儲過程用來備份數據庫和複製到測試服務器,而後新建做業天天定時執行建立的存儲過程。數據庫
第2步:在測試服務器數據庫上建立存儲過程用來還原數據庫,而後新建做業天天定時執行建立的存儲過程。服務器
準備:測試
在正式服務器上共享備份文件的文件夾,而且給文件夾everyone的權限。url
在測試服務器上建立共享文件夾,而且給文件夾everyone的權限。spa
正式庫備份數據庫和複製數據庫代碼:rest
--開啓 xp_cmdshell sp_configure 'show advanced options',1 reconfigure go sp_configure 'xp_cmdshell',1 reconfigure go
USE [master] GO /****** Object: StoredProcedure [dbo].[backup_db_ksedu] Script Date: 11/22/2016 08:41:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --備份數據庫 Create proc [dbo].[backup_db_ksedu] as Declare @strPsw varchar(50) Declare @strUsr varchar(50) Declare @strCmdShell varchar(300) Declare @strDataBaseName varchar(20) Declare @FullFileName Varchar(200) Declare @FullFileName1 Varchar(200) Declare @FullFileName2 Varchar(200) Declare @FileFlag varchar(50) Declare @FileFlag2 varchar(50) DECLARE @FileFlag3 varchar(50) Declare @ToFileName varchar(200) Declare @SQLStr varchar(500) Declare @SQLStr2 varchar(500) Declare @SQLStr3 varchar(500) Declare @FlagDel varchar(20) --定義備份的數據庫名稱 Set @strDataBaseName='數據庫名' --定義本地備份文件的名稱 Set @FileFlag=@strDataBaseName + '_db_' + replace(convert(char(20),getdate(),112),' ','') --定義本地1天前的備份文件名稱 --Set @FileFlag3=@strDataBaseName + '_db_' + replace(convert(char(20),getdate()-1,112),' ','') --定義遠程服務器3天前的備份文件名稱 --Set @FileFlag2=@strDataBaseName + '_db_' + replace(convert(char(20),getdate()-3,112),' ','') --設置遠程服務器的登陸域和用戶名 Set @strUsr='ZONGHEGUANLI-SQ\Administrator' --設置遠程服務器登陸密碼 Set @strPsw='abc123' --設置遠程服務器鏈接 Set @strCmdShell= 'net use \\xx.xxx.x.xxx\db_backup ' + @strPsw + ' /user:' +@strUsr --設置本地備份文件名稱 Set @FullFileName='e:\bak\'+@FileFlag+'.bak' --設置本地1天前的備份文件名稱 --set @FullFileName1='D:\Backup\'+@FileFlag3+'.bak' --設置遠程服務器3天前的備份文件名稱 --set @FullFileName2='\\172.17.1.10\j$\db_backup\'+@FileFlag2+'.BAK' --設置遠程服務器保存備份文件目錄 Set @ToFileName='\\xx.xxx.x.xxx\db_backup\' --Set @ToFileName='e:\Backup\' --設置爲True時,即刪除備份,設置爲False時,即不刪除備份文件 --Set @FlagDel='False' --設置從本地複製備份文件至遠程服務器的語句 Set @SQLStr='copy '+@FullFileName+' '+@ToFileName --設置刪除本地1天前的備份文件 --Set @SQLStr2='del ' +@FullFileName1 --設置刪除遠程服務器3天前的備份文件 --Set @SQLStr3='del ' +@FullFileName2 --備份數據庫 壓縮備份 BACKUP DATABASE @strDataBaseName TO DISK = @FullFileName WITH INIT, STATS = 20 --鏈接遠程服務器 exec master..xp_cmdshell @strCmdShell --複製備份文件至遠程服務器 exec Master..xp_cmdshell @SQLStr --刪除1天前本地的備份文件 --if (@FlagDel ='True') --exec master.. xp_cmdshell @SQLStr2 ----刪除3天前遠程服務器備份文件 --if (@FlagDel ='True') --exec master.. xp_cmdshell @SQLStr3
測試庫還原數據庫代碼:code
USE [master] GO /****** Object: StoredProcedure [dbo].[restore_db_ksedu] Script Date: 11/22/2016 08:40:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[restore_db_ksedu] AS Declare @strDataBaseName varchar(50) Declare @FileFlag varchar(50) --定義備份的數據庫名稱 Set @strDataBaseName='數據庫名' Set @FileFlag='d:\db_backup\'+@strDataBaseName + '_db_' + replace(convert(char(20),getdate(),112),' ','')+'.bak' --加上這句防止數據庫正在使用致使執行不成功 ALTER DATABASE [數據庫名] SET OFFLINE WITH ROLLBACK IMMEDIATE restore database [數據庫名] from disk=@FileFlag with file=1, REPLACE, recovery ALTER database [數據庫名] set online