程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server數據庫在指定時間執行備份

SQL Server數據庫在指定時間執行備份

編輯:關於SqlServer

問題:用戶在頁面上輸入一個備份時間,讓數據庫在指定的時間執行備份.能實現嗎? 我說個例子吧: 用戶在頁面上輸入: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 

;<> 0) GOTO QuitWithRollback
  /****** 對象: Step [Subplan_1] 腳本日期: 11/04/2007 01:50:04 ******/
  EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N 'Subplan_1 ',
  @step_id=1,
  @cmdexec_success_code=0,
  @on_success_action=1,
  @on_success_step_id=0,
  @on_fail_action=2,
  @on_fail_step_id=0,
  @retry_attempts=0,
  @retry_interval=0,
  @os_run_priority=0, @subsystem=N 'SSIS ',
  @command=N '/Server "$(ESCAPE_NONE(SRVR)) " /SQL "Maintenance Plans\test1 " /set "\Package\Subplan_1.Disable;false " ',
  @flags=0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N 'test1 ',
  @enabled=1,
  @freq_type=4,
  @freq_interval=1,
  @freq_subday_type=1,
  @freq_subday_interval=0,
  @freq_relative_interval=0,
  @freq_recurrence_factor=0,
  @active_start_date=20071104,
  @active_end_date=99991231,
  @active_start_time=15100,
  @active_end_time=235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N '(local) '
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  COMMIT TRANSACTION
  GOTO EndSave
  QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
  EndSave:

le>    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved