Owe*_*iwi 5 sql-server high-availability availability-groups
最近我在我的 SQL 服务器中遇到了一个问题。请告知 AlwaysOn 集群背后的概念和机制。
背景:
我们建立了一个 AlwaysOn 集群,其中包含 1 个主节点dbs1
和 1 个辅助节点dbs2
。鉴于他们将可读的二级配置为“只读”。他们还创建了只读路由列表。每个指定“ ApplicationIntent=ReadOnly
”的连接都将被重定向到dbs2
.
问题:运行
的相同代理作业(用于从 mssql 到 MySQL 插入数据)dbs2
不稳定 - 突然成功,突然失败。对于成功案例,代理会话将显示在dbs1
而不是dbs2
。
对于失败的情况,它显示一个错误
“无法连接到 SQL Server '(本地)'”——代理作业历史记录
“目标数据库位于可用性组中,并且当应用程序意图设置为只读时,当前可以进行连接访问”。-- SQL 错误日志
但是当我们将 readable secondary 更改为“yes”时,代理作业始终可以在会话开启的情况下成功运行dbs2
。
我的问题:
1)只读意图的行为是什么?为什么代理工作失败?
2)即使它成功了,为什么会话是在dbs1
而不是dbs2
,因为代理工作被设置了dbs2
?它与脚本中的插入/删除/更新命令有关吗?
3)只读意图和可读辅助选项是有什么区别?我已经测试过在指定“ ApplicationIntent= readonly
”后后一个选项中的只读路由仍然有效
我真的很好奇他们的机制。请随时发表评论和讨论。谢谢。
附加信息(2017 年 8 月 4 日最新更新):
以下是我的代理工作脚本。我可以ApplicationIntent=ReadOnly
在上面指定“ ”吗?我很困惑,这个 T-SQL 没有在 SQL Server 表中写入任何数据,而是在另一个 MySQL 数据库中写入。为什么可用性组不让我通过?再次特别感谢Ben和SqlWorldWide的评论和反馈!
EXECUTE ( 'TRUNCATE TABLE MySQL_Table' ) AT MySQL_Server;
INSERT INTO MySQL_Server...MySQL_Table (c1,c2,c3) SELECT c1,c2,c3 FROM [dbs2].[SQL_Database].[dbo].[SQL_Table];
Run Code Online (Sandbox Code Playgroud)
“Read-intent only 的行为是什么?为什么代理作业失败?” 您向服务器承诺此连接不会尝试将任何数据写入可用性组中的数据库。如果您尝试写入,该写入将会失败,因为无法写入数据库。不过,我相信您需要通过可用性组侦听器才能获得此行为。您已将辅助节点配置为仅接受来自以下客户端的连接:a) 通过侦听器 b) 指定 ReadOnly 应用程序意图。由于您的错误表明它正在尝试连接到(local)
,我怀疑它正在直接连接到实例。
我相信这也与您配置代理作业的方式有关。您为连接字符串指定什么?如果未指定ApplicationIntent=ReadOnly
(或类似的内容),它将被定向到主节点。
如果都是读取,则您的连接字符串可能未指定数据库。它必须包含数据库名称,以便 SQL Server 可以知道要使用哪个路由列表(您的服务器上可能运行多个可用性组)。请参阅:AlwaysOn 辅助可读 - 无法与 applicationintent=readonly 连接
“只读意图和可读辅助选项“是”之间有什么区别?对于处于次要角色的数据库,“仅读取意图”和“任何”之间的区别决定了它将接受什么类型的连接。前者表示它只接受来自小指发誓他们不会写任何东西(即指定ApplicationIntent=ReadOnly
)的客户的连接。“Any”表示它会采取任何措施(写入仍然会失败,但放宽了客户端说他们不会写入任何内容的要求)。
您在评论中问:我可以在 SQL Agent Job T-SQL 脚本中
指定连接字符串吗?AppicationIntent=ReadOnly
另外,我仍然对这种行为感到有点困惑,因为我的插入语句确实是针对 MySQL 平台而不是 SQL Server。为什么“只读意图”设置不能让我走,特别是我不尝试连接到(本地)?
这取决于您的 SQL 代理作业类型。例如,我ApplicationIntent=ReadOnly
在 SSIS 包中使用过,但我不知道如何为标准 Transact SQL 作业等指定它。至于失败的原因,如果您将辅助设备设置为仅接受显式设置为的连接,ApplicationIntent
而ReadOnly
您的作业没有这样做,那么它将被拒绝(即使您知道它不会执行任何写入操作) )。