【问题标题】:Copy many large tables to another database将许多大表复制到另一个数据库
【发布时间】:2022-01-03 22:42:16
【问题描述】:

我必须做什么

我需要从一个复制很多表(超过 500 个)的数据 生产数据库到预生产数据库,以更好地测试我们的 部署前的系统。

很多桌子都很小,但其中一些非常 大,最大的当前有大约 5500 万行,但还在增长 有点快。

同事的建议

一位同事正在测试环境中做类似的事情,并且 开发了一个脚本来做到这一点,它基本上做到了:

TRUNCATE [TableName1]

SET IDENTITY_INSERT [TableName1] ON

INSERT INTO [TableName1] (Col1, Col2,...) SELECT (Col1, Col2,...) FROM [TableName2]

SET IDENTITY_INSERT [TableName1] OFF

并为他正在运行测试的大约 30 个表执行此操作。我试过了 从这种方法开始,但是当我使用第一个表进行测试时( 5500 万行一),这太耗时了。

我同事的案例和我的有什么不同

我发现我的同事所做的和我必须做的之间有 2 个不同 做:

  • 他使用的最大的桌子远小于我们最大的桌子。
  • 他从中复制和复制到的所有表都在同一台服务器上,但我必须将表从一台服务器复制到另一台服务器。

我的尝试

我第一次尝试使用链接服务器,它似乎工作,因为我看到 没有错误,但这需要很长时间,我的老板希望这项任务能够完成 每两周晚上进行一次,所以它是不可行的 这么久。

将 500 多个大表复制到另一个数据库最有效的方法是什么,希望不到两个小时?

【问题讨论】:

  • 为什么他在插入之前截断?这样你将复制表的结构而不是数据
  • 他在[Table1]上截断,这是我的预生产,插入从[Table2]中获取数据,没有被截断。
  • 到此,鉴于复杂性,您可以开始使用 SSIS 构建适当的 ETL 流程

标签: sql-server


【解决方案1】:

数据库备份和恢复是实现您所寻找的最安全的方法。

您可以使用压缩方法和条带(多个文件)来缩小备份的大小,然后将备份文件复制到您的第二台服务器并恢复它。

您也可以使用批量复制 (BCP) 进行复制,但这将再次在表级别而不是在数据库级别。

还请注意一个重要点 - 如果您对这些表有任何外键约束,则需要以正确的顺序复制它们,否则会失败。

为避免所有这些问题,备份和恢复是最可靠、最安全、最快的方法。

数据库备份包含数据库内的所有索引、约束和每个对象,它将成为一个称为数据库备份的捆绑包的一部分,您可以在第二台服务器上恢复它。

【讨论】:

  • 这不会对索引和约束造成任何问题(或花费太长时间)吗?
  • 不,数据库中的所有索引、约束和所有对象都将成为一个称为数据库备份的捆绑包的一部分,您可以在第二台服务器上恢复它。关于尺寸,我建议使用压缩方法和条纹。我将编辑我的答案。
【解决方案2】:

一个选项可以是 SQL Server 导入和导出向导。

  1. 右键单击数据库 > 任务 > 导出数据...
  2. 在选择数据源集SQL Server Native Client 11.0
  3. 对选择目的地执行相同操作
  4. 选择从一个或多个表或视图复制数据

...并执行

【讨论】:

  • 一切都好,除非你有外键约束。
  • 好点。任务 > 导出数据层应用程序... 怎么样?这也用于迁移到 Azure 并保持约束。否则事务复制可能是一种选择?
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2012-05-15
相关资源
最近更新 更多