作业数据库和目标数据库是否需要位于不同的服务器上?
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 个用户数据库。
- 我将使用名为
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'
- 作业正在尝试在目标数据库上构建 table。默认情况下,
josephsql
和 josephsql2
以及 josephsql3
将是目标数据库,因为它们在同一台服务器上,但我的目标数据库是 josephsql2
。所以我需要通过以下脚本排除 josephsql
和 josephsql3
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
- 我们还可以将其他服务器添加到我们之前创建的 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
- 当我们
exec jobs.sp_start_job 'Job_Name';
时,那么我们可以使用SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC
(多次执行这个查询)来监控执行情况。我们可以看到作业将在两台服务器上执行
我正在按照官方 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 个用户数据库。
- 我将使用名为
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'
- 作业正在尝试在目标数据库上构建 table。默认情况下,
josephsql
和josephsql2
以及josephsql3
将是目标数据库,因为它们在同一台服务器上,但我的目标数据库是josephsql2
。所以我需要通过以下脚本排除josephsql
和josephsql3
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
- 我们还可以将其他服务器添加到我们之前创建的 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
- 当我们
exec jobs.sp_start_job 'Job_Name';
时,那么我们可以使用SELECT * FROM jobs.job_executions WHERE is_active = 1 ORDER BY start_time DESC
(多次执行这个查询)来监控执行情况。我们可以看到作业将在两台服务器上执行