Shm*_*nix 5 sql-server linked-server sql-server-2012
我有一个由不同公司维护的云托管数据库。这是我的场景:
如何关闭整个数据库、模式和数据,并保持我的本地数据库实时更新?
编辑:我能够从托管公司运行脚本,因此我可以创建数据库以及架构和初始数据。
最重要的问题是如何让数据保持实时同步?现在,我正在考虑在 SQL 中执行一系列作业来查询链接服务器数据库,如下所示:
insert into local_table_1
select * from linkedserver_table1
except
select * from local_table_1
Run Code Online (Sandbox Code Playgroud)
问题是,它效率不高,并且不会提取任何更新的记录。我们确实有一个“Updated_date”字段。如何更新本地服务器,从链接服务器中选择所有记录,并更新本地数据库?
您的问题没有复制或开箱即用的解决方案,特别是因为您没有对远程机器的那种类型的访问权限。正如这里的其他评论者所指出的那样,您可能必须构建自己的 ETL 逻辑,可能采用以下方式之一:
OPENQUERY()或的链接服务器和存储过程OPENROWSET(),远程表中的“上次更新”列对您有很大帮助,因为您不必每次运行 ETL 过程时都下载整个数据库的内容。如果不能在远程服务器上安装或修改任何东西,就没有实际的“实时”同步方法。您可以同步数据库的频率和速度可能归结为:
我会设定每天同步数据几次的合理期望,例如清晨、午餐、傍晚和/或晚上。确保计划这些执行,以免它们与正在运行的备份作业(本地,如果可以,远程)发生不必要的冲突。让远程方参与进来,这样您就不会使他们的服务器过载。
T-SQL 示例
假设您使用存储过程和链接服务器,这里有一个关于如何去做的想法。首先,如果现有数据永远不会改变,即只添加行(比如会计交易或其他东西):
DECLARE @lastUpdated datetime2(3),
@sql varchar(max);
--- What's the most recent row we've downloaded?
SELECT @lastUpdated=MAX(lastUpdated)
FROM dbo.tableName;
--- Build dynamic SQL
SET @sql='
INSERT INTO dbo.tableName (x, y, z, lastUpdated)
SELECT x, y, z, lastUpdated
FROM OPENQUERY(linkedServerName, ''
SELECT x, y, z, lastUpdated
FROM databaseName.dbo.tableName
WHERE lastUpdated>={ts '''''+CONVERT(varchar, @lastUpdated, 121)+'''''}
'');
';
--- Execute dynamic SQL
EXECUTE sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
...并对每个表重复此过程。您可能会遇到外键约束的问题,因此您可能必须仔细安排表的顺序,但最终您最好在本地数据库中根本没有任何外键约束。
如果您现有的行可以更改,SQL 脚本看起来类似,除了您首先将数据下载到临时表,为临时表分配一个唯一的聚集主键,然后MERGE(“upsert”)临时表的内容到您的本地桌子。如果你不喜欢或不信任MERGE,可以很明显的使用INSERT和UPDATE旧的方式方法。请注意,您不会以这种方式捕获已从远程表中删除的行。
使用 SSIS
使用 SSIS(或者如果您决定构建您自己的本地应用程序),工作是相同的,但您不需要链接服务器,并且sp_executesql您将动态构建 SQL 语句并通过 ADODB 或类似程序运行它们,而不是使用。数据库连接。
为了完整起见,我已经包含了“构建您自己的应用程序”选项;我不会走那条路。
索引注意事项
为了使远程查询尽可能高效,您可能需要调查是否可以让远程 DBA 在每个表的“上次更新”列上设置索引。
备份选项
最后,我可能会考虑 Aaron Bertrand 的建议并尝试设置一个解决方案,您可以在其中下载远程数据库的备份(可能是完整备份,每晚一次),在本地还原该备份并在本地执行同步操作服务器。
即时的
回到实时问题——这里的驱动参数必须是业务。如果管理层需要您的数据库达到最新的准确性,那么有人将不得不接受工作量和成本的显着增加,更不用说维护了。最后,您可能会发现高速租用线路可能会便宜很多,并且您可以通过每月一次左右的大量下载来存档数据。
| 归档时间: |
|
| 查看次数: |
2917 次 |
| 最近记录: |