减少SQL服务器中的ndf文件数量

时间:2017-11-22 12:32:27

标签: sql-server tsql sql-server-2012

我有一个SQL Server 2012数据库,PRIMARY文件组中有1个主文件,1个默认文件组名为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 RESTORE脚本,它可以将ndf文件的数量减少到4个?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将select t.* from (select t.*, lag(t.val) over (partition by t.id order by t.ts) as prev_val from t ) t where prev_val not in (val, val + 1); -- NULLs are filtered out too DBCC SHRINKFILE一起使用。以下是文档说明的内容

  

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

以下是语法

EMPTYFILE

之后,可以使用DBCC SHRINKFILE(LogicalNameOfFileToRemove, EMPTYFILE)

删除这些文件
Alter statement

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

  

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

SQL会为您做到这一点..来自此链接File and Filegroup Fill Strategy

  

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