【问题标题】:Stored Procedure to run job based on server name基于服务器名称运行作业的存储过程
【发布时间】:2014-09-07 12:00:40
【问题描述】:

我有一个 4 节点全局集群。在每个节点上,我都有一个从 SQL 作业调用的存储过程,该作业使用 PowerShell 来获取服务器名称。 (PowerShell 脚本在作业中不起作用,但作为 sql 脚本起作用。)根据名称,我调用了一对备份作业,一个用于备份数据库,一个用于事务日志。其中两台服务器“位于”北部,两台服务器“位于”东部。两个数据库备份作业似乎都在运行两次。请让我知道我需要更改什么才能让这个存储过程只调用作业 1 次。非常感谢提前!!!

这是我得到的错误:

Message
Executed as user: Domain\User1. SQLServerAgent Error: Request to run job Backup_DB - FULL - North (from User Domain\User1) refused because the job is already running from a request by User Domain\User1. [SQLSTATE 42000] (Error 22022).  The step failed.

这是给我错误的存储过程:

USE [msdb]
GO
/****** Object:  StoredProcedure [dbo].[sp_Server_BACKUP]    Script Date: 07/16/2014 15:44:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sp_Server_BACKUP]
AS 
    SET NOCOUNT ON ;


Declare @spconfigValues table
(
[name] varchar(1500),
minimum int,
maximum int,
config_value int,
run_value int
)
insert into @spconfigValues
execute sp_configure
------------------------------------------------------
Declare @rv int
set @rv = (select run_value from @spconfigValues where [name] = 'xp_cmdshell')

If @rv is null
Begin 
set @rv = (select convert(int,value_in_use) from sys.configurations where [name] = 'xp_cmdshell') -- gets the server name
End

if @rv = 0
Begin 
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
End
-----------------------------------------------------------------------------------------------------------------
Declare @Server_Name_tbl table
(
[server_name] varchar(50)
)

insert into @Server_Name_tbl
execute xp_cmdshell 'powershell.exe "$(Get-WmiObject Win32_Computersystem).name"'


if @rv = 0
Begin 
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
End

--select * from @server_name_tbl

Declare @servernm varchar(50)

SET @servernm = (select lower(server_name) from @Server_Name_tbl where server_name is not null) --sets the server name

--select @servernm
-------------------------------------------------------------------------------------------------------------------
--Based on the server name call the correct set of jobs

IF @servernm = 'server_1234N1'
    Begin
        EXEC msdb.dbo.sp_start_job N'Backup_T_LOGS - North';        
        WAITFOR DELAY '00:02:00';
        EXEC msdb.dbo.sp_start_job N'Backup_DB - FULL - North';
    End

IF @servernm = 'server_1234N2'
    Begin
        EXEC msdb.dbo.sp_start_job N'Backup_T_LOGS - North';        
        WAITFOR DELAY '00:02:00';
        EXEC msdb.dbo.sp_start_job N'Backup_DB - FULL - North';
    End

IF @servernm = 'server_2345N1'
    Begin   
        EXEC msdb.dbo.sp_start_job N'Backup_T_LOGS - East';
        WAITFOR DELAY '00:02:00';
        EXEC msdb.dbo.sp_start_job N'Backup_DB - FULL - East';
    End

IF @servernm = 'server_2345N2'  
    Begin   
        EXEC msdb.dbo.sp_start_job N'Backup_T_LOGS - East';
        WAITFOR DELAY '00:02:00';
        EXEC msdb.dbo.sp_start_job N'Backup_DB - FULL - East';
    End

【问题讨论】:

    标签: sql sql-server powershell stored-procedures jobs


    【解决方案1】:

    我遇到的问题是,在每个 NetBackup 作业中,我都创建了相同的 .bch 文件。因此,当 t-logs 备份作业开始时,它将创建一个名为 Backup123.bch 的文件。然后,当完整备份作业运行时,它会尝试创建相同的 .bch 文件并给出错误 "the job is already running."

    归根结底,一旦我为 Veritas 将要创建的每个作业更改了 .bch 文件名,该过程就会按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 2011-07-31
      • 1970-01-01
      • 2011-07-29
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      相关资源
      最近更新 更多