【问题标题】:Automatically Sync SQL Databases across two computers在两台计算机之间自动同步 SQL 数据库
【发布时间】:2014-12-20 17:58:10
【问题描述】:

我正在使用云备份/同步服务 (SpiderOak),它会自动在多台计算机/设备之间同步文件夹。

我正在尝试找出一种方法来自动同步我的工作计算机和个人笔记本电脑上的所有数据库,而实际上不需要从一个实例备份/恢复到另一个实例。

所以我的想法是在我的笔记本电脑上创建一个与我的工作桌面实例相同的新 sql 实例,然后选择 Program Files 中的两个 SQL Server 目录以使用 SpiderOak 相互同步(整个根 SQL服务器文件夹)。

这足以让我的两个实例相互同步吗?这意味着如果我在工作时在我的计算机上创建一个新数据库,当我打开 SQL Server Database Management Studio 时,我会在笔记本电脑上看到这个数据库吗?

我几乎可以肯定如果数据库已经存在,它们会相互同步(因为根文件夹包含 mdf 和 ldf 文件 - 但如果我错了,请纠正我)。但是,如果其中一台机器上尚不存在新数据库,我不确定是否会创建新数据库。

除了我已经指定的文件夹之外,我还需要同步其他文件夹吗?

【问题讨论】:

  • 为什么不使用在线数据库?
  • @RageCompex 因为我在我的开发机器上使用 SQL Express,并在部署之前使用它在本地测试我的本地软件。
  • 您可以使用 Microsoft Sync Framework,只要您有 2 个连接字符串 :) 您想要这个答案吗?
  • @RageCompex 如果这适用于 MS SQL Server 2008 那么是的,请这样做,我会接受它作为答案。我希望你说清楚,因为网上有很多关于 Microsoft Sync Framework 的文章,但它们并不直截了当。谢谢

标签: sql sql-server sql-server-2008 synchronization cloud


【解决方案1】:

你可以使用Sql Sync Framework,你可以下载它here 还有一些readfood 它适用于 Sql Server 2005 下载和导入参考并包含在默认参考中:

using System.Data.Sql;
using System.Data.SqlClient;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using System.Diagnostics;
using System.Reflection;
using System.Net;

比实际代码:

private void SyncTables()
{
    SqlConnection ConStringOnline = new SqlConnection("connstring");
    SqlConnection ConStringOffline = new SqlConnection("connString");
    SyncOrchestrator sync = new SyncOrchestrator();
    sync.Direction = SyncDirectionOrder.Download; //or DownloadAndUpload
    //the 'scope1' is important, read more about it in the articles
    var provider1 = new SqlSyncProvider("scope1", ConStringOnline);
    var provider2 = new SqlSyncProvider("scope1", ConStringOffline);

    PrepareServerForProvisioning(provider1);

    PrepareClientForProvisioning(provider2, ConStringOnline);


    sync.LocalProvider = provider2;
    sync.RemoteProvider = provider1;

    sync.Synchronize();

}

private static void PrepareServerForProvisioning(SqlSyncProvider provider)
{
    SqlConnection connection = (SqlConnection)provider.Connection;
    SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning(connection);
    if (!config.ScopeExists(provider.ScopeName))
    {
        DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(provider.ScopeName);
        scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable("TABLENAME", connection));

        config.PopulateFromScopeDescription(scopeDesc);

        config.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
        config.Apply();
    }
}

private static void PrepareClientForProvisioning(SqlSyncProvider provider, SqlConnection sourceConnection)
{
    SqlSyncScopeProvisioning config = new SqlSyncScopeProvisioning((SqlConnection)provider.Connection);
    if (!config.ScopeExists(provider.ScopeName))
    {
        DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(provider.ScopeName, sourceConnection);
        config.PopulateFromScopeDescription(scopeDesc);
        config.Apply();
    }
}

使用 Sync Framework 的缺点:在发布之前将这些先决条件添加到您的应用程序中会很痛苦,如果您只是为自己或您的公司使用应用程序,则没有问题,但是当您想要在线发布它有点困难。我已经有a topic about that

但是,当使用InnoScript 之类的工具时,您可以在安装应用程序的同时轻松安装先决条件。 Here is how.

现在对于ScopeName:重要的是不要使用两次相同的名称,我相信。我有多个表,所以我将它们命名为 scope1,scope2,scope3,scope4。显然 Sync Framework 为您完成了剩下的工作。它还会自动将_tracking 表添加到您的数据库中,这只是用于存储信息以正确同步的元数据。

【讨论】: