【发布时间】: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