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