我有一个由不同公司维护的云托管数据库。这是我的场景:
如何关闭整个数据库、模式和数据,并保持我的本地数据库实时更新?
编辑:我能够从托管公司运行脚本,因此我可以创建数据库以及架构和初始数据。
最重要的问题是如何让数据保持实时同步?现在,我正在考虑在 SQL 中执行一系列作业来查询链接服务器数据库,如下所示:
insert into local_table_1
select * from linkedserver_table1
except
select * from local_table_1
Run Code Online (Sandbox Code Playgroud)
问题是,它效率不高,并且不会提取任何更新的记录。我们确实有一个“Updated_date”字段。如何更新本地服务器,从链接服务器中选择所有记录,并更新本地数据库?
我使用 SQL Server 2014 链接服务器连接到 Oracle 11gR2 (11.2.0.3) 数据库,使用 ODAC 12.1.0.2.4 Oracle OLE DB 提供程序。我有一个存储过程,它位于 SQL 2014 数据库中,并使用以下语法通过链接服务器将本地表中的数据插入到远程 Oracle 表中:
insert into LinkedServerName..RemoteSchema.RemoteTable(column)
select column from localSQLServerTable
Run Code Online (Sandbox Code Playgroud)
但是,我在插入行中收到以下错误:
消息 7356,级别 16,状态 1,过程 {MyProcName},第 1 行链接服务器“{MyLinkedServer}”的 OLE DB 提供程序“OraOLEDB.Oracle”为列提供了不一致的元数据。据报告,对象“{remote table name}”的列“{columnName}”(编译时序数为 23)在编译时的“DBCOLUMNFLAGS_ISFIXEDLENGTH”为 16,在运行时为 0。
有问题的列在 Oracle 中定义为CHAR(1 BYTE)数据类型。
安装了“64 位 ODAC 12c 第 4 版 (12.1.0.2.4) Xcopy for Windows x64”,从http://www.oracle.com/technetwork/database/windows/downloads/index-下载名称“ODAC121024Xcopy_x64.zip” 090165.html
我们有两台 SQL 2014 服务器,我在其中一台上创建了一个链接服务器到另一台上。作为我尝试运行的任务的一部分,我需要将 SQL 用户 ID 转换为本地和链接服务器上的用户名。
在本地服务器上,我可以调用
SELECT SUSER_NAME(1)
Run Code Online (Sandbox Code Playgroud)
这将返回字符串 sa
是否有一种简单的方法可以SUSER_NAME在链接服务器上运行该函数以从那里获取值?
我认为我发现的另一种选择是加入sys.server_principals并从那里拉出名称,但SUSER_NAME似乎是一种更清洁的方法。
我正在尝试运行以下查询以在链接服务器上的表上重建索引,但它不起作用。任何人都可以让我知道我做错了什么吗?
ALTER INDEX ALL ON [LinkedServerName].[dbname].[dbo].[tablename] REBUILD
WITH (FILLFACTOR = 90)
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
找不到对象“[LinkedServerName].[dbname].[dbo].[tablename]”,因为它不存在或您没有权限。
我的本地和远程服务器都使用 SQL Server 2008 R2,但本地服务器最近升级到 SQL Server 2014,并且远程查询的性能受到影响(字面上从几分钟到几小时)。
看来问题在于将数据发送到远程服务器,所以,只要我只是从远程服务器读取数据,它就可以正常执行,只是,如果查询是基于本地端的数据,则似乎是有效地将数据发送到远程服务器。我无法在远程服务器端设置链接服务器,所以我无法从本地服务器拉取远程服务器。
在大多数情况下,我可以重写查询以将数据从远程服务器拉到本地表中,过滤本地数据,然后将相对较少的更新发送到远程服务器 - 仍然比以前慢,但功能正常。
然而,当做任何涉及大量记录的事情时,它是不可用的。典型的例子是这个查询(最初它在本地服务器上执行更复杂的查询,所以我将其更改为首先填充最终表的本地副本,以便我可以对 INSERT 执行最简单的查询);
INSERT INTO [REMOTE-DB].Databasename.dbo.Test_Table
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
即使当我尝试 OPENQUERY 时,它似乎也没有更快;
INSERT OPENQUERY ([REMOTE-DB], 'SELECT Person_Nbr, FullName, Birth FROM Databasename.dbo.Test_Table')
SELECT Person_Nbr, FullName, Birth
FROM Test_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
如果不是这在旧版本的 SQL Server 上几乎立即起作用,我会接受这是一个事实,但性能差异如此巨大,似乎必须有一些我遗漏的明显修复. 我无法控制本地服务器,但他们的 DBA 声称数据库配置与旧设置一致。
你有什么想法我可以做些什么来解决这个问题,或者我可以指点 DBA 吗?
我正在设置从本地 SQL Server 到 MS Azure 上的数据库的链接服务器(见下文)。当非管理员用户通过链接服务器查询 Azure 数据库时,他们会得到:
Msg 7416, Level 16, State 2, Line 1 访问远程服务器被拒绝,因为不存在登录映射。
关于如何让这个工作的任何想法?
EXEC sp_addlinkedserver
@server='LincServer',
@srvproduct='',
@provider='sqlncli',
@datasrc='myAzureDB.database.windows.net',
@location='',
@provstr='Encrypt=Yes;TrustServerCertificate=No;User ID=myAzureID',
@catalog='MyDB'
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LincServer',
@useself = 'false',
@rmtuser = 'myAzureID',
@rmtpassword = '########'
GO
Run Code Online (Sandbox Code Playgroud) 我遇到了无法理解的链接服务器的情况。
所以我们有一个从 2008R2 服务器到 2014 服务器的链接服务器。下面的示例查询是从 2008R2 服务器执行的,并且工作正常。
SET XACT_ABORT ON;
Declare @BatchSize int = 10
DELETE from LINKEDSRV.DB.DBO.Table
INSERT INTO LINKEDSRV.DB.DBO.Table (ECN)
SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1
SELECT * FROM LINKEDSRV.DB.DBO.Table
Run Code Online (Sandbox Code Playgroud)
但是当我用order by C1它执行同样的事情时,它不会返回任何结果。
第二种情况 - 如果我替换TOP(10)withTOP(@BatchSize)和 noorder by也不会得到任何结果。例如
SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22
Run Code Online (Sandbox Code Playgroud)
如果我SET XACT_ABORT OFF. 那么 XACT_ABORT 对链接服务器有任何限制吗?
编辑- 进行了更多测试,看起来它也与行数有关
可能的回购
在服务器 A 上
use testdb
go
create table t1( c1 …Run Code Online (Sandbox Code Playgroud) 链接服务器“001”的 OLE DB 访问接口“SQLNCLI11”返回消息“由于打开服务器连接延迟,无法完成登录过程”。消息 7303,级别 16,状态 1,第 19 行无法初始化链接服务器“001”的 OLE DB 访问接口“SQLNCLI11”的数据源对象。
我意识到有很多潜在适用的 SO 帖子和谷歌点击(其中许多我已经阅读了很多次),所以让我来看看我们所看到的和我们已经尝试过的。老实说,我现在不知道还有什么可看的。
我们将链接服务器 001(目标)转到 002(源)作为 SQL 登录名,该登录名从 C#/.Net 应用程序代码作为 proc 通过数据访问方法和 SSPI 连接字符串通过具有适当权限的服务帐户调用。我相信 .Net 版本是 4.3,现在是 4.7,但问题在两者中都存在。它是从不同网络上的旧 2008R2 环境迁移而来的,这在物理设备上从来都不是问题,而且两个新的当前都是 64 位 2016 虚拟机。
它在问题期间始终可重现,但在其他情况下则不然,并且似乎总是相同的调用。对于阻塞/死锁/奇怪的锁定页面或对象,sp_what 中没有显示任何内容。如果未报告该问题,则该问题将无法重现。有时它只发生一次或两次,有时持续 10-15 周,然后它会正常工作数周。不确定它是否相关,但是当我们看到这个时,应用程序偶尔也会显示线程中止,但我认为这更像是一种症状。
我在这里缺少什么?
作为最近的安全闪电战的一部分,我们在所有服务器上设置了 TLS 1.2。昨晚我在我们所有的 SQL Server 上翻转了“强制加密”标志,从那时起我在链接服务器上遇到了一个奇怪的问题。
我有两台服务器;
服务器 A 运行 SQL Server 2016 SP2 CU3
运行 SQL Server 2012 SP4 的服务器 B
两者都有正确的加密证书,都有必要的注册表编辑来禁用 SSL 和 TLS 1.0 和 1.1,只启用 TLS 1.2。两者都在 SQL Server Config Mgr 中设置了证书并设置了“强制加密”。
从服务器 A 到 B(2016 年到 2012 年)的链接服务器工作正常。从服务器 B 到 A(2012 年到 2016 年)的链接服务器显示服务器并列出数据库,但任何通过该链接服务器查询表的尝试都会生成错误:
TCP Provider: The specified network name is no longer available. (Microsoft SQL Server, Error: 64)
但是,我可以在服务器 B 上启动 SQL Server Management Studio 会话并连接到服务器 A 就好了。所以只有链接服务器有问题。
我检查了服务器 A 上的扩展事件,我可以看到使用 TLS 1.2 来自服务器 …
我有一个位于意大利的链接服务器,server_italia它连接到位于美国俄勒冈州的服务器ORDB1
我们在不同但受信任的域上。
从连接server_italia到ORDB1通过链接服务器使用具有登录和所要求的权限的SQL Server的帐户进行ORDB1。
我是一个sysadmin甚至domain admin在我的域中,而我的server_italia但我只sysadmin在 .sql server 中ORDB1。
有一个类似的问题:
但它没有提供the答案。
这是我的链接服务器:
当我运行以下查询时,server_italia我得到以下结果:
SELECT [the_server]=@@servername,
auth_scheme
FROM sys.dm_exec_connections WHERE session_id = @@spid ;
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
Run Code Online (Sandbox Code Playgroud)
在俄勒冈州,我得到了这个:
如果我的美国同事得到:
在他们的服务器上设置 Kerberos 身份验证
配置约束委派,因为这将允许传递凭据,否则您可能仍会遇到双跳问题。– 在John Eisbrener的评论中添加
我可以在linked …
linked-server ×10
sql-server ×10
connections ×1
connectivity ×1
errors ×1
functions ×1
index ×1
insert ×1
kerberos ×1
logins ×1
tls-1.2 ×1