日度归档:2018年8月3日

mssql sqlserver 收缩数据库文件的方法分享


摘要:
下文讲述数据库文件收缩方法,
实验环境:sqlserver 2008 R2

数据库使用的数据文件
包括数据文件(mdf ndf )和日志文件ldf。
数据文件会自动增长,并不会释放空闲空间,如果数据文件很大,我们需要使用相关的命令收缩数据库文件。

一.收缩数据文件命令

收缩数据文件,需使用命令(DBCC SHRINKFILE),
此命令可将数据文件中空闲文件移动至末尾,并移除末尾的空间文件,收缩文件不会使数据丢失。
—————————————————–
收缩数据文件命令的语法:
DBCC SHRINKFILE
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH NO_INFOMSGS ]
参数说明:
file_name:要收缩的文件的逻辑名称。
file_id:要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_IDEX 系统函数,或查询当前数据库中的 sys.database_files 目录视图。
target_size :单位是MB,收缩操作的目标是把文件收缩到target_size指定的大小。收缩操作是把文件末尾的区向文件开头移动,这意味着,文件末尾的已使用的区会被移 动到文件的前面,先重新分配可用的硬盘空间,在移动数据之后,释放数据原来占用的空间。
EMPTYFILE:清空当前文件,把数据从当前文件迁移到同一个文件组中的他文件上,同时禁止数据存储到空文件中,被清空的文件被移除。
NOTRUNCATE:将空闲页移动至数据文件末尾,不改变数据文件大小。
TRUNCATEONLY:移除数据文件末尾空闲页

二.收缩数据库文件举例说明

1.将数据文件收缩到指定大小

 ---将数据库test中的数据文件testData数据文件收缩至10MB
USE test;
GO
DBCC SHRINKFILE (testData,10); 
GO


----移除数据库文件末尾空闲页
USE AdventureWorks;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY); ---移除数据库文件末尾空闲页

--删除文件
USE AdventureWorks;
GO 
ALTER DATABASE AdventureWorks 
ADD FILE (
    NAME = testData,
    FILENAME = 'C:\t2test.ndf',
    SIZE = 5MB
    );
GO
-- Empty the data file.
DBCC SHRINKFILE(testData, EMPTYFILE);
GO
--从数据库中移除文件
ALTER DATABASE AdventureWorks
REMOVE FILE testData;
GO


四.数据库文件收缩的危害

由于数据库文件收缩会遍历数据库文件所有页,及涉及大量的磁盘操作和计算操作;
由于数据页移动,会产生大量的磁盘碎片,
非必需操作时,不要轻易的收缩数据库文件。

mssql数据库收缩NOTRUNCATE同TRUNCATEONLY区别


摘要:
下文讲述数据库收缩中的可用选项:NOTRUNCATE,TRUNCATEONLY的区别及注意事项,如下所示:
实验环境:sqlserver 2008 R2



NOTRUNCATE

数据库收缩命令中,如果使用NOTRUNCATE时,代表sqlserver从最后页移动到前页,找到页中空闲的未分配空间,数据文件大小不收缩,但是将数据中未分配空间放入数据文件的尾部。

TRUNCATEONLY

使用收缩命令时,使用TRUNCATEONLY选项,
SQL Server从末尾到开始,只要在文件末尾有空的可用空间,就会把数据文件清理掉。
使用此选项SQL Server在数据文件里页不会进行移动。



数据库文件正确的收缩步骤:

1.使用notruncate 扫描所有空闲页,将其移动到数据库文件末尾
2.使用TRUNCATEONLY 进行收缩,移除末尾的空闲部分

注意事项:
使用TRUNCATEONLY对数据文件收缩将开销小,更安全,不会产生索引碎片;
使用notruncate,sqlserver 会移动数据所存储的页,会带来严重的索引碎片。