sunage001 发表于 2018-10-16 10:25:28

MS SQL SERVER批量恢复BAK文件

---请先使用存储脚本生成存储过程  
---调用存储过程
  

  
USE
  
EXEC PROC_DBHY 'D:\databack\','D:\data\',2,2
  
GO
  
--调用的时候,请根据实际需要进行修改:
  
--第一个传入参数为指定备份文件所在路径,如D:\databack\
  
--第二个传入参数为数据文件存放路径,如D:\data\
  
--第三个传入参数:当需要直接取文件名称为数据库名称时,设置为2;
  
--第四个传入参数:还原数据库为2,删除数据库为1(请慎重使用)
  

  

  
--存储过程脚本
  

  
USE
  
SET ANSI_NULLS ON
  go
  
SET QUOTED_IDENTIFIER ON
  go
  
CREATE PROCEDURE.(@DBWLLJ VARCHAR(MAX),@DBLJ VARCHAR(MAX),@jint=1 ,@D INT = 1 )
  
--ALTER PROCEDURE . ( @DBWLLJ VARCHAR(MAX) ,@DBLJ VARCHAR(MAX) ,@J INT = 1 ,@D INT = 1 )
  
AS
  
DECLARE @DBNAME VARCHAR(MAX) ,
  
      @CSQL VARCHAR(MAX) ,
  
      @CSQL2 VARCHAR(MAX)
  
PRINT '-------------------------------------------------------------------------------------'
  
PRINT '**********************************开始生成还原语句***********************************'
  
IF EXISTS ( SELECTid
  
            FROM    tempdb..sysobjects
  
            WHERE   id = OBJECT_ID('tempdb..#TB1') )
  
   DROP TABLE #TB1
  
CREATE TABLE #TB1
  
( DBMC VARCHAR(MAX) ,
  
DBJ1 BIT ,
  
DBJ2 INT )
  
IF EXISTS ( SELECTid
  
            FROM    tempdb..sysobjects
  
            WHERE   id = OBJECT_ID('tempdb..#TB2') )
  
   DROP TABLE #TB2
  
CREATE TABLE #TB2
  
( NAME NVARCHAR(128) ,
  
PhysicalName NVARCHAR(260) ,
  
Type CHAR(1) ,
  
FileGroupName NVARCHAR(128) ,
  
Size NUMERIC(20, 0) ,
  
MaxSize NUMERIC(20, 0) ,
  
FileID BIGINT ,
  
CreateLSN NUMERIC(25, 0) ,
  
DropLSN NUMERIC(25, 0) NULL ,
  
UniqueID UNIQUEIDENTIFIER ,
  
ReadOnlyLSN NUMERIC(25, 0) NULL ,
  
ReadWriteLSN NUMERIC(25, 0) NULL ,
  
BackupSizeInBytes BIGINT ,
  
SourceBlockSize INT ,
  
FileGroupID INT ,
  
LogGroupGUID UNIQUEIDENTIFIER NULL ,
  
DifferentialBaseLSN NUMERIC(25, 0) NULL ,
  
DifferentialBaseGUID UNIQUEIDENTIFIER ,
  
IsReadOnly BIT ,
  
IsPresent BIT ,
  
TDEThumbprint VARBINARY(32), )   ---判断临时表是否存在,存在就删除
  
SET @CSQL = 'INSERT INTO #TB1 exec master..xp_dirtree   ''' + @DBWLLJ + ''',1,1 '
  
EXEC (@CSQL) --PRINT @CSQL
  
ALTER TABLE#TB1ADDKNAME VARCHAR(MAX),DSINT, DS1INT
  
DELETE#TB1
  
WHERE   DBJ2 = 0
  
      OR DBMC NOT LIKE '%.BAK'
  
IF @J = 1
  
   BEGIN
  
         UPDATE #TB1
  
         SET    DS1 = CHARINDEX('_backup', DBMC) - 1
  
         WHERECHARINDEX('_backup', DBMC) > 1
  
         UPDATE #TB1
  
         SET    KNAME = SUBSTRING(DBMC, 1, DS1)
  
         --PRINT 'CHU1'
  
   END
  
IF @J = 2
  
   BEGIN
  
         UPDATE #TB1
  
         SET    DS = CHARINDEX('.BAK', DBMC) - 1
  
         WHERECHARINDEX('.BAK', DBMC) > 1
  
         UPDATE #TB1
  
         SET    KNAME = SUBSTRING(DBMC, 1, DS)
  
         --PRINT 'CHU2'--获取逻辑文件名
  
   END
  
ALTER TABLE#TB1ADDNAME1 VARCHAR(MAX),NAME2VARCHAR(MAX)
  
--SELECT * FROM #TB1
  
DECLARE LJWJM CURSOR
  
FOR
  
SELECTDBMC
  
FROM    #TB1
  
OPEN LJWJM
  
FETCH NEXT FROM LJWJM INTO @DBNAME
  
WHILE ( @@FETCH_STATUS-1 )
  
      BEGIN
  
            SET @CSQL = 'INSERT INTO #TB2Exec(''RESTORE FILELISTONLY FROM DISK =''''' + @DBWLLJ + @DBNAME + ''''''') '
  
            EXEC (@CSQL)--PRINT @CSQL
  
            SET @CSQL2 = 'UPDATE #TB1 SET NAME1=(SELECT name FROM #TB2 WHERE Type=''D'') ,NAME2=(SELECT name FROM #TB2 WHERE Type=''L'')WHEREDBMC=''' + @DBNAME + ''''   --KNAME='''+@DBNAME+''''
  
            EXEC (@CSQL2)   --PRINT @CSQL2
  
            EXEC ('DELETE FROM #TB2')
  
            FETCH NEXT FROM LJWJM INTO @DBNAME
  
      END
  
CLOSE LJWJM
  
DEALLOCATE LJWJM
  
    IF @D = 1
  
       BEGIN
  
             SELECT 'DROPDATABASE' + KNAME
  
             FROM   #TB1
  
       END
  
    ELSE
  
       BEGIN
  
             SELECT 'USE master'
  
             UNION ALL
  
             SELECT 'RESTORE DATABASE [' + KNAME + '] FROM DISK=N''' + @DBWLLJ + '' + DBMC + '''
  WITH   replace,MOVEN''' + NAME1 + ''' TO N''' + @DBLJ + '' + KNAME + '.mdf'',
  MOVE N''' + NAME2 + ''' TO N''' + @DBLJ + '' + KNAME + '_LOG.ldf'',
  NOUNLOAD, REPLACE
  GO'
  
             FROM   #TB1
  
       END
  
PRINT '-------------------------------------------------------------------------------------'
  
PRINT '-----**********************************生成语句成功***********************************-----'
  GO


页: [1]
查看完整版本: MS SQL SERVER批量恢复BAK文件