首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MSDB备份恢复特定的作业定义?

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

Server Fault用户
提问于 2009-06-30 20:34:28
回答 5查看 15K关注 0票数 4

我们被要求从它在过去某个时候的存在情况中恢复特定的SQL 2005作业。我们有从那个时间段开始的MSDB数据库备份,但是我不能覆盖当前的MSDB数据库,因为我不希望丢失对该服务器上其他作业的更多更改。

如果我将其还原为副本(称为MSDB_old或其他东西),如何提取该作业的信息?或者,我需要在scratch服务器上的MSDB数据库上恢复它吗?

EN

回答 5

Server Fault用户

回答已采纳

发布于 2009-06-30 20:42:11

不需要恢复到scratch服务器,您可以将其还原到您所说的(MSDB_old)中,并执行一个查询以使您的工作返回:

代码语言:javascript
复制
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

你得恢复

  • 在sysjobs中的条目
  • sysjobs步骤中的每个条目都与sysjobs中的上述条目相关。
  • 如果您想要返回历史记录,请在history历史记录中输入
  • 系统作业计划中的条目以使您的计划返回。

编辑:这里有一个脚本应该在Sql2005和2008中完成(假设您的工作被称为“我失去的工作”并恢复到MSDB_Old)

代码语言:javascript
复制
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
票数 9
EN

Server Fault用户

发布于 2015-05-06 12:34:04

在接受的答案中,脚本是基于这一个的松散的。它已经为SQL 2014进行了更新,包括异常处理、原子事务和其他一些改进。

代码语言:javascript
复制
-- Script for SQL 2014
DECLARE @JobID UNIQUEIDENTIFIER
declare @servername sysname

set @servername = @@SERVERNAME

SELECT @JobID = job_id 
FROM msdb_old.dbo.sysjobs 
WHERE name='My Lost Job'

BEGIN TRAN

BEGIN TRY

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

-- New insert in sysschedules 
SET IDENTITY_INSERT msdb.dbo.sysschedules ON
INSERT msdb.dbo.sysschedules (schedule_id, schedule_uid,
         originating_server_id, name, owner_sid, enabled,
         freq_type,freq_interval, freq_subday_type,
         freq_subday_interval, freq_relative_interval,
         freq_recurrence_factor, active_start_date, 
         active_end_date, active_start_time, active_end_time,
         date_created, date_modified, version_number)
SELECT schedule_id, schedule_uid, originating_server_id, name,
       owner_sid, enabled, freq_type, freq_interval, freq_subday_type,
       freq_subday_interval, freq_relative_interval,
       freq_recurrence_factor, active_start_date, active_end_date,
       active_start_time, active_end_time, date_created, date_modified,
       version_number 
FROM msdb_old.dbo.sysschedules a
WHERE schedule_id = (select schedule_id from msdb_old.dbo.sysjobschedules b where job_id=@JobID )
SET IDENTITY_INSERT msdb.dbo.sysschedules OFF

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

-- Alter job as local job
EXEC msdb.dbo.sp_add_jobserver @job_id=@JobID, @server_name = @servername

END TRY
BEGIN CATCH
SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;

    ROLLBACK TRAN

    RETURN
END CATCH

COMMIT TRAN
票数 3
EN

Server Fault用户

发布于 2009-06-30 20:43:11

从MSDB提取单个作业的最简单方法是右键单击SSMS中的作业,然后说脚本作业-然后将脚本带到目标服务器并运行它以重新创建作业(可能需要进行一些修改)。

这只有在msdb被还原为msdb时才有效--这意味着在您的示例中,您必须将备份恢复为msdb在scratch服务器上。

我想您可以将其还原为msdb的副本,然后使用联接手动从各种msdb_copy.dbo.sysjobs/sysjobsteps/sysjobschedules/sysjobservers表中提取所有内容。

希望这能有所帮助!

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/34087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档