問題:用戶在頁面上輸入一個備份時間,讓數據庫在指定的時間執行備份.能實現嗎? 我說個例子吧: 用戶在頁面上輸入:2007-12-01(表示這個時間數據庫就備份);
實際上,我要求備份時間精確到秒. 例:用戶在頁面上輸入:2007-12-01 10:08:57(表示這個時間數據庫就備份) 也就是到了2007年12月1日10點8分57秒,數據庫就開始啟動備份 。這樣的話,代理服務每秒都得在監測這個作業,是嗎?
回答:指定時間備份的問題:
建一個表.
表中一個行,一個列.
就存用戶輸入的這個時間.
create table jobTime(d dateti
me)
insert jobtime getdate()
用戶輸入時
只update就行了.這個表只update不delete和insert
job的調度為每天一次(最低的頻率設置),或者小於這個,比如每小時,每分...
job的步驟裡:
SQL code
if exists(select 1 from jobTime where datediff(dd,getdate(),d)=0)
--執行要操作的東西
else
--不執行,或不要else
你可以
企業管理器> > SQLSERVER組> > 選中某個SQL注冊> > 管理> > 數據庫維護計劃> > 新建維護計劃
在彈出的窗口第一步,選你要操作的庫
第二步是優化,的可以不選,直接下一步
第三步檢查完整性,你也可以不選,再直接下一步
第四步就是備份了,將調度更改為每天執行一次,每天凌晨2點(具體時間你調),然後下一步
第五步,選備份到的目錄和備份文件擴展名,再下一步
第六步,不用,直接下一步
第七步,不用,直接下一步
第八步,寫作業記錄,這裡鉤上,以便以後查看用.
第九步,輸個計劃名,就OVER了.比如你輸入的名為 backUp_MyDataBase_Task
上面的完成後,到
管理> > SQL Server代理> > 作業下,就看到你剛才建的這個 backUp_MyDataBase_Task 作業了.
點屬性> > 切換到 "步驟 "選項卡,選中第一步,點 "編輯 "看到命令裡的sql語句了吧
SQL code
EXECUTE master.dbo.xp_sqlmaint N'-PlanID CC941789-25BF-4170-A4D2-6644DFB0C958 -WriteHistory -VrfyBackup -BkUpMedia DISK -BkUpDB "E:\databak" -BkExt "BAK"'
把我寫的這句,
SQL code
if exists(select 1 from jobTime where datediff(dd,getdate(),d)=0)
粘到那句前面就OK了.
精確到秒
如果是秒的話,那確實,每秒都在執行備份計劃,只不過碰到 if 這語句,它就不執行後面的了. 這樣肯定是不行的.
如果是天的話, 其實是Windows服務充作定時器,到指定時間才去觸發job執行,比如每天的2點,job就去執行. 然後 看 if的語句是否符合, 若符合,也即是說當前日期指定的日期,若符合,那就執行備份.
如果是秒的話,那麼也即,Windows服務每秒種都叫job去執行這個計劃,這個計劃在執行時發現不符個這個if的檢測,就結束了,下一秒又被重新執行.
再給點建議:
1,讓備份時間精確到某秒進行,本身不不合理(業務上有特殊需要除外,這裡主要指你的領導或客戶覺得這麼做比較酷的話)
因為,大的庫,備份操作本身可能就有不短的時間,所以精確到秒觸發備份沒有意義. 如果是處理數據同步的話,我覺得到是合理的.
2,如果非要精確到秒,我建議你寫 Windows 服務,或做定時的任務欄程序,時間一到就執行backup database的備份庫腳本.
3,若精確程序要求是不是很高,可以采用折衷的作法.
job調度設為10分鐘執行一次.(當然,你也可以設置為30分鐘)
d
2007-11-5 12:00:00.000
if exists(select 1 from jobTime where datediff(mi,d,getdate()) between 0 and 10) --or 30)
在指定時間後的10(或30)分鐘之內執行備份工作
用作業調度的方式實現,把下面的程序寫成存儲過程sp_BackUp 當用戶在前台頁面上修改備份時間時,動態的修改這個存儲過程.
USE [msdb]
GO
/****** 對象: Job [test1.Subplan_1] 腳本日期: 11/04/2007 01:50:04 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** 對象: JobCategory [Database Maintenance] 腳本日期: 11/04/2007 01:50:04 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategorIEs WHERE name=N 'Database Maintenance ' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N 'JOB ', @type=N 'LOCAL ', @name=N 'Database Maintenance '
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N 'test1.Subplan_1 ',
@enabled=1,
@notify_level_eventlog=2,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N '無描述。 ',
@category_name=N 'Database Maintenance ',
@owner_login_name=N 'SVCTAG-DT5V52X\tech ', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode
le>