标签: linked-server

链接 SQL Server 有哪些重大限制?

我们的产品基于 Microsoft SQL Server。目前,我们使用了三个数据库,并且始终将它们部署在一个 SQL Server 实例上。

这三个数据库是OLTP、OLAP和审计。OLAP 数据库有大量来自 OLTP 和审计的 EOD 入站数据,使用跨数据库查询。

问题

如果我们将这三个数据库部署到单个物理服务器内的三个独立的标准版实例上,并使用 SQL Server 的链接服务器功能将它们绑定在一起:

  1. 它对应用程序代码有多透明?我应该期待多少变化?
  2. 到 OLAP 的入站数据为 50k-100k 行,每个 EOD 的有效负载为 200-500MB。我应该期望多少性能下降?
  3. 我应该期待哪些其他重大限制?

背景

目前,我们正在向拥有 500 多个并发用户的潜在客户进行宣传。

我们正在起草服务器规范,其中包括 64 个内核和 256GB RAM。为了让 SQL Server 能够利用所有这些丰富的资源,客户必须购买企业版,而对于 SQL Server 2016,它仅在基于每核的许可中可用。

我们担心仅许可成本(64 x 7400 美元)就会让他们失望。所以我想把数据库拆分成三个标准版的实例,并把它们链接在一起,希望链接功能对应用程序代码是透明的。

performance sql-server linked-server sql-server-2016

9
推荐指数
1
解决办法
1478
查看次数

Kerberos 身份验证不适用于 SQL Server 2012 中的链接服务器

我正在使用 2 个在 Windows Server 2012 上运行 SQL Server 2012 的 SQL Server 设置 DEV/TEST 环境。我们正在从 Windows Server 2008 上的 SQL Server 2005 迁移,在那里我们已经正确启动并运行。

在 SQL Server 2012 中,Kerberos 身份验证不起作用。

每个服务器都有自己的 Active Directory 帐户,该帐户具有通过 Active Directory 用户和计算机授予的“写入服务主体名称”和“读取服务主体名称”权限。每当我连接到 SQL Server 2005 服务器并运行:

SELECT net_transport, auth_scheme 
FROM sys.dm_exec_connections 
WHERE session_id = @@SPID;
Run Code Online (Sandbox Code Playgroud)

我懂了:

net_transport    auth_scheme
TCP              KERBEROS 
Run Code Online (Sandbox Code Playgroud)

当我对新的 SQL Server 2012 实例执行相同的查询时,我看到:

net_transport    auth_scheme
TCP              NTLM 
Run Code Online (Sandbox Code Playgroud)

