SqlSever 資料庫批量備份&還原 指令碼
阿新 • • 發佈:2018-12-26
批量備份指令碼
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