工作中由于个别数据库比较大,生成的备份文件也比较大,不方便存储或者转移,可以将文件备份为多个小的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
BEGINSET @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