使用收缩 SQL 服务器的最佳做法是什么?
What is best practice to use shrink SQL Server?
我读了很多书,不推荐收缩数据库,因为它会导致碎片化,从而导致性能下降。
参考:
https://www.brentozar.com/archive/2017/12/whats-bad-shrinking-databases-dbcc-shrinkdatabase/
https://straightpathsql.com/archives/2009/01/dont-touch-that-shrink-button/
但是,好像是数据文件的情况,如果日志满了,收缩日志应该没有问题吧?
如果数据文件很大需要很多 space,我确实需要更多 space 来插入和更新一些新数据,缩小显然会减少驱动器上文件的大小,我假设我可以使用免费 space 来插入新数据。但如果不建议收缩,我该如何解决?什么时候使用 shrink
最好
if the data file is huge that takes a lot of space, I do need more
space to insert and update some new data, shrinking apparently reduce
the size of the file on the drive, which I assumed that I could use
the free space to insert new data.
如果你的数据文件占用了很多space并不意味着这个space是空的。
您应该使用sp_spaceused
来确定数据文件中是否有未使用的space。
如果有未使用的space,则已经使用"to insert and update some new data",如果没有 做 shrink
什么都不会改变:shrink
不会删除您的数据,它所做的只是将数据移动到文件的开头以使 space 最后还给 OS
.
当您有一个 2Tb 的数据文件并且删除了 1Tb 的数据并且您不打算在未来 10 年内插入另一个 Tb 的数据时,收缩数据文件会很有用。
您可以将 data file
想象成一个 1m x 1m x 1m 的盒子。如果你只有一半的盒子装满了玩具,即使你不用shrink
你也可以把其他的玩具放进这个盒子里(makeinsert
/update
)。 shrink
所做的是,它将所有玩具聚集在一个角落,然后切割您的盒子以使其成为 50cm x 50cm x 50cm。这样你的房间 (OS) 现在有更多的空闲空间 space 因为你的玩具箱只占用了缩小前 space 的一半。
...如果您的盒子已经满了,即使您尝试 shrink
.
也无法添加更多玩具
if the log is full, shrinking log should not be a problem right?
Shrinkig log
是另一个进程,log file
里面什么都不能动,从这个意义上说当然shrink
不会像data file
那样造成太大的伤害:它不需要服务器资源,它不会导致任何碎片等。
但成功与否取决于你"log is full".
的原因
如果您的日志因 full model
而满,缩小日志文件不会改变任何内容:保留日志是为了让您有可能 log backup chain
(或使 mirroring
,或 log shipping
,等等)。
如果您的数据库 recovery model
是 simple
,并且长时间打开的 transaction
出现了一些问题,或者有一个巨大的 data loading
(也许有完整的日志记录,例如没有 tablock
的 insert into
)并且你的 log file
变得比 data file
大,你发现并解决了问题,你不需要这么大log file
,是的,你可以把它缩小到一个合理的大小,而且没有害处。
我读了很多书,不推荐收缩数据库,因为它会导致碎片化,从而导致性能下降。
参考:
https://www.brentozar.com/archive/2017/12/whats-bad-shrinking-databases-dbcc-shrinkdatabase/
https://straightpathsql.com/archives/2009/01/dont-touch-that-shrink-button/
但是,好像是数据文件的情况,如果日志满了,收缩日志应该没有问题吧?
如果数据文件很大需要很多 space,我确实需要更多 space 来插入和更新一些新数据,缩小显然会减少驱动器上文件的大小,我假设我可以使用免费 space 来插入新数据。但如果不建议收缩,我该如何解决?什么时候使用 shrink
最好if the data file is huge that takes a lot of space, I do need more space to insert and update some new data, shrinking apparently reduce the size of the file on the drive, which I assumed that I could use the free space to insert new data.
如果你的数据文件占用了很多space并不意味着这个space是空的。
您应该使用sp_spaceused
来确定数据文件中是否有未使用的space。
如果有未使用的space,则已经使用"to insert and update some new data",如果没有 做 shrink
什么都不会改变:shrink
不会删除您的数据,它所做的只是将数据移动到文件的开头以使 space 最后还给 OS
.
当您有一个 2Tb 的数据文件并且删除了 1Tb 的数据并且您不打算在未来 10 年内插入另一个 Tb 的数据时,收缩数据文件会很有用。
您可以将 data file
想象成一个 1m x 1m x 1m 的盒子。如果你只有一半的盒子装满了玩具,即使你不用shrink
你也可以把其他的玩具放进这个盒子里(makeinsert
/update
)。 shrink
所做的是,它将所有玩具聚集在一个角落,然后切割您的盒子以使其成为 50cm x 50cm x 50cm。这样你的房间 (OS) 现在有更多的空闲空间 space 因为你的玩具箱只占用了缩小前 space 的一半。
...如果您的盒子已经满了,即使您尝试 shrink
.
if the log is full, shrinking log should not be a problem right?
Shrinkig log
是另一个进程,log file
里面什么都不能动,从这个意义上说当然shrink
不会像data file
那样造成太大的伤害:它不需要服务器资源,它不会导致任何碎片等。
但成功与否取决于你"log is full".
如果您的日志因 full model
而满,缩小日志文件不会改变任何内容:保留日志是为了让您有可能 log backup chain
(或使 mirroring
,或 log shipping
,等等)。
如果您的数据库 recovery model
是 simple
,并且长时间打开的 transaction
出现了一些问题,或者有一个巨大的 data loading
(也许有完整的日志记录,例如没有 tablock
的 insert into
)并且你的 log file
变得比 data file
大,你发现并解决了问题,你不需要这么大log file
,是的,你可以把它缩小到一个合理的大小,而且没有害处。