MS SQL SERVER批量恢复BAK文件
2015-06-03 10:54
417 查看
注意先使用存储脚本生成存储过程再调用存储过程生成语句。
无意在网上找到的,发现很好用,现转上来分享给大家。
无意在网上找到的,发现很好用,现转上来分享给大家。
---请先使用存储脚本生成存储过程 ---调用存储过程 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
相关文章推荐
- Writing Better T-SQL: Top-Down Design May Not be the Best Choice
- java+oracle+web(第九天) java 基础课程(四) 多线程其他小知识 终止、守护、等待
- 数据库字符编码集查看命令
- oracle hanganalyze工具的使用
- mysql 报1067错误
- 支持SQL Server数据库又支持MongoDB数据库的数据访问设计
- Redis 存储分片之代理服务Twemproxy 测试
- Redis 存储分片之代理服务Twemproxy 测试
- 如何限制oracle的trace files及alert file大小
- oracle模糊查询语句使用示例
- 数据库 主从一致性检查和修复
- SQL Server 数据库定时自动备份
- FROM_UNIXTIME 格式化MYSQL时间戳函数
- oracle存储过程、声明变量、for循环|转|
- Mysql coalesce()函数认识和用法
- mysql5.6基于GTID的主从复制
- SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-滑动窗口
- Oracle学习(13):数据字典
- MySQL CURDATE() 函数
- listener.ora 、sqlnet.ora 、tnsnames.ora的关系以及手工配置