当前位置:K88软件开发文章中心编程语言SQLSQL01 → 文章内容

数据库批量备份存储过程

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2019-1-3 1:48:45

:2010-06-01 15:49:00

本文详细介绍了在SQL Server2005及以上版本中如何使用存储过程进行数据库备份的方法。

--------------------------------------------------------------------------
--
  Author : htl258(Tony)
--
  Date   : 2010-04-18 10:45:14
--
  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--
          Jul  9 2008 14:43:34
--
          Copyright (c) 1988-2008 Microsoft Corporation
--
          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--
  Blog   :http://blog.csdn.net/htl258
--
  Subject:数据库批量备份存储过程(判断盘符、路径,错误盘符返回,不存在的路径自动创建)
--
------------------------------------------------------------------------
--适用环境:SQL Server 2005及以上版本(主要用于作业中调用以及程序开发中调用)

USE master
GO
--1.周期性备份数据库代码(保留原来备份的):
--
备份文件名为:原数据库名称+'_'+备份日期.bak
IFOBJECT_ID('sp_backupdatabase') ISNOTNULL
   
DROPPROC sp_backupdatabase
GO
CREATEPROC sp_backupdatabase
@pathNVARCHAR(100)--路径
AS
--路径名格式标准化
IFRIGHT(@path,1)<>'\'SET@path=@path+'\'
--获取文件夹信息
DECLARE@tTABLE(id INTIDENTITY,a INT,b INT,c INT)
DECLARE@fpathNVARCHAR(3)
SET@fpath=LEFT(@path,3)
INSERT@tEXEC master..xp_fileexist @fpath
INSERT@tEXEC master..xp_fileexist @path
--如果指定盘符有误不存在,则返回错误提示:
IFEXISTS(SELECT1FROM@tWHERE id=1AND c=0)
BEGIN
   
RAISERROR(N'输入的盘符不存在,请重新输入!',16,1)
   
RETURN
END
--如果不存在指定的文件夹,则创建:
ELSEIFEXISTS(SELECT1FROM@tWHERE b=0AND id=2)
BEGIN
   
DECLARE@mddirNVARCHAR(100)
   
SET@mddir='md '+@path
   
EXEC master..xp_cmdshell @mddir
END
--开始备份数据库到指定的目录
DECLARE@snvarchar(4000)
SELECT@s=ISNULL(@s+';','')
       
+N'BACKUP database ['+name+'] TO DISK = '''
       
+@path+name+'_'+CONVERT(NVARCHAR(8),getdate(),112)+N'.bak'''
FROM master..sysdatabases
WHERE name NOTIN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库
EXEC(@S)
GO
--调用方法:
EXEC sp_backupdatabase 'f:\Backup\tony'
/*
--返回信息:
已为数据库 'mydb',文件 'mydb' (位于文件 1 上)处理了 312 页。
已为数据库 'mydb',文件 'mydb_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 313 页,花费 0.733 秒(3.336 MB/秒)。
已为数据库 'test',文件 'test' (位于文件 1 上)处理了 208 页。
已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 209 页,花费 0.413 秒(3.951 MB/秒)。
--备份后的文件列表:
mydb_20100418.bak
test_20100418.bak
*/


--2.周期性备份数据库代码(自动删除原备份文件):
--
备份文件名为:原数据库名称.bak
IFOBJECT_ID('sp_backupdatabase') ISNOTNULL
   
DROPPROC sp_backupdatabase
GO
CREATEPROC sp_backupdatabase
@pathNVARCHAR(100)--路径
AS
--路径名格式标准化
IFRIGHT(@path,1)<>'\'SET@path=@path+'\'
--获取文件夹信息
DECLARE@tTABLE(id INTIDENTITY,a INT,b INT,c INT)
DECLARE@fpathNVARCHAR(3)
SET@fpath=LEFT(@path,3)
INSERT@tEXEC master..xp_fileexist @fpath
INSERT@tEXEC master..xp_fileexist @path
--如果指定盘符有误不存在,则返回错误提示:
IFEXISTS(SELECT1FROM@tWHERE id=1AND c=0)
BEGIN
   
RAISERROR(N'输入的盘符不存在,请重新输入!',16,1)
   
RETURN
END
--如果不存在指定的文件夹,则创建:
ELSEIFEXISTS(SELECT1FROM@tWHERE b=0AND id=2)
BEGIN
   
DECLARE@mddirNVARCHAR(100)
   
SET@mddir='md '+@path
   
EXEC master..xp_cmdshell @mddir
END
--开始备份数据库到指定的目录
DECLARE@snvarchar(4000)
SELECT@s=ISNULL(@s+';','')
       
+N'BACKUP database ['+name+'] TO DISK = '''
       
+@path+name+N'.bak''  WITH INIT'
FROM master..sysdatabases
WHERE name NOTIN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库
EXEC(@S)
GO
--调用方法:
EXEC sp_backupdatabase 'f:\Backup\tony2'
/*
--返回信息:
已为数据库 'mydb',文件 'mydb' (位于文件 1 上)处理了 312 页。
已为数据库 'mydb',文件 'mydb_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 313 页,花费 0.599 秒(4.082 MB/秒)。
已为数据库 'test',文件 'test' (位于文件 1 上)处理了 208 页。
已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 209 页,花费 0.351 秒(4.651 MB/秒)。
--备份后的文件列表:
mydb.bak
test.bak
*/


数据库批量备份存储过程