我在电脑和平板电脑上有一个程序。该程序使用 SQL Server Express 与.MDF
文件中的本地数据库(两者的信息相同)进行交互。因此,如果我将平板电脑插入 PC,我有两个.MDF
要同步的文件。
我希望两个用户都能够更改他们设备上的版本,然后我想获取这两个.MDF
文件并运行一个合并它们的脚本。
数据库有一个 GUID 主键,以及DateTime
上次更改的时间,所以如果有冲突,我会采用最新版本。
我该怎么做?
或者,如果我以错误的方式解决这个问题,您能否推荐一种替代方法来保持这两台机器的数据库在没有互联网连接的情况下同步?
提前致谢。
如果没有 Internet 连接,您将看到合并或对等复制。两者都不能轻松实现(谷歌我似乎记得在某处看到过解决方法)你想要如何使用 Express 版。如果您有标准或更好的版本,我个人会选择 Peer-To-Peer,因为它不需要为每个表添加额外的列,并且像合并一样包括冲突解决。请注意,在我看来,复制是一项相当挑剔的技术,需要中级 DBA 技能才能有效地实施和排除故障。另请注意,一旦复制被暗示,事务日志备份或检查点(取决于您的恢复模型)将无法清除任何事务,直到它被分发给其订阅者。根据同步之间的持续时间和命令数量,这将导致您的事务日志增长并可能填满磁盘。显然,如果可用磁盘空间已满,则无法在数据库中写入/更新新事务。
通过 Internet 连接,我肯定会考虑 Azure 为您提供两个设备都可以写入的单一数据库。
显然,您还可以通过 powershell、SSIS、C# 脚本获取和合并数据,或者通过 Windows 计划任务(SQL Server 代理不提供快速服务)获得 RedGate 数据比较和启动的试用许可证,并完成以下工作复制将开箱即用。
附带说明一下,根据您的使用情况,您可能可以获得与企业版相同的开发人员版 SQL Server 许可证。
编辑 1:点对点至少是 2008r2 和 2012 中的企业唯一功能,与标准中可用的合并不同
因为我比 T-SQL 更了解 Powershell 和 VB,所以我会使用其中一种语言从每个数据库中提取新记录,循环它们,然后将它们插入到另一个数据库中。该脚本将保存一个文件,其中包含来自每个数据库的最后一条记录的时间戳,它将在下次运行时使用该文件来获取比该日期更新的记录。...或存储在数据库中某处同步的最后一行的时间戳或 GUID。
您的“合并 .mdfs”术语可能会让人们离开这里,因为您不会尝试直接读取文件并合并差异。您只需在每个数据库中查询新记录并将它们插入到另一个数据库中。
你可以通过其他各种方法来解决这个问题——这只是一种。
看看现有技术:复制。
根据文档(强调添加):
大多数现有工具,如 Microsoft Sync 和 Merge-Replication,最终看起来都太过分了,而且比它们的价值更麻烦。
这是我附加数据库的 SQL 脚本
然后同步数据库