文件自动增长和自动收缩sql server

1.4  文件自动增长和自动收缩

SQL Server允许用户设置数据库初始值、最大值,可以自动增长或者自动收缩。通过这些设置,可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server把硬盘空间耗尽之类的事情发生。一般来讲,如果数据库不是很繁忙,默认的设置(开启自动增长)能够满足大部分的需求。但是数据文件和日志文件增长本身是一件耗费系统资源和影响性能的工作。所以如果完全依赖SQL Server自动完成,可能会导致系统性能不够稳定。一个管理得比较精细的系统,应该预先考虑到可能的空间使用需求,提前规划并引导数据的流向。尽量避免空间用尽而使得SQL Server不得不自动增长的现象发生。同时也要确保每一次自动增长都能够在可接受的时间内完成,及时满足客户端应用的需求。

那么怎么才能达到这样的目的呢?在谈论最佳配置之前,首先要讨论一下SQL Server数据文件和日志文件空间申请的一些特点。还是以下面这个数据库(如图1-31所示)为例。它有3个数据文件(假设它们属于同一个文件组)和两个日志文件(见表1-7):

表1-7  插入数据前的文件大小

假设现在有个客户端要插入40 MB的数据,20 MB的日志记录,SQL Server会怎样往这些文件里写呢?SQL Server对于数据和日志有不同的处理方法。

数据文件

SQL Server会按照同一个文件组里面的所有文件现有空闲空间的大小,按这个比例把新的数据分布到所有有空间的数据文件里。如果某个文件已经写满了,SQL Server就不再继续往这个文件里写,而是写到其他有空间的文件里面。

在上面的例子里,因为3个文件空闲空间是200:100:100,40 MB的数据就按照20 MB:10 MB:10 MB的比例写入了这3个文件。

 
图1-31  范例数据库的数据文件和日志文件

 

日志文件

SQL Server对于日志记录是按照严格的顺序写入的。所以虽然这里有两个日志文件,SQL Server还是在一个时间点只写其中的一个。只有这个文件写满了,SQL Server才会写入另外一个。

在我们的范例数据库里,20 MB的日志记录都会写入MyDB_log1。

有时候我们会加入多个数据库文件,并把它们放在不同的硬盘上,以达到分散I/O负载的目的。从上面的处理方式我们可以看到,如果想要达到这个目的,对于数据文件,就必须保证同一个文件组里的所有数据文件都有基本一样大小的空闲空间。(不是这些文件一样大就可以的。)如果某个硬盘上的数据文件已经被写满了,SQL Server就不会再往这个硬盘上写了。如果空闲空间相对比较少,SQL Server写的数目也会相对减少。

对于日志文件,由于SQL Server在同一个时间只写一个文件,所以加入多个日志文件对性能基本不会有什么帮助。

如果文件全部都写满了,SQL Server会怎么处理呢?在这里数据文件和日志文件也会稍有不同。对于数据文件,SQL Server会选取其中一个文件(可能是任意一个)做自动增长,而不是让每一个数据文件都做自动增长。所有后面的数据都写入这个做了自动增长的文件里,直到这个文件再次写满,SQL Server要做下一次自动增长为止。换句话说,依靠自动增长,只能看到一个文件增长,很难享受到I/O负载平衡的效果。

对于日志文件,SQL Server自动增长当前的日志文件,以保证日志记录的连续性。

当某个操作触发了文件自动增长时,SQL Server会让那个操作等待。直到文件自动增长结束了,原先的那个操作才能继续进行。如果自增长用了很长时间,原先的操作会等不及就超时取消了(一般默认的阈值是15秒),不但这个操作会回滚,文件自动增长也会被取消。也就是说,这一次文件没有得到任何增大。最坏的情况是,在一个时间点,有很多操作需要申请新的空间,可是谁都没能够等文件自动增长完就超时。这时体现在终端用户的感觉,就是任何修改操作都不能被提交,全部超时。直到有一个连接能够等足够久,让SQL Server把这个自动增长做完。做完以后,其他本来超时的操作又忽然都能恢复正常。

为什么一个自动增长可能会花比较长的时间呢?这基本上都是由于每次需要增长的空间太大造成的。数据文件是按照8 KB为单位存储的。所以做数据文件自增长的时候,SQL Server也要对这些新增加的部分进行格式化。如果一次要增长很大的空间,比如,上GB或者几十GB,这个格式化的过程就会很耗时。SQL Server 2005以后的版本采用了延迟写技术。只要增长的新空间已经分配好,这次自动增长就算大功告成。SQL Server会用一个后台的线程把剩余的格式化做完。这样就大大缩短了一次自增长的时间。前端不再容易遇到超时失败。

