将 SQL Server 数据库迁移到多个文件

3
我有一个正在生产中使用的SQL Server 2008数据库,我们要将其移动到新服务器上。当前的数据库有一个单独的 ~400GB 的 .MDF 文件。新服务器将运行 SQL Server 2012,并且我们正在运行镜像 Intel 910 SSD。这些驱动器将向我们提供 4x 200GB 分区。
为了使此工作正常,我们需要使用 DBCC SHRINKFILE with EMPTYFILE 将单个 .MDF 拆分成 4 个更小的文件。我们已经在测试中完成了这项工作,但仍需要大约 3.5 小时的时间,这太长了。现有的数据库是 OLTP,并且全年无休,我知道在此过程中会发生阻塞,因此我们不能首先在生产环境中执行此操作。
我的问题是,是否有一种方法可以将数据库备份并还原到临时位置的新服务器上,创建新文件,将临时 .MDF 清空到新位置,然后再应用事务日志?这样,我们就可以在当前旧生产环境正在运行时移动数据,然后进行短暂的关闭,应用日志,并启动新的数据库?
或者是否有其他选项可以从具有一个文件的服务器A和具有4个不同驱动器上的服务器B中进行迁移而最小化停机时间?

1
最好在DBA.Stackexchange.com上询问,那里有专家。 - Preet Sangha
谢谢,我把它添加到那里了,我没有意识到有一个特定于SQL的版本! - Lauren
1个回答

1
如果您有足够的磁盘空间,可以执行以下操作:
  • 在新服务器上恢复数据库
  • 创建一个新的文件组
  • 使用 DROP_EXISTING=ON(并指定新文件组)在新文件组上创建所有索引
  • 删除旧文件组

这对于大对象数据不起作用,您需要将其手动移动到新表中。

语法类似于:

CREATE CLUSTERED INDEX [index]  
ON [schema].[table]([columns)
WITH (DROP_EXISTING = ON, ONLINE = ON) 
ON [filegroup]

在创建新索引时,可能会使旧索引保持在线状态。尽管如此,这将导致 tempdb 使用更多的空间。


他不能在新的文件组上删除和重新创建聚集索引吗?我经常这样移动表。 - Preet Sangha
当您使用 DROP_EXISTING 时,就会发生这种情况。它会删除索引,然后在您指定的文件组上重新构建它。 - JodyT
空间不是临时存储的问题。我会在新服务器上试验一下,看看需要多长时间。我们的索引目前有点混乱,这是我另一个任务,所以我感觉这个过程会比缩小速度慢,但我会研究一下。干杯! - Lauren
使用 DROP_EXISTING 选项比常规重建索引更有效。常规重建会导致 NONCLUSTERED 索引被重建两次,而使用此选项只会重建一次。 - JodyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接