SQL Server数据库空间管理 (2)
本篇内容主要解决剩余的两个问题:2)、日志文件不停增长 4)、自动增长和自动收缩
日志文件不停增长的解决
首先,当日志文件超过预期的时候,我们然要看看日志文件中存放了什么内容:DBCC LOG ;这里就不对这个命令进行仔细的讲解了,重要的是我们通过这个可以知道日志记录的特点:
1.日志记录的是数据的变化,而不是记录用户发过来的操作。
2.每条记录都有它唯一的编号(LSN),并且记录了他的事务号。
3.日志记录的行数和实际修改的数据量有关。
4.日志记录了事务的发生时间,但是不保证记录下了发起这个事务的用户名,更不记录发起者的程序名称。
5.SQL Server能从日志记录里里面读到数据修改前的值和修改后的值。
再次,SQL Server采用的日志记录会避免日志文件将空间耗尽,这种机制会定期清理日志文件中不需要的日志记录:
1. 所有没有经过“检查点”的日志记录。
2.所有没有提交的事务所产生的日志记录,以及在他们之后的所有日志记录。
3.所有要做备份的日志记录。
4.有其他需要读取日志的数据库功能模块。
最后,我们分析日志文件中记录越来越多的原因,以便于处理日志不停增长:
1.数据库恢复模式不是简单模式,但是没有安排日志备份;
对于非简单模式的数据库,只有做完日志备份记录才会被截断。做完整备份和差异备份都不会起到这个作用。
2.数据库上面有一个很长时间都没有提交的事务;
这个情况,只要这个连接不断开,这个事务就会永远存在,直到客户端主动提交或者回滚它。而这个事务的那个开启时间点开始的所有日志记录,SQL Server都会记录。
3.数据上有个很大的事务正在进行;
例如:用户正在建立/重建索引,或者用DELETE/INSERT语句删除或插入大量数据等。
4.数据库复制或者镜像出了异常。
要避免日志文件不停增长,其实就是要避免上面这些情况的发生,对于一个最近不会去做日志备份的数据库,设置简单恢复模式即可;如果数据库设置了完整恢复模式,那就一定要安排定期做日志备份。如果复制或镜像任务出问题,要及时解决,如果没有办法解决就要暂时拆除复制或镜像,以防止日志记录越积越多;通常解决日志增长的原因步骤如下:
1. 检查日志现在使用情况和数据库状态:
DBCC SQLFREE(LOGSPACE)
go
SELECT name,recovery_model_desc,log_resuse_wait,log_reuse_wait_desc from sys.dadabases
go
如果检查结果表明,当前日志绝大数都在使用中(Log Space Used(%)),那就马上定位是什么原因导致了日志记录不能被SQL Server清除掉,如果当前日志的大部分已经处于空闲状态,那就说明触发日志增长的因素已经暂时消失。如果数据库的状态是LOG_BACKUP,那就意味这SQL SERVER在等待日志备份,这时候需要检查备份计划,是否需要做日志备份,如果不需要就可以直接把恢复模式设置为简单。这样SQL server会在下一个检查点的时候做日志记录截断工作。
2.检查最老的活动事务:
--返回当前数据库最久没有提交的事务
DBCC OPENTRAN
GO
---查询这个连接是由什么程序建立的以及这个连接最后发过来的一句命令内容
SELECT st.text,t2.* From
sys.dm_exe_session AS t2, sys.dm_exec_connections AS t1
CROSS APPLY
sys.dm_exec_sql_text(t1.most_recent_sql_handle) AS st
WHERE t1.session_id=t2.session_id AND t1.session_id>50
如果找到了一条这样的事务,可以尝试使用kill 命名关闭连接。
自动增长和自动收缩
设置自动增长要注意:
1. 要设置成按照固定大小增长,而不能按照比例;
这样就能避免一次增长太多或者太少所带来的不必要麻烦。比较小的数据库,设置一次增长50MB到100MB。对大的数据库设置一次增长100MB到200MB。
2.要定期监测各个数据文件的使用情况,尽量保证每个文件剩余的空间一样大,或者是期望的比例。
3.设置文件最大值,以免SQL SERVER 文件自增长用尽磁盘空间,影响操作系统。
4.发生自增长后,要及时检查新的数据文件空间分配情况。
除了自动增长的功能,数据库还有一个自动收缩的功能。如果设定了这个功能,SQL SERVER每隔半个小时就会检查文件使用情况。如果空间空间大于25%,SQL SERVER就会自动运行DBCC SHRINKFILE的动作。所以这个功能能够防止数据库申请过多的空间而不使用。看似这样做是很好的,但是也是有弊端的:
1.SQL SERVER 只有在空间用尽的情况下才会做自动增长。如果没有找出自增的原因,从而从根本上避免空间用尽,虽然能够暂时用DBCC SHRINKFILE功能收缩文件大小,但是下次数据库还是会可能增长。
2.数据文件收缩会给文件带来更多的碎片。
3.不管是数据库收缩还是增长,对SQL SSERVER都是浪费资源的事情。