还有一种极端,就是每次自动增长值太小。SQL Server要做好几次自增长才能满足操作需求。同样的大小,一次一步到位花的时间比分好几次增长要少许多。所以自动增长值也不能太小。

总之,设置数据库自增长要注意以下几点。

(1)要设置成按固定大小增长,而不能按比例。这样就能避免一次增长太多或者太少所带来的不必要的麻烦。建议对比较小的数据库,设置一次增长50 MB到100 MB。对大的数据库,设置一次增长100 MB到200 MB。

(2)要定期监测各个数据文件的使用情况,尽量保证每个文件剩余的空间一样大,或者是期望的比例。

(3)设置文件最大值,以免SQL Server文件自增长用尽磁盘空间,影响操作系统。

(4)发生自增长后,要及时检查新的数据文件空间分配情况。避免SQL Server总是往个别文件写数据。

除了自动增长,数据库还有一个自动收缩的功能。如果设定了这个功能,SQL Server每隔半个小时就会检查文件使用情况。如果空闲空间大于25%,SQL Server就会自动运行DBCC SHRINKFILE的动作。所以这个功能能够防止数据库申请过多的空间而不使用。对一个硬盘空间很紧张的系统,这个设置无疑是有帮助的。但是从数据库自身的健康和性能考虑,这个设置并不建议多用。这是因为:

(1)SQL Server只有在空间用尽的情况下才会做自动增长。如果没有找出自增长的原因,从而从根本上避免空间用尽,虽然能够暂时用DBCC SHRINKFILE功能收缩文件大小,但是下次数据库还是有可能长大。收缩数据库只是一个治标不治本的方法。

(2)数据文件收缩会给文件带来更多的碎片。

(3)不管是数据库收缩,还是增长,对SQL Server来讲都是件浪费资源的事情。在负载比较重的系统里,对性能的影响尤其大。它们是应尽量避免而不是鼓励的操作。

因此,对于一个比较繁忙的数据库,推荐的设置是开启数据库自动增长选项,以防数据库空间用尽导致应用程序失败,但是要严格避免自动增长的发生。同时,尽量不要使用自动收缩功能。

 

 

USE master;
GO
CREATE DATABASE Sales
ON
( NAME
= Sales_dat,
    FILENAME
= 'C:/Program Files/Microsoft SQL Server/MSSQL10_50.MSSQLSERVER/MSSQL/DATA/saledat.mdf',
    SIZE
= 10,
    MAXSIZE
= 50,
    FILEGROWTH
= 5 )
LOG ON
( NAME
= Sales_log,
    FILENAME
= 'C:/Program Files/Microsoft SQL Server/MSSQL10_50.MSSQLSERVER/MSSQL/DATA/salelog.ldf',
    SIZE
= 5MB,
    MAXSIZE
= 25MB,
    FILEGROWTH
= 5MB ) ;
GO


