我们被要求从它在过去某个时候的存在情况中恢复特定的SQL 2005作业。我们有从那个时间段开始的MSDB数据库备份,但是我不能覆盖当前的MSDB数据库,因为我不希望丢失对该服务器上其他作业的更多更改。
如果我将其还原为副本(称为MSDB_old或其他东西),如何提取该作业的信息?或者,我需要在scratch服务器上的MSDB数据库上恢复它吗?
发布于 2009-06-30 20:42:11
不需要恢复到scratch服务器,您可以将其还原到您所说的(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你得恢复
编辑:这里有一个脚本应该在Sql2005和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发布于 2015-05-06 12:34:04
在接受的答案中,脚本是基于这一个的松散的。它已经为SQL 2014进行了更新,包括异常处理、原子事务和其他一些改进。
-- 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发布于 2009-06-30 20:43:11
从MSDB提取单个作业的最简单方法是右键单击SSMS中的作业,然后说脚本作业-然后将脚本带到目标服务器并运行它以重新创建作业(可能需要进行一些修改)。
这只有在msdb被还原为msdb时才有效--这意味着在您的示例中,您必须将备份恢复为msdb在scratch服务器上。
我想您可以将其还原为msdb的副本,然后使用联接手动从各种msdb_copy.dbo.sysjobs/sysjobsteps/sysjobschedules/sysjobservers表中提取所有内容。
希望这能有所帮助!
https://serverfault.com/questions/34087
复制相似问题