我需要创建一个链接服务器,针对 SQL Server 2012 可用性组,并希望将所有请求路由到只读副本。然而,我一直无法确定如何指定只读应用程序意图,以确保请求被路由到正确的副本。
有人成功地以这种方式配置了链接服务器吗?
我需要创建一个链接服务器,针对 SQL Server 2012 可用性组,并希望将所有请求路由到只读副本。然而,我一直无法确定如何指定只读应用程序意图,以确保请求被路由到正确的副本。
有人成功地以这种方式配置了链接服务器吗?
EXEC sp_addlinkedserver
@server = N'linked_svr',
@srvproduct=N'SqlServer',
@provider=N'SQLNCLI11',
@datasrc=N'AG_Listener_Name',
@provstr=N'ApplicationIntent=ReadOnly',
@catalog=N'MY_DB_NAME';
当测试与数据库的链接服务器连接时,即使在连接参数中指定了ApplicationIntent=ReadOnly,我发现仍然会访问主数据库。
经过进一步调查,我发现导致这个问题的根本原因是与该登录相关联的默认数据库设置为“master”。您可以通过运行以下查询来测试此内容:
sp_helplogins
ApplicationIntent=ReadOnly;Database=database-db
SELECT * FROM [server].[database].[scheme].[table]
我没有AlwaysOn可用性组来测试这个,但是您可以在通过sp_addlinkedserver设置链接服务器时指定连接字符串。
SQL Server 2012接受以下内容并成功创建一个链接服务器,无论它是否遵守ApplicationIntent属性,您都必须进行测试,但是它应该会这样做,因为它被设置为使用本地客户端作为提供程序:
sp_addlinkedserver
@srvproduct = 'DB', --Don't use 'SQL Server' otherwise it won't let you set any properties
@server = 'LINKED-SERVER-NAME',
@provider = 'SQLNCLI',
@provstr = 'Data Source=SERVER\INSTANCE;Initial Catalog = Database;ApplicationIntent=ReadOnly'
我已经在只读节点上使用了CNAME。 对于只读服务器,sql AO或Windows集群非常有用。 例如:您的第二个节点服务器名称为SERVERB,您可以将其重定向到以下别名名称。 SERVERB -----> SERVERB.corp.contoso.com。
然后从SSMS检查是否可以连接,或者从命令提示屏幕ping别名名称是否有效。
ping SERVERB.corp.contoso.com