作业数据库和目标数据库是否需要位于不同的服务器上?

Do the job database and the target database need to be sitting on different servers?

我正在按照官方 Azure 文档创建一个弹性作业代理,这样我就可以 运行 逻辑应用程序上的一些更重的查询。

the section where one should create credentials for running jobs 中,有一件事让我感到困惑。作业数据库和目标数据库是否需要位于不同的服务器上?我知道专用于作业的数据库应该是干净且空的,但是该图以某种方式暗示两者驻留在不同的服务器上或者我弄错了。

图中,“作业数据库”是为支持弹性作业代理而创建的数据库。

“目标主数据库”和“目标用户数据库”是您要对其执行作业的数据库。

存在“主”和“用户”数据库的原因是,当您 select服务器作为目标。

您有登录 'jobuser' 的地方显示的格式再次简化 - 如果您想 运行 对多个数据库进行相同的作业查​​询,那么这将节省创建 USER WITH PASSWORD 或 AAD USER在每个数据库中 - 在 master 中创建一次,然后将用户映射到该登录名。

'masteruser' 仅用于刷新有关该服务器上存在的数据库的元数据。

在目标上创建 'masteruser' 和 'jobuser' 后,您就可以在作业代理数据库上重新创建凭据,以便作业代理可以连接到目标作为登录名被定义。 IDENTITY 必须与目标上的 LOGIN 匹配,相应的 SECRET 必须与目标上的相应 PASSWORD 匹配。

根据您放置目标数据库的位置,作业代理数据库和您的目标数据库完全有可能位于同一台服务器上 - 但它们不必位于同一台服务器上。

感谢 Martin Cairney 的回答并添加到他的回答中。

例如:
我的服务器上有 3 个用户数据库。

  1. 我将使用名为 josephsql3 的用户数据库之一作为作业代理数据库。 以下是我的 sql 脚本,用于在我的服务器上创建 Elastic 作业组
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'

  1. 作业正在尝试在目标数据库上构建 table。默认情况下,josephsqljosephsql2 以及 josephsql3 将是目标数据库,因为它们在同一台服务器上,但我的目标数据库是 josephsql2。所以我需要通过以下脚本排除 josephsqljosephsql3
EXEC [jobs].sp_add_target_group_member
@target_group_name = N'DemoGroup',
@membership_type = N'Exclude',
@target_type = N'SqlDatabase',
@server_name = N'<server-name>.database.windows.net',
@database_name =N'josephsql'
GO

EXEC [jobs].sp_add_target_group_member
@target_group_name = N'DemoGroup',
@membership_type = N'Exclude',
@target_type = N'SqlDatabase',
@server_name = N'<server-name>.database.windows.net',
@database_name =N'josephsql3'
GO

  1. 我们还可以将其他服务器添加到我们之前创建的 Elastic Job 组。前提是我们需要在另一台服务器上创建相同的凭证。然后我们可以使用下面的脚本来添加另一个服务器。
EXEC jobs.sp_add_target_group_member 'DemoGroup',
@target_type = 'SqlServer',
@refresh_credential_name='masteruser', 
@server_name='<other-server>.database.windows.net'
GO
  1. 当我们exec jobs.sp_start_job 'Job_Name';时,那么我们可以使用SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC (多次执行这个查询)来监控执行情况。我们可以看到作业将在两台服务器上执行