none
请问SQL Server的链接服务器使用的是什么网络协议,可以指定吗? RRS feed

  • 问题

  • 在创建一个链接服务器时遇到了如下错误,数据库版本是2008R2,默认实例名,单机。

    与链接服务器的测试连接失败。
    
    ------------------------------
    其他信息:
    
    执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
    
    ------------------------------
    
    Named Pipes Provider: Could not open a connection to SQL Server [1326]. 
    链接服务器"172.16.66.53"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Login timeout expired"。
    链接服务器"172.16.66.53"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 
    "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. 
    Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. 
    For more information see SQL Server Books Online."。 (Microsoft SQL Server,错误: 1326)

    看了下确实库服务器这边没有开启name piped网络协议,但是我在本机进行测试,禁用此协议后创建一个链接服务器也是成功的(2008R2到2014的dblink),说明默认使用了TCP/IP协议。使用的网络协议是否可能还和两端的版本有关?是否有其他的因素影响?是否能指定协议?

    提前谢谢各位解答~


    2017年10月30日 7:20

全部回复

  • Depends on settings on both servers and how to create linked server, you can specify protocol like to use.
    2017年10月30日 16:15
  • 没看明白,你的链接服务器是那台中创建,链接的那台?

    假设操作的机器是 A, 要链接的服务器是B, 要在 C 中创建B的链接服务器,那么在 C 上,是否可以用 sql server 工具连接B ?

    2017年10月31日 1:26
  • Depends on settings on both servers and how to create linked server, you can specify protocol like to use.

    但在新建链接服务器时并未发现有可以指定网络协议的选项。报错的环境具体是这样的:

    想要在A服务器上创建到B的链接服务器,AB都是2008R2版本的SQL Server数据库服务器。其中A上只开了shared memory和tcpip协议,B由于是第三方的服务器因此开启的网络协议未知(但tcpip肯定开启了)。

    如果和两边的配置有关,请教下应该在哪里设置&创建linked server时应该如何指定网络协议,以避免出现如上错误,谢谢。

    2017年10月31日 3:27
  • 没看明白,你的链接服务器是那台中创建,链接的那台?

    假设操作的机器是 A, 要链接的服务器是B, 要在 C 中创建B的链接服务器,那么在 C 上,是否可以用 sql server 工具连接B ?

    不涉及第三台服务器,只考虑两个数据库服务器之间的dblink。
    2017年10月31日 3:28
  • 只两台就是A=C嘛,那么还是同样的问题,C 上通过 sql server 工具能够访问B ?
    2017年10月31日 6:55
  • 是的,正常访问都是没问题的,只是奇怪为何创建链接服务器报这个错
    2017年10月31日 7:07
  • Depends on settings on both servers and how to create linked server, you can specify protocol like to use.

    但在新建链接服务器时并未发现有可以指定网络协议的选项。报错的环境具体是这样的:

    想要在A服务器上创建到B的链接服务器,AB都是2008R2版本的SQL Server数据库服务器。其中A上只开了shared memory和tcpip协议,B由于是第三方的服务器因此开启的网络协议未知(但tcpip肯定开启了)。

    如果和两边的配置有关,请教下应该在哪里设置&创建linked server时应该如何指定网络协议,以避免出现如上错误,谢谢。

    Can you post script of that linked server?

    2017年10月31日 15:43
  • 链接服务器生成脚本出来看看
    2017年11月1日 2:51
  • Depends on settings on both servers and how to create linked server, you can specify protocol like to use.

    但在新建链接服务器时并未发现有可以指定网络协议的选项。报错的环境具体是这样的:

    想要在A服务器上创建到B的链接服务器,AB都是2008R2版本的SQL Server数据库服务器。其中A上只开了shared memory和tcpip协议,B由于是第三方的服务器因此开启的网络协议未知(但tcpip肯定开启了)。

    如果和两边的配置有关,请教下应该在哪里设置&创建linked server时应该如何指定网络协议,以避免出现如上错误,谢谢。

    Can you post script of that linked server?

    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedserver @server = N'x.x.x.x', @srvproduct=N'SQL Server'
    
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'collation compatible', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'data access', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'dist', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'pub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'rpc', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'rpc out', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'sub', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'connect timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'collation name', @optvalue=null
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'lazy schema validation', @optvalue=N'false'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'query timeout', @optvalue=N'0'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'use remote collation', @optvalue=N'true'
    GO
    EXEC master.dbo.sp_serveroption @server=N'x.x.x.x', @optname=N'remote proc transaction promotion', @optvalue=N'true'
    GO
    USE [master]
    GO
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'x.x.x.x', @locallogin = NULL , @useself = N'False', @rmtuser = N'sa', @rmtpassword = N'######'
    GO


    2017年11月1日 8:22
  • 创建脚本已贴,现场告诉我在开启了name piped协议后,他们找时间重启了服务,链接服务器已经创建成功了。

    所以问题就比较明确了,创建DBLINK时,为何会选择使用这个协议?

    2017年11月1日 8:26
  • So you created linked server on A that points to B?
    2017年11月1日 15:50
  • 你可以通过链接服务器执行一个 WAITFOR DELAY 保持一个连接

    然后在链接服务器上执行

    select * from sys.dm_exec_connections

    来确认连接使用使用的协议

    从脚本上看没有什么特别的,可以排查一下客户端的配置,启动 SQL Server 配置管理器

    在 SQL Server Client 配置中,检查一下客户端协议,是否 TCP 协议放到 Named Pipes 后面了,另外,在别名中,检查一下是否配置了别名使用 Named Pipes 协议

    2017年11月2日 1:16
  • 你这种方式去创建连接服务器肯定是使用tcp IP 不会用命名管道的

    2017年11月3日 9:44