从 MSDB 备份中恢复特定作业定义?

Bra*_*adC 4 sql-server sql-server-2005

我们被要求从过去某个时间的存在方式恢复特定的 SQL 2005 作业。我们有那个时间段的 MSDB 数据库备份,但我不能覆盖当前的 MSDB 数据库,因为我不想丢失该服务器上其他作业的最新更改。

如果我将其恢复为副本(称为 MSDB_old 或其他名称),我如何提取该作业的信息?或者我是否需要通过临时服务器上的 MSDB 数据库来恢复它?

squ*_*man 9

无需恢复到临时服务器,您可以将其恢复到您所说的(MSDB_old)并执行查询以恢复您的工作:

USE msdb_old
SELECT * FROM sysjobs
JOIN sysjobsteps ON sysjobs.job_id=sysjobsteps.job_id
WHERE sysjobs.NAME='My Lost Job'
ORDER BY sysjobsteps.step_id
Run Code Online (Sandbox Code Playgroud)

你必须恢复

  • sysjobs 中的条目
  • sysjobsteps 中的每个条目都与 sysjobs 中的上述条目相关
  • sysjobhistory 中的条目,如果你想恢复历史
  • sysjobschedules 中的条目以恢复您的日程安排

编辑:这是一个应该在 SQL 2005 和 2008 中执行的脚本(假设您的工作被称为“我丢失的工作”并且您恢复到 MSDB_Old)

DECLARE @JobID UNIQUEIDENTIFIER
SELECT @JobID = job_id FROM msdb_old.dbo.sysjobs WHERE NAME='My Lost Job'

INSERT msdb.dbo.sysjobs
SELECT * FROM msdb_old.dbo.sysjobs
WHERE job_id=@JobID

INSERT msdb.dbo.sysjobsteps
SELECT * FROM msdb_old.dbo.sysjobsteps
WHERE job_id=@JobID

SET IDENTITY_INSERT msdb.dbo.sysjobhistory ON
INSERT msdb.dbo.sysjobhistory
    (instance_id,job_id,step_id,step_name,sql_message_id,sql_severity,
     [message],run_status,run_date,run_time,run_duration,operator_id_emailed,
     operator_id_netsent,operator_id_paged,retries_attempted,[server])
SELECT
    instance_id,job_id,step_id,step_name,sql_message_id,sql_severity,
    [message],run_status,run_date,run_time,run_duration,operator_id_emailed,
    operator_id_netsent,operator_id_paged,retries_attempted,[server]
FROM msdb_old.dbo.sysjobhistory
WHERE job_id=@JobID
SET IDENTITY_INSERT msdb.dbo.sysjobhistory OFF

INSERT msdb.dbo.sysjobschedules
SELECT * FROM msdb_old.dbo.sysjobschedules
WHERE job_id=@JobID
Run Code Online (Sandbox Code Playgroud)