如果我SetSPN -Q MSSQLSvc/*用来查询服务主体名称的活动域,我会看到列出的 2005 和 2012 服务器,除了服务器名称之外,其他方式完全相同。

例如:

MSSQLSvc/SERVERa2005.domain.inet
MSSQLSvc/SERVERa2005domain.inet:1433
MSSQLSvc/SERVERb2005.domain.inet
MSSQLSvc/SERVERb2005domain.inet:1433
MSSQLSvc/SERVERa2012.domain.inet
MSSQLSvc/SERVERa2012domain.inet:1433 …
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server sql-server-2012 kerberos

8
推荐指数
1
解决办法
6397
查看次数

禁止为链接服务器推广分布式事务的安全隐患

我有一个链接服务器,我需要运行以下语句:

INSERT INTO...EXEC linkedserver.sp @parameter
Run Code Online (Sandbox Code Playgroud)

两台服务器都是 SQL Server 2008R2 SP1。一旦我运行它,我就会收到此错误:

消息 7391,级别 16,状态 2,第 6 行 由于链接服务器“MY.LINKED.SERVER”的 OLE DB 提供程序“SQLNCLI10”无法开始分布式事务,因此无法执行该操作。

搜索错误后,我看到很多建议运行:

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'
Run Code Online (Sandbox Code Playgroud)

我应该注意此操作是否有任何安全隐患?

其他选项是在主服务器上使用链接服务器对象的高级属性:

在此处输入图片说明

sql-server-2008-r2 linked-server distributed-transactions

8
推荐指数
1
解决办法
1万
查看次数

从链接服务器获取@@SERVERNAME

这似乎是一个基本问题,但我找不到任何答案 - 我需要能够从链接服务器获取服务器名称/实例等。我尝试了几件事:

select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
Run Code Online (Sandbox Code Playgroud)

......但没有快乐。有任何想法吗?

这是SQL 2008 R2& 2014(2008R2是链接服务器)

编辑:错误是:

消息 102,级别 15,状态 1,第 2 行“@@SERVERNAME”附近的语法不正确。

sql-server sql-server-2008-r2 linked-server openrowset exec

8
推荐指数
2
解决办法
2万
查看次数

链接服务器查询在哪里执行?

我有两个实例ServerAServerB,并且我在ServerA 中ServerB创建了一个链接服务器作为Linksrv_B

我可以使用四部分命名约定在ServerA上执行查询:

SELECT * FROM Linksrv_B.master.sys.databases
Run Code Online (Sandbox Code Playgroud)

OPENQUERY()

SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  
Run Code Online (Sandbox Code Playgroud)

我知道链接服务器使用分布式事务作为行集跨异构数据库工作。

  1. OLEDB 提供程序在哪里启动/连接?服务器A还是服务器B?
  2. 查询是在 ServerA 还是 ServerB 上执行的?优化器是否在哪个服务器上发挥作用?
  3. 结果集在哪里缓存?
  4. 谁能给我们一个详细的解释链接服务器是如何工作的。

sql-server linked-server distributed-transactions openrowset distributed-queries

8
推荐指数
1
解决办法
1753
查看次数

从 SQL Server 查询外部 LDAP 服务器

我对查询 LDAP 服务器进行了广泛的研究,但到目前为止还没有解决。所以请高手帮忙

背景:我有一个客户端,其 LDAP 服务器是 OnPremise(虽然面向公众),我在防火墙内有一个 SQL Server(2012 SE)。外部 LDAP 和内部 SQL Server 之间的通信很好,因为我可以互相 ping 通。我还创建了一个远程域帐户,并在 SQL Server 上创建链接服务器时使用了该帐户。我还有我们的内部域控制器,它具有域信任关系。现在,我使用域帐户创建了 2 个链接服务器,但我无法在内部和外部查询 LDAP 服务器。我希望这是有道理的。无论如何,这是我的链接服务器的定义和我收到的错误

[已解决] 链接服务器到内部 LDAP 服务器:这是通过使用 ADuser@domain.com 而不是 domain/ADuser 解决的

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active 
Directory Service Interfaces', @provider=N'ADSDSOObject', 
@datasrc=N'adsdatasource'

EXEC master.dbo.sp_addlinkedsrvlogin 
@rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,
@rmtuser=N'Domain/ADUser',@rmtpassword='########'
Run Code Online (Sandbox Code Playgroud)

错误:

消息 7321,级别 16,状态 2,第 1 行准备查询时出错“SELECT *
FROM 'LDAP://Domain.com/OU=Accounts,DC=Domain,DC=com' --WHERE objectClass = 'User ' " 用于针对链接服务器 "ADSI" 的 OLE DB 提供程序 "ADSDSOObject" 执行。

链接服务器到外部 LDAP 服务器

USE …
Run Code Online (Sandbox Code Playgroud)

sql-server windows linked-server sql-server-2012 active-directory

8
推荐指数
1
解决办法
4397
查看次数

使用 INSERT INTO...EXEC AT 链接服务器进入临时表失败并显示消息 7391

我正在使用 SQL Server 2014。我想执行EXEC (@remotecmd) AT [server_name];(@remotecmd 是动态 sql 而不是存储过程)到##eapb. 我的代码是

insert into ##eapb
EXEC (@remotecmd) AT [ADSQLDB3S\DEV];
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

链接服务器“server_name”的 OLE DB 访问接口“SQLNCLI11”返回消息“事务管理器已禁用对远程/网络事务的支持。”。
    消息 7391,级别 16,状态 2,第 71 行
    由于链接服务器“server_name”的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务,因此无法执行该操作。

如果我删除insert into ##eapb,我没有错误。

链接服务器的RPC Out选项设置为True

sql-server dynamic-sql t-sql linked-server temporary-tables

8
推荐指数
1
解决办法
1万
查看次数

如何为链接服务器启用分布式事务?

我有一个 SQL Server 2012 实例,其中一个链接服务器使用 System i Access ODBC 驱动程序指向 IBM Iseries 系统上的 db2 数据库。

我正在尝试启用分布式事务。我相信该提供商确实根据IBM 文档支持它们(除非我误解了该链接)。

我正在运行以下查询:

BEGIN TRANSACTION
    UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE

    SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]登记 DTC 阶段失败。2”。消息 7391,级别 16,状态 2,第 2 行 由于链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务,因此无法执行该操作。

我对这个错误所做的所有研究都遇到过想要禁用分布式事务而不是让它们工作的人。我已经在链接服务器属性上将“启用分布式事务的提升”设置为 true。

任何想法如何让这个工作?

编辑:更多信息/更新。当我在 Windows 日志中注意到这一点时,我正准备暂时放弃这个并等待帮助:

当 XA 事务被禁用时,调用者试图注册一个 XA 资源。

我找到了这个链接,它告诉我如何修改 …

sql-server linked-server sql-server-2012 iseries distributed-transactions

7
推荐指数
2
解决办法
7万
查看次数

SQL Server:链接服务器中的频繁登录超时过期

我正在使用 SQL Server 2012。我安排了一个作业每 1 小时运行一次,其中 1 个步骤调用 1 个简单的存储过程。存储过程将大约 1K 数据从生产服务器迁移到我们的本地服务器。已成功建立链接服务器。存储过程中使用的查询如下所示。

SELECT ID,Col1,Col2,Col3,Col4,Col5 into #temp from [111.111.111.111].ProdServer.dbo.SourceTable

Insert into Localtable(ID,Col1,Col2,Col3,Col4,Col5)
SELECT ID,Col1,Col2,Col3,Col4,Col5
FROM #temp where ID NOT IN (select ID from Localtable)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

作业执行有时需要 25-30 秒才能成功执行。有时需要 48-50 秒导致失败。请参阅下面的失败消息和上面屏幕截图中的其他详细信息。

失败信息:

以用户身份执行:NT AUTHORITY\NETWORK SERVICE。命名管道提供程序:无法打开与 SQL Server [53] 的连接。[SQLSTATE 42000](错误 53)链接服务器“111.111.111.111”的 OLE DB 访问接口“SQLNCLI10”返回消息“登录超时已过期”。[SQLSTATE 01000](错误 7412)链接服务器“111.111.111.111”的 OLE DB 访问接口“SQLNCLI10”返回消息“与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。服务器未找到或未找到可访问。检查实例名称是否正确,以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。”。[SQLSTATE 01000](错误 7412)。步骤失败。

更多细节

  • 该表被任何人锁定,并且没有在其上运行任何查询。
  • 在链接服务器属性中,查询超时和连接超时都设置为 0。
  • 在服务器属性远程查询超时也设置为 600 秒。

作为最后一个选项,我尝试将连接超时设置从默认值 15 更改为 6000 …

sql-server linked-server jobs

7
推荐指数
2
解决办法
4万
查看次数

Sql Azure 数据库中的链接服务器替代方案

我们正在将数据库从 Rackspace 迁移到 Azure。我们的数据库部署在机架空间中的虚拟机上。在我们的查询中,我们使用链接服务器到其他数据库。基本上是跨数据库查询。问题是,迁移数据库后,我们无法使用链接服务器查询,因为 Sql Azure db 不支持链接服务器。

请帮忙。

更新:

  • 并非所有数据库都位于 Azure 中。有些数据库的所有者位于远程位置。我们需要查询在 Azure 外部运行的数据库。

  • Azure 中没有适用于 Sql Server 的 VM。我们在 Azure 中使用数据库即服务。

请参阅下图了解更多详情

在此输入图像描述

sql-server migration linked-server azure-sql-database

7
推荐指数
1
解决办法
1万
查看次数