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 / 问题 / 19095
Accepted
Jon of All Trades
Jon of All Trades
Asked: 2012-06-12 14:54:08 +0800 CST2012-06-12 14:54:08 +0800 CST 2012-06-12 14:54:08 +0800 CST

有哪些选项可用于定期在服务器之间复制数据?

  • 772

如果这已经得到回答,我很抱歉。我已经搜索过 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 工作得很好,正如回答的那样)。

这个问题谈论快速复制整个数据库,包括模式。它特别排除了复制。

这个问题讨论了双向同步,建议使用复制。

sql-server-2008 replication
  • 4 4 个回答
  • 3483 Views

4 个回答

  • Voted
  1. Best Answer
    gbn
    2012-06-12T22:58:22+08:002012-06-12T22:58:22+08:00

    我会考虑备份/恢复从 prod 到 dev 的完整备份和差异备份的混合。然后将此恢复的副本与您的实际开发数据库同步

    SQL Server 2008 R2+ 支持标准版中的备份压缩(在 SQL Server 2008 中,它仅是企业版),这使得这更容易。

    原因:

    • 您测试您的备份完整性和恢复能力
    • 如果某些代码猴子 bollixs,您可以轻松重置您的开发数据库
    • 您可以比较“之前”和“之后”DDL、性能等
    • 如果您进行更改,您可以根据需要对恢复的数据库进行快照以回滚

    我以前用过这个,出于这些原因会再次使用它

    我在对尽可能最小的备份的回答中建议了这一点……使用 SQL Server

    • 2
  2. Remus Rusanu
    2012-06-13T01:53:20+08:002012-06-13T01:53:20+08:00

    与迁移的连续集成。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 的迁移?数据是否必须匿名化或对开发环境进行一些其他转换?使其成为特定于开发的部署步骤,当然由签入源代码树的脚本控制。

    • 1
  3. Thomas Stringer
    2012-06-12T15:54:54+08:002012-06-12T15:54:54+08:00

    对于这种类型的需求,我建议使用 SQL Server Integration Services (SSIS)。SSIS 的强大之处在于易于处理错误(如您的问题所要求的那样)、调度它的能力以及 DTSX 包的完美可维护性。您不必担心显式链接服务器或任何停机时间。

    SSIS 很好地处理了关注点的分离。它是一个独立的包,与 SQL Server 代理一起使用时,可以在夜间安排,也可以按需运行。

    • 0
  4. SQLGuyChuck
    2012-06-19T22:49:16+08:002012-06-19T22:49:16+08:00

    快照复制将是唯一可行的复制方式。但它可以像其他版本一样阻止架构更改(事务性、合并/对等)。但是备份和恢复会更好(Remus 的想法看起来很准确),因为在这种情况下,复制将一无所获。

    • 0

相关问题

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

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

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

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • 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
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +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