1. 程式人生 > >SqlSever 資料庫批量備份&還原 指令碼

SqlSever 資料庫批量備份&還原 指令碼

批量備份指令碼

Use master
GO
/*=================Usp_BackUp_DataBase========================
  =====BackUp Sigle DataBase                            ======
  =====Ken.Guo                                          ======
  =====2010.9.10                                         ======
  =====Version: 2005 & 2008 SQL Server                  ======
  =====EXEC Usp_BackUp_DataBase 'MyDB','D:\BackUp'      ======
  ============================================================
*/
CREATE PROC   [dbo].[Usp_BackUp_DataBase] @DatabaseName   nvarchar(200),@Path   nvarchar(200)   
AS  
  BEGIN 
  DECLARE   @fn   varchar(200)
           ,@sql   varchar(1000)   
  SET   @fn   =   @Path   +(case   when   right(@Path,1)   <>'\'   then   '\'   else   ''   end)   
  
[email protected]
+'_' +convert(char(8),getdate(),112)+'_' +replace(convert(char(8),getdate(),108),':','') +'.bak' set @sql = 'backup database ['[email protected] + '] to disk = N''' + @fn + '''' --SELECT @sql EXEC(@sql) END GO --建立還原資料庫儲存過程 Use master GO /*=============BackUp Mutile DataBase=========================*/ DECLARE @dbname nvarchar(200) ,@backup_path nvarchar(200) SET @backup_path='E:\BackUp\' DECLARE db_info CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR --根據查詢,新增其他篩選條件 SELECT name FROM master.sys.databases WITH(NOLOCK) WHERE database_id>4 OPEN db_info FETCH NEXT FROM db_info INTO @dbname WHILE @@FETCH_STATUS=0 begin EXEC master.dbo.Usp_BackUp_DataBase @dbname,@backup_path FETCH NEXT FROM db_info INTO @dbname END close db_info deallocate db_info

批量還原指令碼

use master   
go  
  
EXEC sys.sp_configure N'show advanced options', N'1'  RECONFIGURE WITH OVERRIDE  
Go  
EXEC sys.sp_configure N'xp_cmdshell', N'1'  --  
Go  
RECONFIGURE WITH OVERRIDE  
go  
----------------------------------------------------------------------------------------------------------  
--指令碼正文  
declare @strPath as varchar(50)  
--需要還原的本地檔案目錄  
set @strPath='D:\BackUp'  
declare @strFirstRunSql as Nvarchar(max)=N''  
declare @strRunSql as Nvarchar(max)=N''  
declare @DataBaseName as varchar(50)  
declare @MaxOrder as char(6)  
declare @oldfilName as varchar(100)  
  
--獲取資料夾下所有檔名稱存入臨時表  
SET NOCOUNT ON  
--存放目錄下檔名  
declare @FileList table(id int identity(1,1) primary key,fillname varchar(50),death int,isfile int)  
--存放需要處理檔案詳細資訊  
declare @fileDesc table(id int identity(1,1) primary key,DataBaseName varchar(50),typename char(3),OrderNum char(6),oldstr varchar(100))  

--存放bak詳細資訊  
declare @bakFileDesc table(id int identity(1,1) primary key,LogicalName varchar(255), PhysicalName varchar(255),  
                        Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20), Fileld VARCHAR(20),   
                        CreateLSN VARCHAR(20), DropLSN VARCHAR(20), Uniqueld uniqueidentifier, ReadOnlyLSN VARCHAR(20),  
                         ReadWriteLSN VARCHAR(20), BackupSizeInBytes VARCHAR(255), SourceBlockSize VARCHAR(20), FileGroupld VARCHAR(20),  
                         LogGroupGUID VARCHAR(20), DifferentialBaseLSN VARCHAR(20), DifferentialBaseGUID uniqueidentifier,   
                        IsReadOnly VARCHAR(20), IsPresent VARCHAR(20),TDEThumbprint varchar(50) null)  
  
insert into @FileList  
EXEC Master.dbo.xp_DirTree @strPath,1,1  

--字串切割獲取需要部分  

insert into @fileDesc  
select   left(fillname,charindex('_',fillname,1)-1) as DataBaseName  
,right(fillname,3) as typename,left(right(fillname,10),6) as OrderNum,fillname as oldstr   
from @FileList   
where (right(fillname,3)='bak' or right(fillname,3)='dif')-- and  LEN(fillname)>29  
order by DataBaseName,typename,OrderNum  

  
declare TbCursor cursor   
    LOCAL   
    STATIC   
    FORWARD_ONLY   
    READ_ONLY   
for  
select DataBaseName,OrderNum,oldstr  
from @fileDesc as tb  
where --databasename not in (select name from sys.databases with(nolock)) and   
    exists (  
    select 1 from   
    (  
    select  DataBaseName,max(OrderNum) as MaxOrder from @fileDesc   
    where typename ='bak'   
    group by DataBaseName  
    )tb1      
    where tb.DataBaseName=tb1.DataBaseName and tb.OrderNum=tb1.MaxOrder  
)  
open TbCursor  
FETCH NEXT FROM TbCursor INTO @DataBaseName,@MaxOrder,@oldfilName  
WHILE @@fetch_status = 0        
BEGIN         
    --獲得需要還原bak檔案實體地址資訊  
    set @oldfilName= @strPath+'\'
[email protected]
insert into @bakFileDesc exec('RESTORE FILELISTONLY FROM DISK = N'''[email protected]+'''') --建立mdf檔案儲存資料夾 set @strFirstRunSql=N'' select @[email protected]+N'exec master.dbo.xp_cmdshell ''mkdir'+N' '+ REVERSE(right(REVERSE(PhysicalName),len(PhysicalName)-CHARINDEX('\', REVERSE(PhysicalName), 1)))+N''''+CHAR(10) from @bakFileDesc exec (@strFirstRunSql) SET @strRunSql=N'' SELECT @[email protected]+strList from ( --還原最新的完整備份 select (N'RESTORE DATABASE '+ DataBaseName+' '+ CHAR(10)+ N'FROM DISK='''[email protected]+'\'+ MAXoldstr+N''''+ CHAR(10)+ N'WITH REPLACE,NORECOVERY ' + CHAR(10)+ CHAR(10)) as strList from ( select DataBaseName,oldstr AS MAXoldstr from @fileDesc where typename =N'bak' and [email protected] and [email protected] ) as tb union all --還原完整備份之後的增量備份 select strDesc from ( select (N'RESTORE DATABASE '+ DataBaseName+N' '+ CHAR(10)+ N'FROM DISK='''[email protected]+'\'+ oldstr+N''''+ CHAR(10)+ N'WITH NORECOVERY ' + CHAR(10)+ CHAR(10)) as strDesc from @fileDesc where typename ='dif' and [email protected] and OrderNum>@MaxOrder ) as tb union all --還原資料庫 select N'RESTORE DATABASE '[email protected]+N' WITH RECOVERY'+ CHAR(10) ) as tb1 exec (@strRunSql) WAITFOR DELAY '00:00:30' FETCH NEXT FROM TbCursor INTO @DataBaseName,@MaxOrder,@oldfilName END CLOSE TbCursor DEALLOCATE TbCursor --print @strRunSql -------------指令碼執行後 EXEC sys.sp_configure N'xp_cmdshell', N'0' -- 為1則啟用xp_cmdshell,為0則禁用xp_cmdshell go EXEC sys.sp_configure N'show advanced options', N'0' GO RECONFIGURE WITH OVERRIDE Go