【发布时间】:2023-02-22 21:24:35
【问题描述】:
我们为 2 个服务器 A(主要)、B(次要)设置了 AG 组 A、B 具有相同的 sql 代理作业设置
作业运行成功并且 B 作业在尝试访问数据库时在初始步骤中失败(由于目标数据库正在参与可用性组并且当前无法访问查询。)
一旦 A 发生故障转移,B 就成为主节点。我们注意到一个行为,即 A & B sql 代理作业也成功运行,因此该作业运行了两次。
我们尝试修改 sql agent Job 中的脚本,通过添加打印 @@servername 变量,我们发现 A & B sql agent 作业也在打印 B(现在是主要的)servername。可能有 2 个作业也在 B(主)服务器中运行。
目前唯一的解决办法就是重启sql agent服务。想知道是否还有其他解决方案?
SQL 服务器版本为 13.0.5888.11
下面的Issue和我的差不多,但是还没有解决办法 [https://stackoverflow.com/questions/47433964/sql-server-ag-agent-jobs-running-successfully-on-secondary-replica][1]
【问题讨论】:
-
当我在这个配置中运行时,我要么有一个工作步骤来测试目标数据库是否是主数据库(并且,明确地说,我喜欢看
databasepropertyex('yourDb', 'Updateability'),因为它也考虑了非 AG数据库)和保释,如果它不是主要的。您的工作是否完全区分主要和次要? -
我试图在这个脚本中添加这个,故障转移后的情况(B primary,A secondary),A 的作业代理触发的作业显示 B 的服务器名,而 databasepropertyex('yourDb','Updateability')返回'READ_WRITE',我认为是 A作业与 B 服务器一起运行,因此辅助服务器也运行,并导致重复。
-
工作步骤在做什么?如果它是针对本地实例运行的 T-SQL 作业步骤(即不涉及链接服务器,不调用 xp_cmdshell 来访问 sqlcmd 或类似的,等等),我不明白你是如何访问主副本的。如果您认为情况确实如此(即它仅访问副本的本地资源),请提出一个可重现性最低的示例。也就是说,只有 a) 尝试确定副本状态和 b) 做一些简单的事情的工作(例如,只有
select @@servername)。 -
谢谢 Ben,这是一个 T-SQL 分步作业,我尝试使用简单的方法,如 @@servername 来确定它的执行位置,两个作业显示同时来自主副本。这是一种奇怪的行为。
标签: sql-server high-availability sql-agent-job