跨两台计算机自动同步SQL数据库

时间:2014-12-20 17:58:10

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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表添加到您的数据库中,这只是存储信息以便正确同步的元数据。