弹性作业代理在逻辑应用程序中的作业立即超时
Elastic job agent immediately times out on a job in a Logic App
为了 运行 在 Logic App 上进行相当冗长的 SQL 查询,我将其保存为数据库中的存储过程,然后创建作业和步骤以 运行 存储过程作为以及我工作的所有者和目标群体。我在 Elastic Job Agent 上看到了我的工作、证书和目标群体,我创建它是为了让我的工作正常运行。
当我 运行 直接在数据库上查询时,它 运行 成功并花费了大约 28 分钟。
我 运行 我的逻辑应用程序上的作业。这意味着我不直接 运行 查询,而是 运行 将存储过程作为步骤创建的作业。
但是当我在 Elastic Job Agent 中查看结果时,我注意到它立即超时。查询似乎没有执行。我知道这一点,因为在查询开始时我清空了一个 table 并且我没有看到发生这种情况。
正如我提到的,Logic 应用程序非常简单,它只是 运行 完成这项工作。
我做这一切的原因是逻辑应用程序对冗长的 SQL 查询有超时问题。但是现在我在 Elastic Job Agent 上的超时甚至比 Logic App 的 2 分钟限制还要快。
更新:
当我查看创建凭据的步骤时,我意识到我可能忽略了这一步:Credentials for running jobs。
这是否意味着我应该为我的工作创建一个单独的数据库?我们正在处理的只有一个数据库,它与包含我的 tables.
的数据库相同
更新 2:
我创建的弹性作业代理将我的数据库指定为作业数据库。所以一切显然都在同一个数据库上。
您似乎不需要为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
中执行 table 创建操作,则您的目标数据库是 gongdb
.
为了Azure Elastic Job
访问目标数据库,您需要为目标数据库创建USER
,然后创建访问所需的凭据。
之所以需要master db
,是因为master db
是权限更高的系统数据库。目标数据库的 USER
必须由 master
创建。
在我提供的SQL中,作业数据库和目标数据库都是gongdb,这可能会让你产生误解。
为了 运行 在 Logic App 上进行相当冗长的 SQL 查询,我将其保存为数据库中的存储过程,然后创建作业和步骤以 运行 存储过程作为以及我工作的所有者和目标群体。我在 Elastic Job Agent 上看到了我的工作、证书和目标群体,我创建它是为了让我的工作正常运行。
当我 运行 直接在数据库上查询时,它 运行 成功并花费了大约 28 分钟。
我 运行 我的逻辑应用程序上的作业。这意味着我不直接 运行 查询,而是 运行 将存储过程作为步骤创建的作业。
但是当我在 Elastic Job Agent 中查看结果时,我注意到它立即超时。查询似乎没有执行。我知道这一点,因为在查询开始时我清空了一个 table 并且我没有看到发生这种情况。
正如我提到的,Logic 应用程序非常简单,它只是 运行 完成这项工作。
我做这一切的原因是逻辑应用程序对冗长的 SQL 查询有超时问题。但是现在我在 Elastic Job Agent 上的超时甚至比 Logic App 的 2 分钟限制还要快。
更新:
当我查看创建凭据的步骤时,我意识到我可能忽略了这一步:Credentials for running jobs。
这是否意味着我应该为我的工作创建一个单独的数据库?我们正在处理的只有一个数据库,它与包含我的 tables.
的数据库相同更新 2:
我创建的弹性作业代理将我的数据库指定为作业数据库。所以一切显然都在同一个数据库上。
您似乎不需要为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
中执行 table 创建操作,则您的目标数据库是 gongdb
.
为了Azure Elastic Job
访问目标数据库,您需要为目标数据库创建USER
,然后创建访问所需的凭据。
之所以需要master db
,是因为master db
是权限更高的系统数据库。目标数据库的 USER
必须由 master
创建。
在我提供的SQL中,作业数据库和目标数据库都是gongdb,这可能会让你产生误解。