AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 97749
Accepted
Charles Clayton
Charles Clayton
Asked: 2015-04-14 14:30:30 +0800 CST2015-04-14 14:30:30 +0800 CST 2015-04-14 14:30:30 +0800 CST

合并复制两个 MDF 数据库文件的脚本?

  • 772

我在电脑和平板电脑上有一个程序。该程序使用 SQL Server Express 与.MDF文件中的本地数据库(两者的信息相同)进行交互。因此,如果我将平板电脑插入 PC,我有两个.MDF要同步的文件。

我希望两个用户都能够更改他们设备上的版本,然后我想获取这两个.MDF文件并运行一个合并它们的脚本。

数据库有一个 GUID 主键,以及DateTime上次更改的时间,所以如果有冲突,我会采用最新版本。

我该怎么做?

或者,如果我以错误的方式解决这个问题,您能否推荐一种替代方法来保持这两台机器的数据库在没有互联网连接的情况下同步?

提前致谢。

sql-server merge-replication
  • 4 4 个回答
  • 1629 Views

4 个回答

  • Voted
  1. Pixelated
    2015-04-15T08:47:24+08:002015-04-15T08:47:24+08:00

    如果没有 Internet 连接,您将看到合并或对等复制。两者都不能轻松实现(谷歌我似乎记得在某处看到过解决方法)你想要如何使用 Express 版。如果您有标准或更好的版本,我个人会选择 Peer-To-Peer,因为它不需要为每个表添加额外的列,并且像合并一样包括冲突解决。请注意,在我看来,复制是一项相当挑剔的技术,需要中级 DBA 技能才能有效地实施和排除故障。另请注意,一旦复制被暗示,事务日志备份或检查点(取决于您的恢复模型)将无法清除任何事务,直到它被分发给其订阅者。根据同步之间的持续时间和命令数量,这将导致您的事务日志增长并可能填满磁盘。显然,如果可用磁盘空间已满,则无法在数据库中写入/更新新事务。

    通过 Internet 连接,我肯定会考虑 Azure 为您提供两个设备都可以写入的单一数据库。

    显然,您还可以通过 powershell、SSIS、C# 脚本获取和合并数据,或者通过 Windows 计划任务(SQL Server 代理不提供快速服务)获得 RedGate 数据比较和启动的试用许可证,并完成以下工作复制将开箱即用。

    附带说明一下,根据您的使用情况,您可能可以获得与企业版相同的开发人员版 SQL Server 许可证。

    编辑 1:点对点至少是 2008r2 和 2012 中的企业唯一功能,与标准中可用的合并不同

    • 1
  2. Tony Hinkle
    2015-04-14T17:22:29+08:002015-04-14T17:22:29+08:00

    因为我比 T-SQL 更了解 Powershell 和 VB,所以我会使用其中一种语言从每个数据库中提取新记录,循环它们,然后将它们插入到另一个数据库中。该脚本将保存一个文件,其中包含来自每个数据库的最后一条记录的时间戳,它将在下次运行时使用该文件来获取比该日期更新的记录。...或存储在数据库中某处同步的最后一行的时间戳或 GUID。

    您的“合并 .mdfs”术语可能会让人们离开这里,因为您不会尝试直接读取文件并合并差异。您只需在每个数据库中查询新记录并将它们插入到另一个数据库中。

    你可以通过其他各种方法来解决这个问题——这只是一种。

    • 0
  3. vonPryz
    2015-04-14T22:49:24+08:002015-04-14T22:49:24+08:00

    看看现有技术:复制。

    根据文档(强调添加):

    复制是一组技术,用于将数据和数据库对象从一个数据库复制和分发到另一个数据库,然后 在数据库之间进行同步以保持一致性。使用复制,您可以将数据分发到不同的位置以及远程或移动用户。

    • 0
  4. Best Answer
    Charles Clayton
    2015-07-30T13:19:01+08:002015-07-30T13:19:01+08:00

    大多数现有工具,如 Microsoft Sync 和 Merge-Replication,最终看起来都太过分了,而且比它们的价值更麻烦。

    这是我附加数据库的 SQL 脚本

    CREATE DATABASE LocalDatabase  
    ON (Filename = 'C:\ProgramData\Clayton\Database.mdf')
       , (Filename = 'C:\ProgramData\Clayton\Database_log.ldf') 
    FOR ATTACH;
    GO
    
    EXEC sp_addlinkedserver @server='Server'
    

    然后同步数据库

    -- update the client from the master 
    MERGE [LocalDatabase].[dbo].[tableName] trgt
    using [Server].[ServerDatabase].[dbo].[tableName] src
    
    ON trgt.id = src.id 
    
    WHEN matched AND trgt.lastmodified <= src.lastmodified THEN 
      -- if the master has a row newer than the client
      -- update the client                       
      UPDATE SET trgt.[allColumns]      = src.[allColumns],
                 trgt.[id]              = src.[id], 
                 trgt.[lastmodified]    = src.[lastmodified] 
    
    -- delete any rows added by a client 
    WHEN NOT matched BY source 
    THEN 
      DELETE 
    
    -- insert any rows added by the master 
    WHEN NOT matched BY target 
    THEN 
      INSERT ( [allColumns], 
               [id], 
               [lastmodified]) 
      VALUES (src. [allColumns], 
              src.[id], 
              src.[lastmodified]); 
    
    
    -- now we update the master from the client
    -- Note:
    -- because the serverDB is a linked server 
    -- we can't use another MERGE statement, otherwise
    -- we get the error: "The target of a MERGE statement 
    -- cannot be a remote table, a remote view, or a view over remote tables."
    
    UPDATE
        serverDB
    
    SET 
        [allColumns]        = [localDB].[allColumns],
        [id]                = [localDB].[id], 
        [lastmodified]      = [localDB].[lastmodified] 
    
    FROM 
         [Server].[ServerDatabase].[dbo].[tableName] serverDB
    
    INNER JOIN
         [LocalDatabase].[dbo].[tableName] localDB
    
    -- update where the id is the same but the client is newer than the master
    
    ON serverDB.id = localDB.id 
           AND localDB.lastmodified >= serverDB.lastmodified
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve