拆分备份(还原)比较大的数据库为多个bak文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/admans/article/details/83747282

工作中由于个别数据库比较大,生成的备份文件也比较大,不方便存储或者转移,可以将文件备份为多个小的bak文件。

比如一个200G的数据库,可以拆分备份为10个bak文件,则每个bak文件约在20G左右。

备份代码:

/************************************************************
 * 拆分备份dbName数据库 ,数据库比较大,为了方便备份,将每个备份文件拆分为多个bak文件
 * Time:  
 ************************************************************/

 

 
 USE [master]


------删除旧数据-------------------------------------------------------------
--1. xp_delete_file  
--优点:兼容性好  
--缺点:不能删除SQL Server之外创建的文件,包括RAR  
--备注:维护计划中的“清理维护”也是调用此 扩展存储过程 来删除文件。  
DECLARE @oldDate DATETIME  
SET @oldDate = GETDATE() -0  
--EXECUTE MASTER.dbo.xp_delete_file 
--        0,	--0: 备份文件,1: 维护计划文本报告  
--     N'D:\DataBak\dbName\',	--文件路径  
--     N'bak',	--文件扩展名  
--     @oldDate,	--在此时间之前的文件一律删除  
--     1                             --删除子文件夹中的文件  

 
EXEC xp_cmdshell 'rd D:\DataBak\dbName',
     no_output   --删除文件夹,为了清理旧备份 
EXEC xp_cmdshell 'mkdir D:\DataBak\dbName',
     no_output   --重新创建文件夹 

DECLARE @BakCount INT 
DECLARE @n INT 
DECLARE @Sql NVARCHAR(MAX) 
DECLARE @FILENAME VARCHAR(500)
DECLARE @DATABaseName VARCHAR(500)
DECLARE @DATABakPath VARCHAR(500)

SET @DATABakPath = 'D:\DataBak\'
SET @BakCount = 5  --要拆分的数据库个数
SET @DATABaseName = 'dbName'



SET @n = 1
SET @FILENAME = REPLACE(
        REPLACE(
            REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''),
            ' ',
            ''
        ),
        ':',
        ''
    ) + '';

DECLARE @exeText VARCHAR(100)

SET @exeText = 'mkdir ' + + @DATABakPath + @DATABaseName + '\' + @FILENAME --创建备份目录 
EXEC xp_cmdshell @exeText,
     no_output    


SET @Sql = 'BACKUP DATABASE dbName 
TO DISK = N''' + @DATABakPath + @DATABaseName + '\' + @FILENAME + '\' + 
    @DATABaseName + '_' + @FILENAME + '_0.bak'''

WHILE @n < @BakCount
BEGIN
    SET @Sql = @Sql + ',
	DISK = N''' + @DATABakPath + @DATABaseName + '\' + @FILENAME + '\' + 
        @DATABaseName + '_' + @FILENAME + '_' + CONVERT(VARCHAR, @n) + '.bak'''
    
    SET @n = @n + 1
END
EXEC (@Sql) 
 
 
PRINT '-----------备份' + @DATABaseName + '完成---------------------' + CONVERT(VARCHAR(100), GETDATE(), 126)
+ '---------------'

还原代码:


/***还原拆分备份的文件  文件如果比较多 可以参考备份代码 循环处理*****/

RESTORE DATABASE dbName FROM 
DISK = 'E:\DataBak\dbName\20181101201523\dbName_20181101201523_0.bak',
DISK = 'E:\DataBak\dbName\20181101201523\dbName_20181101201523_1.bak',
DISK = 'E:\DataBak\dbName\20181101201523\dbName_20181101201523_2.bak',
DISK = 'E:\DataBak\dbName\20181101201523\dbName_20181101201523_3.bak',
DISK = 'E:\DataBak\dbName\20181101201523\dbName_20181101201523_4.bak' 
WITH MOVE 'dbName' TO 'D:\SqlDataBase\dbName.mdf', 
     MOVE 'dbName_log' 
     TO 'D:\SqlDataBase\dbName_log.ldf',
     STATS = 5
     

猜你喜欢

转载自blog.csdn.net/admans/article/details/83747282
今日推荐