拆分大型 SQL Server MDF 文件

Gar*_*ett 5 sql-server ssis datafile

我有一个大型(1.2 TB)SQL Server 数据库,需要将其迁移到新服务器。大部分数据库位于一个 1.25 TB 的数据文件中,还有一小部分位于更易于管理的 550 GB 文件(实际上是空的)上。

现在,棘手的一点是:我要迁移到的服务器只有 3 700 GB 的卷,这意味着我需要以某种方式将这个巨人分解成三个相等的块。我发现的大多数建议涉及创建 3 个目标文件并在我的主文件上运行 DBCC SHRINKFILE EMPTYFILE 以将其清空到目标中,但是对于这么大的数据库,这需要很长时间。

有没有推荐的方法来拆分这么大的数据库?我正在考虑使用 Sql Server 集成服务数据导出功能将数据转储到具有正确文件结构的克隆数据库中,但我很好奇是否有更好的方法。

Kin*_*hah 4

DBCC SHRINKFILE——是单线程的\xe2\x80\x93,这将有助于较长的运行时间。

\n

此外,由于数据库大小巨大 (1 TB),Sql Server 集成服务数据导出将会变慢!

\n

相反,您应该在数据库中查找 BCP OUT(二进制格式)和 BULK INSERT。

\n
    \n
  • BCP 可以从文本文件读取 SQL Server 本机格式。这是一个非常快的选项,需要对文本文件输入进行最少的解析。
  • \n
  • BULK INSERT 命令是将数据从文本文件导入 SQL Server 的进程内方法。因为它与 Sqlservr.exe 一起运行,所以它是一种将数据文件加载到 SQL Server 的非常快速的方法。
  • \n
  • 此外,启用跟踪标志 610 以最低限度记录索引表中的插入以及 BATCHSIZE 和 ROWS_PER_BATCH 参数。
  • \n
  • 您甚至可以禁用锁升级,这在 sql server 2005 上通常会在分配 5000 个锁时发生。在 sql server 2005 上可以通过将批量大小设置为低于此值的数字或启用跟踪标志 1211(以完全禁用锁升级)来禁用此功能。在 sql server 2008 中,您可以使用alter table <table_name> (LOCK_ESCLATION = DISABLE)
  • \n
  • BCP 有一个-a开关允许指定数据包大小,或者如果使用 SSIS,则可以在连接管理器的属性中完成 --> PacketSize = 32767
  • \n
  • 为了避免 PFS 争用,请考虑使用-E启动参数。
  • \n
\n

同样在硬件级别,您可以查看

\n
    \n
  • 使用快速 NIC 和交换机。
  • \n
  • 拥有适用于您的 NIC 的最新认证驱动程序。
  • \n
  • 启用全双工。
  • \n
  • 启用对巨型帧的支持。
  • \n
  • 使用 TCP 烟囱卸载。
  • \n
  • 使用接收端缩放 (RSS)。
  • \n
\n

检查我在此处提供的 BCP 和 BULK INSERT 脚本

\n

注意:您的硬件(包括磁盘分区、布局、CPU 数量、NUMA 配置等)也将对加载数据时的性能发挥重要作用。

\n

优秀阅读:

\n\n