我有几个表需要在我们的SQL Server 2008集群中的多个数据库上进行复制/同步。
我知道可以在多个实例之间进行复制,但我正在寻找特定数据库表之间的同一实例中的复制或同步。
复制/同步应该每隔半小时左右进行一次,但我并不介意这种情况经常发生。
我不能使用DROP目标表和INSERT(复制)源表,因为有许多限制。
原因是在应用程序层不pipe理,同时写入2个不同的数据库。
例:
DB1有T1,T2和T3 – 这些不断被应用程序更新,在DB1上运行APP1。
DB2需要随时更新T1的副本,另外还有一个不同的应用程序,APP2只能在DB2上运行。
DB1和DB2位于同一个实例INST1上。
是否有可能将T1,T2和T3从DB1复制到DB2?
首先,可以在同一实例的不同数据库之间build立SQL Server的复制function。
设置和pipe理SQL Server复制可能比您想要做的更努力。 有很多决定要做(什么样的复制?所有的列或其中的一些?所有的行或只是其中的一部分?我想索引目标表吗?某些types的复制需要更改底层的数据模型,如果你不控制应用程序的源代码,甚至可能改变数据模型,等等),复制可能会中断,并且可能不会被注意到一段时间,日志文件可能会意外增长。
使用触发器时,必须在底层表更改的情况下维护触发器代码。 如果触发器停止工作会发生什么? 你如何重新同步表格? 这需要多长时间? 等等
正如在评论中提到的,复制的一个替代方法是使用视图。 潜在的,这意味着在基表(T1,T2,T3)由于任何原因而改变的情况下保持代码。 因此,这是我的第二个build议。
我的第一个build议是使用“同义词”function来简单地引用原始表。 如果使用视图或同义词,则数据将只存储在一个位置(DB1),因此不必担心同步数据副本之间的更改。
这里(对于视图或同义词)可能的负面影响是DB2实际上不包含T1数据,所以DB2的备份和恢复(对于testing或开发服务器)也需要备份和恢复DB1。
对于同义词的使用,我有类似的问题和具体的挑战。 我有两个数据库在同一台服务器上,服务于两个独立的应用程序。 DB1包括与保险代理人信息有关的信息。 DB2包含与直接邮件和其他营销计划相关的信息。
DB1中的AGENT表中的代理信息在DB2中是需要的,所以我可以将代理与我们的直接邮件和其他市场营销程序相关联。 这个关联需要使用PK / FK关系来定义。 问题1:在DB2中使用引用了DB1中的AGENT表的视图或表值函数不允许我在视图/函数中将DB2中的相关表中的FK引用为FK。 问题#2:如果您在DB1中的代理表之外定义了一个同义词,则不能在引用同义词的DB2中的其他表中定义FK。
如果DB1中的代理表是主节点,并且DB2具有作为DB1订阅服务器的代理表,那么我不应该能够定义其他关系,将唯一索引等添加到应用程序的DB2代理表中它正在提供数据。
例如,运行DB1的应用程序不需要代理的县进行索引。 运行DB2的应用程序确实需要代理的县进行索引。 我如何使用复制并允许订阅者在DB2中拥有唯一的关系和索引?
是只从DB1-> DB2? 或者您想要在DB2-> DB1中发生的更改?
你有没有想过使用触发器的解决scheme?
在同一个实例之间使用SQL Server复制也是没有问题的。
如果它在同一个实例上,则快速解决scheme是使用三个部分名称(database.schema.table视图)在数据表的每个数据库中创build一个同义词。 然后,将每个数据库中的表/同义词称为本地资源,并且您可以select稍后切换到复制,只需保持表名相同即可。