size 就是初始大小,maxsize 是最大大小,filegrouth 是增量(可能是大小,可能是百分比)
当文件大小增长到一定值就会 按增量 增长。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLServer安全及性能优化 修补漏洞 安装程序补丁修补漏洞 随时关注微软官方网站补丁升级 关闭不必要的端口 关闭联必要的服务 数据库引擎 SQL Server Analysis Services SQL Server Reporting Services SQL Server Integration Services SQL Server 代理 SQL Full-text Filter Daemon launcher SQL Server Browser 同时开启所有服务系统性能会变得很差,根据需要手动启动或者禁用某个服务 DTC: Distributed Transaction Coordinator(分布式事务处理协调器),用于协调多个数据库、消息队列、文件系统等等资源管理器的事务,由于内部开发中并不使用这个功能,远程数据库服务器上也并不经常使用,因此建议关闭这个服务 禁用不使用的协议 Shared Memory 默认为已启用状态,这个协议只能用于本地连接,不能用于远程连接,一般用于其它协议出问题的时候管理作诊断使用 TCP/IP 禁用不需要使用的协议,减少网络攻击对象 减少监听的网卡和IP地址 改变监听端口号 安全地设置账户 Windows身份验证[微软推荐的方式] 优势: 1.访问SqlServer时速度更快,不用输入用户名和密码 2.可以利用Windows系统的自身工具和安全策略管理账户 3.安全确认和口令加密、审核、口令失效、最小口令长度和账号锁定 SqlServer身份验证 1.将sa账户名更改为其它账户名比如nocial,防止黑客利用sa进攻击 2.删除不使用的账户 3.对已有账户设置安全密码[强制密码规则] 4.限制登录->远程登录、匿名登录 5.限制用户角色和权限,一般将权限设置到最低。设置角色的时候不要为public角色授予任何权限,并且从sysadmin这个角色中删除windows的administrators组,提高系统安全性。 删除不必要的数据库对象 删除危险的存储过程 xp_cmdshell:执操作系统命令,这是一个系统后门[可以移动文件位置、创建用户、提升用户权限],建议不需要则删除掉。 ole自动存储过程 任务管理存储过程 强化文件和目录安全 数据库最终以文件的形式存储文件系统中 使用NTFS设置权限 限制共享【不能设置为完全控制】 及时审核日志 sqlserver的审核机制可以帮助跟踪并且阻止系统中没有授权的用户他的为。比如没有授权的用户登录系统会阻止这次登录,并且把这次操作给记录下来。审核机制既能跟踪失败记录也能跟踪成功记录。所有的数据库平台均在不同程度上提供了审查功能。 跟踪用户为 保护数据库 数据库性能优化 数据库的性能优化主要有两个方面:减少查询比较次数、减少资源的征用。 使用工具Sql Server Profiler优化数据库的性能,减少资源的征用 SqlServer Profiler的功能 Sql Server Profiler的用法  定义跟踪  登录连接、失败和断开  Select、Insert、Update和Delete语句  SQL批处理的开始或结束  写入到Sql server错误日志的错误  安全权限检查  Profiler执的事件 让Profiler监视我们感兴趣的事件,可以监视的事件太多,监视太多会大大降低性能和增大表数据,只监视与数据库的性能密切相关的哪些事件。常见的感兴趣的事件:  执查询的性能  单个用户或应用程序的活动  逻辑磁盘的读写  语句级别上的CPU占用  Standart模板的事件类 优化数据库性能可以从五个层次来进:  优先级一:减少数据的访问【减少磁盘访问】  优先级二:返回更少数据【减少网络传输或磁盘访问】  优先级三:减少交互次数【减少网络传输或磁盘访问】  优先级四:减少开销【减少CPU及内存开销】  优先级五:利用更多资源【增加资源】 技术上从四个方面来解决性能优化问题 1、调整数据库结构设计 2、调整应用程序结构设计 3、调整数据库SQL语句 4、调整服务器内存分配 如果不熟悉sqlserver可以使用数据库引擎优化顾问来对数据库提出优化建议,然后通过系统管理的修改达到目的。 数据库引擎优化顾问  数据库引擎优化顾问介绍  分析一个或多个数据库的工作负荷和物理实现,工作负荷可以是优化的sql语句或者sqlserver profiler的跟踪文件数据表。我们可以在运引擎优化顾问前运用sqlserver profiler记录一些事件,然后将跟踪结果存储文件或者数据表,然后把这些提供给数据库引擎优化顾问,让它去分析。  提出合理的物理设计结构,物理设计结构包括数据库中的索引、索引视图、非聚集索引、聚集索引视图等等。对工作负荷进分析后,数据库优化顾问会建议添加删除修改数据库的物理设计结构。推荐一组合理的物理结构以降低工作负荷的开销。从而提高数据库的性能 数据库性能优化的常见问题 如何发现问题,如何分析导致性能降低的原因仍然是数据库管理员要掌握的知识。 事务占用资源的时间过长,造成阻塞 许多用户同时访问数据库的时候会产生大量事务,许多用户同时竞争一个资源导致占用资源的时间过长,造成阻塞。从而降低了数据库效率。产生这样的现象的原因如下: 1、多表连接查询,查询期间占用多个表 2、事务需要占用太多资源,容易出现多个事务占用对方资源的状况。从而导致死锁 解决之道: 1、避免多表连接查询,联合过多的表会在查询中占用过多的资源。很容易因为别的事务占用资源而相互等待。 2、使用统一的SQL语句规范,特别是访问表的顺序要保持一致,这样可以避免互相占用资源而导致的死锁。 不合理的数据文件设置,影响事务处理的性能 当事务处理产生大量数据的时候,数据文件的大小如果设置不合理将导致数据文件的不断扩展,这也会影响到事务处理的性能,进而影响到整个数据库的性能。 1、频繁操作数据库,导致日志文件增长的过快,因为日志文件记录数据库的原始操作。所以它的增长速度比数据文件要快得多。当日志文件增长大小设置不合理的时候会导致频繁地扩展文件。从而影响性能 2、查询操作比较频繁,系统数据Tempdb的大小设置不合理。 查询操作比较频繁的时候系统数据Tempdb增长得会比较快,因为查询所产生的临时数据都存放在这个数据库上。如果Tempdb过小当查询数据量较大的时候Tempdb会自动扩展,如果遇到频繁的查询会导致Tempdb不断扩展,从而影响系统性能。这种情况我尽可能地使查询的返回结果比较小 3、大量插入数据,导致数据文件增长过快。不要设置数据文件自动收缩,它会在忙碌的系统上导致不必要的性能开销。所以如果没有特别需要不要设置数据库自动收缩。最好采用手动收缩磁盘数据组织不合理,导致磁盘的访问次数过多 数据库磁盘访问都是按照页来访问数据的,无论访问的数据再少都是以页为单位读取,1页为8K。所以如果将经常访问的数据放在一起,数据库读取尽量少的页面就能够完成读取操作。这样效率自然就提高了。也减少了磁盘头的来回移动。否则会多次读取硬盘页面导致访问的效率降低。 对于表A和表B、表C、表D,如果经常查询表A和表B中的数据,那么可以将他们放在同一个文件组M中;如果经常访问表C和表D中的数据可以将他们放在同一个文件组N中。这样读取效率就比较高,因为一次读取就可能包含了两个表中的数据,因此提高了查询效率。要解决“磁盘数据组织不合理,导致磁盘的访问次数过多”这个问题,我们可以将经常读写的数据放置在不同的磁盘上,也就是将经常在一起被多表连接查询的表放在同一个文件组上。这里强调:这里反复提到的“不同的磁盘”指的的是不同的磁盘,而不是同一个硬盘的不同分区。 批量导入数据的时候,要进特殊设置 当用户需要大批量导入数据的时候会突然增加很多日志记录,并且如果数据表上有索引,数据表每增加一条记录就会在索引上增加一条数据从而降低插入的性能。解决方案: 1、大批量导入数据的时候设置数据库的恢复模式为“大容量日志恢复模式” 2、导入前禁用索引,导入完毕后重建索引。
 1.3 SQL 管理工具介绍     1.3.1 SQL server配置管理器     1.3.2 SQL server网络配置     1.3.3 连接SQL server服务器     1.3.4 服务器属性配置     1.3.5 命令下的SQL管理工具     2 设计与管理数据库和对象     2.1 SQL Server 数据库存储结构     2.1.1 数据库分类     2.1.2 数据库文件组成     2.1.3 数据库文件存储机制     2.1.4 事务日志工作机制     2.2 数据库设计规划     2.2.1 Raid技术介绍     2.2.2 文件增长收缩     2.2.3 使用文件组规划数据储存     3 设计实现数据库灾难备份和恢复     3.1 数据库备份     3.1.1 规划数据库备份策略     3.1.2 数据库完整备份     3.1.3 数据库差异备份     3.1.4 数据库日志备份     3.1.5 压缩备份     3.1.6 使用高级备份选项     3.1.7 利用维护计划进备份     3.2 数据库还原     3.2.1 数据库还原概述     3.2.2 恢复数据库到时间点     3.2.3 数据库快照概述     3.2.4 实现数据库快照     3.2.5 重建系统数据库     3.2.6 恢复系统数据库     4 高可用性解决方案     4.1 故障转移群集     4.1.1 高可用技术介绍     4.1.2 故障转移群集原理     4.1.3 故障转移群集分类及特点     4.1.4 部署故障转移群集     4.1.5 往群集中添加SQL实例     4.1.6 群集灾难场景     4.2 数据库镜像     4.2.1 数据库镜像基本原理     4.2.2 部署数据库镜像     4.2.3 数据库镜像管理及特点     4.3 日志传送     4.3.1 日志传送基本原理     4.3.2 部署日志传送     4.4 数据库复制     4.4.1 数据库复制基本原理     4.4.2 部署分发服务器     4.4.3 部署发布服务器     4.4.4 部署订阅服务器     4.5 Always on     4.5.1 Always on基本概述     4.5.2 Always on系统架构     4.5.3 Alwayson群集环境搭建     4.5.4 配置Always on可用性组     4.5.5 管理Always on     5 设计和实现数据库安全     5.1 it系统安全设计概述     5.2 SQL server的安全架构     5.2.1 登录名和身份验证模式     5.2.2 服务器角色     5.2.3 数据库用户     5.2.4 数据库角色   6 数据库自动化与高级管理     6.1 实现自动化的数据库管理     6.1.1 自动化管理组件介绍     6.1.2 自动化基本配置     6.1.3 数据库警报     6.2 多服务器脚本执和管理     6.2.1 多服务器脚本执     6.2.2 基于策略的管理     6.3 SQL server性能监视     6.3.1 数据收集器     6.3.2 SQL profiler     6.4 数据压缩     6.5 资源调控器     6.5.1 资源调控器概述     6.5.2 配置资源调控器     6.6 内存优化表     6.6.1 内存优化表概述     6.6.2 实现内存优化表     6.7 列存储索引     7 SQL server2019新特性     7.1 Temporal Table(历史表)     7.1.1 历史表介绍     7.1.2 历史表配置及数据追溯 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值