关于sqlserver收缩数据库(引起的问题、可以半途停⽌吗)sqlserver⾃动收缩数据库引起⼤量阻塞
最近遇到⼀个数据库设置了⾃动收缩,收缩期间引起⼤量阻塞的问题,记录下看到的⽂章学习
什么是⾃动收缩?
随着数据量的增加数据库的设备⽂件(MDF\LDF)会不断增长,当数据库中的某些数据删除,数据库设备⽂件的⼤⼩并不会随着数据量的减少⽽减少,数据库设备需要占⽤的磁盘空间就没那么⼤了,这时候⾃动收缩就可以释放出磁盘空间,主要直观体现在数据库设备⽂件的⼤⼩上,避免资源的浪费.
在什么条件下会触发?
在开启⾃动收缩选项的情况下,SQL Server定期会检查⽂件使⽤情况。如果空闲空间⼤于25%,SQL Server就会⾃动运⾏⾃动收缩数据库⽂件的动作。
例如:数据迁移删除⼤量数据时,空闲空间⼤于25%时,会触发⾃动收缩功能。
带来的危害(⾃动收缩和⼿动收缩)?
对于⼀个磁盘空间很紧张的系统,这个设置⽆疑是有帮助的。但是从数据库⾃⾝的健康和性能考虑,这个设置并不建议多⽤。这是因为:
1、数据⽂件收缩导致了索引的完全碎⽚化,索引的效率⼤⼤降低,严重影响性能。
2、数据⽂件的收缩同样产⽣了⼤量的I/O操作,耗费⼤量的CPU资源,性能下降。
3、在业务⾼峰期的时候可能会造成⼤量的阻塞。
关于收缩的建议
不到万不得已,千万不要收缩数据库。收缩数据库影响极⼤:
1.收缩数据库对数据库的影响极⼤,产⽣⼤量⽇志和碎⽚,⽽且会锁表。如果你的库当前正在被使⽤,收缩不下去⾮常正常。
2.收缩数据库⼀定要⼿⼯来做的,⽽且是在维护窗⼝期做。
3.尽量使⽤语句来执⾏,可以提⽰错误
4.尽量⼀次不要收缩太多,分⼏次收缩。
收缩的正确姿势
在不得不收缩的时候,参考下⾯的步骤
1.到数据库中最⼤的⼏个表,重建所有索引。⾸先尝试指定Truncate Only收缩⽅式.它只是移除⽂件尾部的空闲空间,并不重新组织已经使⽤的数据页。
DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY);
2 最后才考虑,不带选项的收缩。收缩不要⼀次性全部收缩。可以每次收缩2G左右。不要把空间可⽤空间全部收缩了,可以剩余⼀部分⽐如4G。收缩完后,记得重建索引.
补充:数据库简单吗
还有⼀种办法就是新建⽂件组,使⽤CREATE INDEX ... WITH(DROP_EXISTING = ON)ON语法将所有相关的的表和索引移动到新⽂件组。然后收缩旧的⽂件组。
3.可在进程中的任⼀点停⽌ DBCC SHRINKDATABASE 操作,任何已完成的⼯作都将保留。
4. 不能在备份数据库时收缩数据库
可能需要收缩的场景
1.你删除了⼤量数据,⽽且数据不太可能增长。
2.要移除某个⽂件时,你需要先清空数据⽂件。
总结
那我们处理磁盘空间不⾜的最好的办法是什么呢?最好的办法是在最初规划时,预估好未来⼀年或者⼆年的数据增长。给磁盘划分⾜够的空间。设置好数据库的初始⼤⼩,并且将⾃动增长使⽤固定量增长。
收缩数据库可以半途停⽌吗
收缩数据库可以中途停⽌吗?
数据库太⼤了,有100多個G的可以釋放空閒,想要收縮,現在已經收縮15個⼩時了,還沒完成,请问可以停⽌嗎?对数据库⼜有影响吗?
執⾏語句:
DUMP TRANSACTION  TelODS  WITH  NO_LOG
BACKUP LOG TelODS WITH NO_LOG
DBCC SHRINKDATABASE(N'TelODS' )
------解决⽅案--------------------
可以停⽌,没影响的,下次再收缩,建议100M⼀次来做
------解决⽅案--------------------
微软的sql server⽂档中写的,你可以输⼊ dbcc shrinkdatabase搜索,就有的:
可在进程中的任⼀点停⽌ DBCC SHRINKDATABASE 操作,任何已完成的⼯作都将保留。
------解决⽅案--------------------
如果在确定没有影响正常使⽤的情况下, 100G的可⽤空间,值得等待下去。
收缩停⽌,对应数据库没有特别的影响。损失的,就只之前执⾏所⽤的这15个⼩时时间成本。
说不定再等⼀个⼩时,收缩就完成了。
⽬前为⽌,我碰到最长的等待⼤概在22⼩时左右。不停业务的情况下。
------解决⽅案--------------------
引⽤:
Quote: 引⽤:
Quote: 引⽤:
这是你数据库确实太⼤的缘故,建议继续等待,最好是断开所有数据库连接后进⾏收缩
怎麼斷開數據庫連接??
这个是把数据库切换到单⽤户模式,也就是其他⽤户的连接,都被断开了
use master
go
alter database 数据库
set single_user
在使⽤此语句前,关闭所有调⽤数据库的程序,重启sqlserver
建议已经收缩了的继续等待,
其实在做收缩前做好进⾏测试,mssql 还是有⼀定的风险,特别在删除数据并收缩的时候

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。