删除(合并)SQL服务器数据库的次要数据文件

13

我有一个数据库备份,SQL Server Management Studio称其中有三个文件:一个.mdf文件、一个.ndf文件和一个.ldf文件。这个第二数据文件(即.ndf文件)似乎没有显而易见的原因被创建,所以我想彻底删除它(当然不能丢失数据),最好在从备份还原数据库时进行。

这可行吗?


NDF 的目的是分配文件 IO。如果您的服务器有 NDF,请不要修改模式。为什么 NDF 会困扰您? - Hassan Syed
3
它的创建只是为了克服NTFS卷的碎片化问题,没有其他存在的原因。虽然我同意NDF是好的,但粗心创建的NDF是有害的。 - Anton Gogolev
2个回答

14

好的,找到了一个解决方案。

首先备份数据库。

执行以下命令:

USE database_name;

接着执行以下命令,并将 logical_ndf_file_name 替换为你的NDF文件的逻辑名称(你可以通过“数据库->属性_文件”轻易地找到它):

DBCC SHRINKFILE('logical_ndf_file_name', EMPTYFILE);
ALTER DATABASE database_name REMOVE FILE logical_ndf_file_name;

你的文件里有数据吗?如果有,花了多长时间?数据库是在线的吗? - Hassan Syed
@Hassan NDF 大约为 8 Gb,而 MDF 大约为 60 Gb。总共花了大约 20 分钟。不确定你所说的“实时”是什么意思。我没有将其脱机,但也没有运行任何查询。 - Anton Gogolev
有趣的信息。我所说的“Live”是指生产用途或面向客户。 - Hassan Syed
@Hassan 我怀疑它可用于生产环境。 - Anton Gogolev
2
在这里需要澄清一下,上面代码中的 'ndf_file_name' 是指逻辑文件名,而不是物理文件名。这一点一开始并不明显。 - Ben Barreth

0

我在生产加载期间成功地运行了空的 followed by ndf drop。我认为在同一个事务中运行 drop ndf 是很重要的,以确保数据库不会尝试写入正在删除的文件,但是在执行 empty 后,数据库会将文件标记为不可用,这可以通过之后立即尝试另一个 empty 来证明。


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