【问题标题】:Elastic job agent immediately times out on a job in a Logic App弹性作业代理立即在逻辑应用中的作业超时
【发布时间】:2020-12-14 20:44:38
【问题描述】:

为了在 Logic App 上运行相当长的 SQL 查询,我将其作为存储过程保存在我的数据库中,然后创建作业和步骤来运行存储过程以及我的作业的所有者和目标组。我在 Elastic Job Agent 上看到了我的工作、凭据和目标组,这些代理是为了让我的工作发挥作用而创建的。

当我直接在数据库上运行查询时,它运行成功,大约需要 28 分钟。

我在我的逻辑应用上运行该作业。这意味着我不直接运行查询,而是创建的作业将存储过程作为一个步骤运行。

但是当我查看 Elastic Job Agent 以查看结果时,我注意到它立即超时。查询似乎没有执行。我知道这是因为在查询开始时我清空了一个表,但我没有看到发生这种情况。

正如我所提到的,Logic 应用程序非常简单,它只运行这项工作。

我这样做的原因是逻辑应用程序对冗长的 SQL 查询有超时问题。但是现在我在 Elastic Job Agent 上的超时甚至比逻辑应用程序的 2 分钟限制还要快。

更新

当我查看创建凭据所经历的步骤时,我意识到我可能忽略了这一步:Credentials for running jobs

这是否意味着我应该为我的工作创建一个单独的数据库?我们只处理一个数据库,它与包含我的表的数据库相同。

更新 2:

我创建的弹性作业代理将我的数据库分配为作业数据库。所以一切显然都在同一个数据库上。

【问题讨论】:

  • 你能执行exec jobs.sp_start_job '<Your_Job_Name>'; SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC 并告诉我们last_message 吗?喜欢this

标签: sql-server azure azure-logic-apps job-scheduling


【解决方案1】:

看来您不需要为Azure Elastic Job创建单独的数据库,也许您在创建Azure Elastic Job时忽略了一些东西。

你可以参考我用sql创建的过程:

use master;
CREATE LOGIN masteruser WITH PASSWORD='qazwsx!1111';
CREATE LOGIN jobuser WITH PASSWORD='qazwsx!1111';

 

use master;
CREATE USER masteruser FROM LOGIN masteruser;

 

use gongdb;
CREATE USER masteruser FROM LOGIN masteruser;

 

use gongdb;
CREATE USER jobuser FROM LOGIN jobuser;

GRANT CREATE TABLE TO jobuser;

EXEC sp_addrolemember 'db_owner', 'jobuser';

use gongdb;
-- Create a db master key if one does not already exist, using your own password.  
CREATE MASTER KEY ENCRYPTION BY PASSWORD='qazwsx!1111';  

 


-- Create a database scoped credential. 
CREATE DATABASE SCOPED CREDENTIAL jobuser

WITH IDENTITY = 'jobuser',

SECRET = 'qazwsx!1111';

 


CREATE DATABASE SCOPED CREDENTIAL masteruser

WITH IDENTITY = 'masteruser',

SECRET = 'qazwsx!1111';

 

SELECT * FROM sys.database_scoped_credentials

 

EXEC jobs.sp_add_target_group 'DemoGroup';

 

SELECT * FROM jobs.target_groups WHERE target_group_name='DemoGroup';

 

EXEC jobs.sp_add_target_group_member 'DemoGroup',
@target_type = 'SqlServer',
@refresh_credential_name='masteruser', --credential required to refresh the databases in server
@server_name='<server>.database.windows.net'
GO

 

EXEC jobs.sp_add_job @job_name='CreateTableTest', @description='Create Table Test'

 


EXEC jobs.sp_add_jobstep @job_name='CreateTableTest',
@command=N'IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id(''Test''))
CREATE TABLE [dbo].[Test]([TestId] [int] NOT NULL);',
@credential_name='jobuser',
@target_group_name='DemoGroup'

 

SELECT * FROM jobs.jobs

 


SELECT js.* FROM jobs.jobsteps js
JOIN jobs.jobs j
  ON j.job_id = js.job_id AND j.job_version = js.job_version

 

exec jobs.sp_start_job 'CreateTableTest';
SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC

===================更新=====================

当您创建Azure Elastic Job 时,您将只指定一个数据库作为您的工作数据库。

目标数据库是您需要访问的数据库。比如你在gongdb进行建表操作,那么你的目标数据库就是gongdb

为了让Azure Elastic Job访问目标数据库,您需要为目标数据库创建USER,然后创建访问所需的凭据。

之所以需要master db,是因为master db是一个权限较高的系统数据库。目标数据库的USER必须由master创建。

在我提供的SQL中,作业数据库和目标数据库都是gondb,可能会引起你的误解。

【讨论】:

  • 那为什么文档说明它们应该分开。请查看此链接和图表,其中有 3 个单独的数据库。 docs.microsoft.com/en-us/azure/azure-sql/database/…
  • 需要明确的是,Elastic Job Agent 在这一切中的位置在哪里?如果我创建一个 Elastic Job Agent 并将您的 gongdb 分配为其 JobDatabase,这会起作用吗?
  • 谢谢弗兰克!这清楚了很多,除了最后一个问题。根据您的最后一句话,作业数据库和目标数据库可以相同吗?如果答案是肯定的,为什么他们在文档中说作业数据库应该是“干净和空的”?您是否尝试过自己拥有与工作和目标相同的数据库?
  • 从我的测试结果来看,这是可以的。我成功运行该作业以在我的目标数据库中创建一个表。也许您可以自己测试以验证它。至于文件为什么说Job Database should be "clean and empty,我也不是很清楚。
  • 确实,这让我很困惑,我们不能为此添加新数据库。我会尝试您的解决方案,但知道您已经测试了自己,并且我在 90% 的实施中与您同在,我相信您有正确的答案。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2013-10-15
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多