如果这已经得到回答,我很抱歉。我已经搜索过 SO,当然也搜索过 DBA,并且很惊讶地发现没有接近的匹配项。具体来说,我正在寻找一种能够在架构差异中幸存下来的解决方案。
我终于得到了一个开发服务器,可以用来映射生产数据仓库服务器。我将在这里测试架构和存储过程更改,最终将这些更改发布到产品服务器。为此,我需要合理的最新数据,但不需要实时更新。我的计划是将最终状态数据从主服务器复制到开发服务器,作为隔夜 ETL 的最后一步。实现这一目标的最佳方法是什么?
参数
所有自动复制都将从 prod 到 dev。从 dev 到 prod 的任何复制都将手动进行,并且通常只是 DDL。
因为开发服务器的架构预计会独立于生产服务器发生变化,所以我不希望在目标架构不同时复制过程失败(当然,如果特定的表无法保持同步,那也没关系) . 否则我只会DROP DATABASE
恢复昨晚的备份。
保持模式、SP、视图和 UDF 同步是不必要的,甚至是不可取的。只有当我专门更改它们时,它们才应该更改。
大多数表中的记录都可以追溯更改,因此增量更新可能不切实际。
最关键的表的数据量为 14 GB,加上大约 200 GB 的不太重要的数据,可以每周更新一次。
我的目标是在两个小时内完成这个过程。服务器位于同一地点,并且应该具有高吞吐量。复制 ( INSERT INTO..SELECT * FROM ProdServer..
) 一个包含 600 MB 数据和 300 个索引的表需要 7.5 分钟;不是很好。令人担忧的是,当我取消另一个具有 11 GB 数据和 8 GB 索引的表时,它并没有在 130 分钟内完成。我将在没有索引的情况下再次测试它。
如果可以保持简短(不超过 30 分钟)使 prod 数据库脱机是可以接受的。如有必要,开发数据库可以离线数小时。
如果我可以暂时排除一个特定的表,在测试时让它保持静态几天,那将是有价值的。
选项
1:复制
我可以在 ETL 结束后创建每日快照,并将其发布到开发服务器。我以前没有使用过复制,但这似乎是它的意思。是时候让我学习这项技术的新方面了吗?
2:批量复制和批量插入
我可以编写一个脚本,它遍历 prod 数据库中的每个表并将内容吐出到一个唯一命名的文件中。在开发方面,我将遍历这些文件和TRUNCATE
/BULK INSERT
进入目标表,并TRY..CATCH
在架构发生更改时使用一个块。我不确定这是否可以接受,但实现起来相当简单。
3:从链接服务器插入
我可以为每个表运行一个TRUNCATE
/ ,可能是从开发端拉的。INSERT..SELECT
这将很简单,并且应该很快,尤其是在删除并重新创建索引的情况下。为了应对模式变化,可以识别每对表的字段列表的交集,并且只尝试复制这些字段;如果许多字段可以为空,这将有所帮助。
还有其他选择吗?有没有更简单的方法可以让我忽略?在从事类似项目时,您是否遇到过任何问题?
这个问题描述了导出方面,但所需的输出是 CSV,所以选项是有限的(BCP 工作得很好,正如回答的那样)。
这个问题谈论快速复制整个数据库,包括模式。它特别排除了复制。
这个问题讨论了双向同步,建议使用复制。
我会考虑备份/恢复从 prod 到 dev 的完整备份和差异备份的混合。然后将此恢复的副本与您的实际开发数据库同步
SQL Server 2008 R2+ 支持标准版中的备份压缩(在 SQL Server 2008 中,它仅是企业版),这使得这更容易。
原因:
我以前用过这个,出于这些原因会再次使用它
我在对尽可能最小的备份的回答中建议了这一点……使用 SQL Server
与迁移的连续集成。V. Next 的部署意味着运行 V. Prev 到 v. Next 的升级脚本。脚本是源代码,已签入。永远不要将数据库二进制文件(MDF、LDF)视为真正的模式。将源 (.sql) 视为架构,始终对 .sql 文件进行操作,测试 .sql 文件直到您对升级有信心,然后通过运行 .sql 文件部署升级。
基于差异的部署充满了问题,因为您受制于差异工具(有些比其他更好,我个人永远不会相信我在其中任何一个上的实时部署)。基于副本的部署甚至不值得一提。
没有经过此过程的肝脏服务器不会发生任何变化。曾经。
将 prod 服务器副本复制到 dev 怎么样?除了通过将数据暴露给未经授权的眼睛来破坏数据之外,您为什么需要这样做?使用相同的过程、连续集成和迁移部署测试/开发服务器。
在某些情况下,拥有 prod 的 test 副本或 prod 的 dev 副本是可以接受的。使其成为连续集成构建 drop 的一部分:nightly drop 从 prod 备份开始,运行从 v.prod 到 v.dev 的迁移,结果是 prod 数据库的 dev 变体,新删除。顺便说一句,您是否注意到下降也只是测试了从 v. prod 到 v. dev 的迁移?数据是否必须匿名化或对开发环境进行一些其他转换?使其成为特定于开发的部署步骤,当然由签入源代码树的脚本控制。
对于这种类型的需求,我建议使用 SQL Server Integration Services (SSIS)。SSIS 的强大之处在于易于处理错误(如您的问题所要求的那样)、调度它的能力以及 DTSX 包的完美可维护性。您不必担心显式链接服务器或任何停机时间。
SSIS 很好地处理了关注点的分离。它是一个独立的包,与 SQL Server 代理一起使用时,可以在夜间安排,也可以按需运行。
快照复制将是唯一可行的复制方式。但它可以像其他版本一样阻止架构更改(事务性、合并/对等)。但是备份和恢复会更好(Remus 的想法看起来很准确),因为在这种情况下,复制将一无所获。