原文:https://www.cnblogs.com/jaday/p/6088200.html
需求介紹:每天備份線上正式庫並且把備份文件復制到測試服務器,測試服務器自動把數據庫備份文件還原。
方案介紹:
第1步:在正式庫上創建存儲過程用來備份數據庫和復制到測試服務器,然后新建作業每天定時執行創建的存儲過程。
第2步:在測試服務器數據庫上創建存儲過程用來還原數據庫,然后新建作業每天定時執行創建的存儲過程。
准備:
在正式服務器上共享備份文件的文件夾,並且給文件夾everyone的權限。
在測試服務器上創建共享文件夾,並且給文件夾everyone的權限。
正式庫備份數據庫和復制數據庫代碼:
--開啟 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
測試庫還原數據庫代碼:
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