Sql Server 数据库紧缩实践 [复制链接]
发表于 2026-2-26 02:15:14 | 显示全部楼层 |阅读模式
​记载一下:有一个做了很久的项目,涉及近十几个数据库,数据量不大,业务压力不重,也非分布式摆设。由于操纵频仍且汗青久长,数据库文件越来越大,而云服务器硬盘有限,因此我们须要对数据库举行公道优化。
本次优化是在本地测试的。
一 影响数据库巨细的因素

我们先看一张图,这是此中一个业务库A:

巨细:8301M
可用空间:6373.84M
这阐明 数据文件 .mdf 和 日志日志文件 .ldf 占用了近8G的硬盘空间,且在连续地增大,但这此中却有6G多的空间是没有被利用的。
一样平经常用影响数据库文件巨细的因素有以下几种:

  • 数据量: 数据库中存储的数据量是影响数据库文件巨细的重要因素。数据越多则占用空间越大。
  • 索引: 为了提查询服从而建的索引也是空间占用的重要因素之一。而且若长时间不举行重新构造与天生,索引碎片也会导致索引服从降落。
  • 数据范例: 差别的数据范例占用的空间差别。比方,VARCHAR范例的字段可以根据现实内容长度厘革,而CHAR范例则总是占用固定长度的空间。
  • 临时表和表变量:临时表和表变量也是占用空间的,若临时表在创建后不在利用完毕后drop的话,那么它便会在tempdb中存在一段时间。
tempdb数据库是一个特殊的体系数据库,它用于存储全部会话和事件的临时数据,如临时表、表变量、存储过程的中心效果集以及优化器天生的一些内部临时工作表等。

  • 事件日志日志:事件日志日志记载了全部数据库操纵的具体日志。大量的事件会导致日志文件灵敏增长。
  • 数据库备份备份战略也会影响数据库文件巨细,由于备份操纵大概会触发日志截断,从而影响数据库文件的现实巨细。
若要举行数据优化呢,可以参考1-4举行酌情处理处罚。
二 数据库紧缩

SQL Server数据库紧缩(Shrink Database)是一种数据库维护任务,用于淘汰数据库文件的巨细。
1. 什么环境可以用数据库紧缩呢?


  • 数据删除: 当数据库中删除了大量的数据后,表中会留下许多碎片空间,数据库紧缩可以接纳这些空间。
  • 数据迁移: 如果数据从一个数据库迁移到另一个数据库或表布局发生改变,紧缩数据库可以淘汰因数据迁移而产生的空间浪费。
  • 存储优化: 在某些环境下,如果数据库文件占用的空间宏大于现实数据的巨细,紧缩操纵可以资助优化存储空间的利用。
  • 文件空间管理: 如果须要重新分配或重新构造数据库文件的空间,紧缩操纵可以作为一个步调来实现这一目标。
  • 规复空间: 在数据库规复操纵后,大概会有未利用的空间,紧缩数据库可以资助规复这部门空间。
2. 留意事项

数据库紧缩是一个有争议的操纵,由于它有一些匿伏的缺点:

  • 性能影响: 紧缩数据库大概会导致数据页的重新构造,这大概会影响查询性能,尤其是在紧缩操纵期间,因此发起在脱产环境中实验。
在实验紧缩操纵前后,监控监控数据库的性能和空间利用环境

  • 碎片题目: 频仍的紧缩操纵大概会导致数据和索引碎片化,这会低沉数据库的性能。
  • 日志空间: 紧缩操纵会产生大量的日志记载,这大概会填满事件日志文件。之后可以重新查抄数据库的索引及思量日志文件紧缩工作。
  • 主动紧缩: 不发起开启SQL Server的主动紧缩功能,默认是禁用的。
  • 影响数据规复:数据库日志紧缩自己不会粉碎数据的完备性,但大概会影响在出现故障时规复数据的本领。
在某些环境下,大概更倾向于利用其他方法来管理数据库空间,如重新构造索引或利用数据库压缩功能。因此,在决定是否实验数据库紧缩时,应该细致思量其匿伏的影响,并在须要时寻求专业发起。
3. 实操

环境:Sql Server 2016
操纵步调:选择数据库A ——>【右键:任务】——>【紧缩】——>【数据库】。


  • 为了不影响性能,我未勾选下边的重新构造文件。直接确定即可。

4 紧缩效果

如图所示,我们做一个对比,超预期!
紧缩前(M)紧缩后(M)巨细830198.05巨细6373.8410.16

5 备注

紧缩乐成后,访问数据库是碰到非常:
……偏移量为0x00000001a9a000 的位置实验 读取 期间,操纵体系已经向SQL Server 返回了错误21(装备未停当。)……
办理方案:
重启SqlServer服务。
操纵:选择sql服务器——>【】

三  附:日志文件紧缩

已数据库 DB_NameA为例:

  • 数据库改为简朴模式
  1. USE[master]
  2. GO
  3. ALTER DATABASE [DB_NameA]  SET RECOVERY SIMPLE WITH NO_WAIT
  4. GO
  5. ALTER DATABASE [DB_NameA]  SET RECOVERY SIMPLE   --简单模式
  6. GO
复制代码

  • 数据库改为简朴模式
  1. USE [DB_NameA]  
  2. GO
  3. DBCC SHRINKFILE (N'DB_NameA_log' , 1, TRUNCATEONLY)  --DB_NameA 的日志文件名 .ldf
  4. GO
复制代码

  • 数据库还原为完全模式
  1. USE[master]
  2. GO
  3. ALTER DATABASE [DB_NameA]  SET RECOVERY FULL WITH NO_WAIT
  4. GO
  5. ALTER DATABASE  [DB_NameA] SET RECOVERY FULL  --还原为完全模式
  6. GO
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表