SQL Server Express 自动定时备份数据库

Microsoft SQL Server Express 2008 是微软公司提供的一个免费的数据库系统,在功能上与其他的收费 SQL Server 兼容,唯一只是限制了数据库大小为 10G 并只能使用单一的 CPU 核心。

SQL Server Express 版本实际上能够满足绝大多数小型网站、中小型业务管理应用等的需求,但在数据安全方面没有像 SQL Server Standard 或更高版本一样提供定时作业功能,无法直接通过管理工具直接设置定时自动备份数据库。但是结合 Windows 系统自带的“任务计划”功能,本文提供了一种方便且灵活的替代解决办法。

创建备份存储过程

打开 SQL Server 的“Management Studio”,以 SA 身份新建如下存储过程到“master”数据库:


USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- ============================================= 
-- Description: 数据库备份存储过程
-- Parameter1: databaseName 
-- Parameter2: backupType 备份类型,F=完整备份, D=差异备份, L=备份日志
-- Parameter3: bakDir 备份文件存放目录,确保路径是绝对路径,并以 "\“结束
-- ============================================= 

CREATE PROCEDURE [dbo].[sp_BackupDatabase]  
       @databaseName sysname, @backupType CHAR(1), @bakDir NVARCHAR(1000) 
AS 
BEGIN 
       SET NOCOUNT ON; 
       DECLARE @sqlCommand NVARCHAR(1000) 
       DECLARE @dateTime NVARCHAR(20) 
       SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') + 
       REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  

       IF @backupType = 'F' 
               SET @sqlCommand = 'BACKUP DATABASE ' + @databaseName + 
               ' TO DISK = ''' + @bakDir + @databaseName + '_Full_' + @dateTime + '.BAK''' 

       IF @backupType = 'D' 
               SET @sqlCommand = 'BACKUP DATABASE ' + @databaseName + 
               ' TO DISK = ''' + @bakDir + @databaseName + '_Diff_' + @dateTime + '.BAK'' WITH DIFFERENTIAL' 

       IF @backupType = 'L' 
               SET @sqlCommand = 'BACKUP LOG ' + @databaseName + 
               ' TO DISK = ''' + @bakDir + @databaseName + '_Log_' + @dateTime + '.TRN''' 

       EXECUTE sp_executesql @sqlCommand 
END

创建定时任务

在 Windows 的“任务计划程序”中加入定时调用如下两条命令的设置:

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -E -S .\SQLEXPRESS -Q "sp_BackupDatabase 'DemoDB', 'F', 'D:\bak\'"
forfiles /p "d:\bak" /s /m *.bak /d -30 /c "cmd /c del @path"

  • 上述第一条命令的含义是使用 SQLCMD 程序连接本机的 .\SQLEXPRESS 实例名,完全备份“DemoDB”数据库并将备份文件保存于“D:\bak\”目录中。需要注意的是最后一个参数调用必须包含结尾的“\”分隔符,且不同版本的 SQL Server SQLCMD 工具存在路径不同。
  • 第二条命令调用 Windows 2003 或更高版本内置的 forfiles 命令删除 30 天以前的旧备份文件。

至此,我们就完成了 Windows 下定时备份 SQL Server Express 数据库并只保留最近30天备份的设置。

As always, have fun!