日期:2014-05-18  浏览次数:20448 次

能不能写个存储过程在本机备份的同时再在指远程机器上备份数据库?
我想写一个存储过和实现以下功能:
备份数据库有以下3个
account
game3g
CruelDragon3GBaseData

备份数据库每60分钟一次
要求为:

1、保存格式为数据库名+当前时间,新建文件夹名称为:当前日期

例如:今天是2007-09-16号,时间为20:47,那么备份格式为:
            新建一个2007-09-16的文件夹,里边分别保存为:account_20:47,game3g_20:47,CruelDragon3GBaseData_20:47

2、自动删除头一天的备份
例如:今天是2007-09-16号,创造第一个备份时自动删除2007-09-15号备份的文件夹就行了

3、备份完后,自动上传到其它的服务器

谁能帮我完全解决50分全给他!



------解决方案--------------------
1. 在Master数据库中建一个格式化时间的函数
Create function FormatDate(
@date smalldatetime
)
returns nvarchar(10)
begin
declare @dt nvarchar(10);
set @dt = SubString(Convert(nvarchar(20),@date,120),1,10); --格式化为yyyy-MM-dd HH:mm:ss格式,与后面的批处理日期格式保持一致
return @dt
end

2. 创建一个备份数据库的存储过程
/*
* 在磁盘上根据日期创建一个文件夹,并将数据库备份到文件夹内
*/
Create Proc BackupCRM
as
begin

declare @path nvarchar(200);
declare @crmfilename nvarchar(200);
declare @metafilename nvarchar(200);
declare @cmd nvarchar(1000);

set @path = 'E:\Backup\ ' + dbo.formatdate(getdate()) + '\ ';
set @crmfilename = @path + 'CRM.bak ';
set @metafilename = @path + 'Meta.bak ';
set @cmd = 'md ' + @path;

--为了安全,建议还是将xp_cmdshell改名

exec xp_cmdshell @cmd,NO_OUTPUT

backup database _0105237670_MSCRM to disk = @crmfilename;
backup database _0105237670_METABASE to disk = @metafilename
end

3. 创建清空文件和复制文件的批处理命令
a.用于备份数据库前清空文件的批处理文件clearfiles.bat
del E:\Backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\CRM.bak
del E:\Backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\Meta.bak

说明: %date%可以获得日期的字符串,但我们需要用~ index,len来截断并组合成yyyy-MM-dd格式的字符串,这和SubString函数类似,index表示字符串的起始索引位置,len表示要截取的长度.
如果想看到自己Server的%date%输出格式是什么,可以输入 echo %date%,我们的Server输出是Wed 02/14/2007
b. 复制文件至远程机器批处理文件copyfiles.bat

md \\10.89.53.250\e$\backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\
del \\10.89.53.250\e$\backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\CRM.bak
del \\10.89.53.250\e$\backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\Meta.bak

copy E:\Backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\CRM.bak \\10.89.53.250\e$\backup\%date:~10,4%-%date:~4,2%-%date:~7,2%
copy E:\Backup\%date:~10,4%-%date:~4,2%-%date:~7,2%\Meta.bak \\10.89.53.250\e$\backup\%date:~10,4%-%date:~4,2%-%date:~7,2%


4. 启动SQL Agent服务,并设为开机自动运行,然后新建一个备份的Job

注意将批处理执行失败后的动作设为 "执行下一步操作 ",否则如果文件不存在等可能会导致Job不能正常运行


最后在Schedules中新建一个Schedule,当然选择的运行的时间点就是那种风高月黑夜深人静的时候罗:)