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