Sql server 减少SQL server中ndf文件的数量

Sql server 减少SQL server中ndf文件的数量,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我有一个SQL Server 2012数据库,主文件组中有一个主文件,一个名为DATA1的默认文件组,有8个ndf文件和一个日志文件 这可以在下面看到: +-------------------+-----------+----------------+------+ | Logical name | File Type | Filegroup | Type | +-------------------+-----------+----------------+------+

我有一个SQL Server 2012数据库,主文件组中有一个主文件,一个名为DATA1的默认文件组,有8个ndf文件和一个日志文件

这可以在下面看到:

+-------------------+-----------+----------------+------+
|   Logical name    | File Type |   Filegroup    | Type |
+-------------------+-----------+----------------+------+
| Database1_Primary | Rows Data | PRIMARY        | MDF  |
| Database1_Data1   | Rows Data | DATA1          | NDF  |
| Database1_Data2   | Rows Data | DATA1          | NDF  |
| Database1_Data3   | Rows Data | DATA1          | NDF  |
| Database1_Data4   | Rows Data | DATA1          | NDF  |
| Database1_Data5   | Rows Data | DATA1          | NDF  |
| Database1_Data6   | Rows Data | DATA1          | NDF  |
| Database1_Data7   | Rows Data | DATA1          | NDF  |
| Database1_Data8   | Rows Data | DATA1          | NDF  |
| Database1_Log     | Log       | Not applicable | LDF  |
+-------------------+-----------+----------------+------+
这个数据库正在移动到另一个服务器,在那里我只希望有4个ndf文件

此外,我想在4个ndf文件之间均匀分布数据

这就是我想要的结果:

+-------------------+-----------+----------------+------+
|   Logical name    | File Type |   Filegroup    | Type |
+-------------------+-----------+----------------+------+
| Database1_Primary | Rows Data | PRIMARY        | MDF  |
| Database1_Data1   | Rows Data | DATA1          | NDF  |
| Database1_Data2   | Rows Data | DATA1          | NDF  |
| Database1_Data3   | Rows Data | DATA1          | NDF  |
| Database1_Data4   | Rows Data | DATA1          | NDF  |
| Database1_Log     | Log       | Not applicable | LDF  |
+-------------------+-----------+----------------+------+
所以我已经备份了数据库,我正在寻找一个T-SQL恢复脚本,它可以将ndf文件的数量减少到4个


谢谢

您可以将
DBCC SHRINKFILE
EMPTYFILE
一起使用。下面是文档的状态

将指定文件中的所有数据迁移到同一文件组中的其他文件。换句话说,EmptyFile将数据从指定文件迁移到同一文件组中的其他文件。Emptyfile确保不会向文件中添加新数据。可以使用ALTER DATABASE语句删除该文件

下面是语法

DBCC SHRINKFILE(LogicalNameOfFileToRemove, EMPTYFILE)
之后,可以使用
Alter语句删除这些文件

Alter database dbname
remove filegroupname
最后,在新服务器中恢复此数据库后,您可以再次添加所需的
ndf
文件

此外,我希望在4个ndf文件之间均匀分布数据

SQL为您完成了这一点。从这个链接

文件组对每个文件组中的所有文件使用比例填充策略。在将数据写入文件组时,SQL Server数据库引擎会将与文件中的可用空间成比例的量写入文件组中的每个文件,而不是将所有数据写入第一个文件,直到文件满为止。然后写入下一个文件。例如,如果文件f1有100 MB可用空间,文件f2有200 MB可用空间,则从文件f1分配一个扩展数据块,从文件f2分配两个扩展数据块,依此类推。通过这种方式,两个文件几乎同时变满,并且实现了简单的条带化


没有这样的生物<代码>还原
无法动态更改文件组中的文件数。(您可以选择不在逐段还原操作中还原某些文件,但情况有所不同。)您需要还原所有现有文件,然后迁移数据。