设为首页 收藏本站
查看: 1266|回复: 0

[经验分享] MS SQL SERVER批量恢复BAK文件

[复制链接]

尚未签到

发表于 2018-10-16 10:25:28 | 显示全部楼层 |阅读模式
---请先使用存储脚本生成存储过程  
---调用存储过程
  

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

  

  
--存储过程脚本
  

  
USE [master]
  
SET ANSI_NULLS ON
  go
  
SET QUOTED_IDENTIFIER ON
  go
  
CREATE PROCEDURE  [dbo].[PROC_DBHY]  (@DBWLLJ VARCHAR(MAX),@DBLJ VARCHAR(MAX),@j  int=1 ,  @D INT = 1 )
  
--ALTER PROCEDURE [dbo].[PROC_DBHY] ( @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 ( SELECT  id
  
            FROM    tempdb..sysobjects
  
            WHERE   id = OBJECT_ID('tempdb..#TB1') )
  
   DROP TABLE #TB1
  
CREATE TABLE #TB1
  
( DBMC VARCHAR(MAX) ,
  
  DBJ1 BIT ,
  
  DBJ2 INT )
  
IF EXISTS ( SELECT  id
  
            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  #TB1  ADD  KNAME VARCHAR(MAX),  DS  INT, DS1  INT
  
DELETE  #TB1
  
WHERE   DBJ2 = 0
  
        OR DBMC NOT LIKE '%.BAK'
  
IF @J = 1
  
   BEGIN
  
         UPDATE #TB1
  
         SET    DS1 = CHARINDEX('_backup', DBMC) - 1
  
         WHERE  CHARINDEX('_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
  
         WHERE  CHARINDEX('.BAK', DBMC) > 1
  
         UPDATE #TB1
  
         SET    KNAME = SUBSTRING(DBMC, 1, DS)
  
         --PRINT 'CHU2'  --获取逻辑文件名
  
   END
  
ALTER TABLE  #TB1  ADD  NAME1 VARCHAR(MAX),NAME2  VARCHAR(MAX)
  
--SELECT * FROM #TB1
  
DECLARE LJWJM CURSOR
  
FOR
  
SELECT  DBMC
  
FROM    #TB1
  
OPEN LJWJM
  
FETCH NEXT FROM LJWJM INTO @DBNAME
  
WHILE ( @@FETCH_STATUS  -1 )
  
      BEGIN
  
            SET @CSQL = 'INSERT INTO #TB2  Exec(''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'')  WHERE  DBMC=''' + @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 'DROP  DATABASE  ' + KNAME
  
             FROM   #TB1
  
       END
  
    ELSE
  
       BEGIN
  
             SELECT 'USE master'
  
             UNION ALL
  
             SELECT 'RESTORE DATABASE [' + KNAME + '] FROM DISK=N''' + @DBWLLJ + '' + DBMC + '''
  WITH   replace,  MOVE  N''' + 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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-622231-1-1.html 上篇帖子: 研究v$sqlarea,v$sql,v$sqltext 下篇帖子: SQL Server监控检查清单
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表