数据库日志文件(收缩管理)

sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件

?可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候,自动增长就会生成新的文件,这些文件叫做VLF(虚拟日志文件),所以说在这个层面上来说,我们可以简单的把数据库日志理解为一列火车,一节一节的车厢理解为数据库的虚拟日志文件,当然如果不够存的下事务日志的时候,就要扩充,就是加一个火车厢.

所以说数据库事务日志其实是由很多个独立的虚拟事务日志文件组成的,我们看一下,大概就知道数据库的虚拟日志文件有自己的状态,也有自己的LSN标识.那在数据库的层面是怎么管理这些数据库日志文件呢.

?看一下LSN的作用

1:就是LSN用来标识VLF的序列号

2:LSN标识日志在VLF文件中的具体位置

我们分析一下数据库日志的逻辑管理?

我们简单的理解数据库日志是有两种状态的,活动日志和非活动日志(虽然日志有四种状态,但是我们理解这两种状态应该就足够了),活动日志的头部和尾部的标记就是头日志和尾日志,中间部分就是数据库活动日志,其实这个图还是不太直观的,因为数据库日志管理的话,更像一个圆形的管理,是可以达到连续管理的,当数据库头日志到达数据的尾部时候,如果第一个日志文件是可用的,事务日志则不会自动增长,而是去占用第一个数据库的VLF,这一点是很重要的,我们可以看一下,数据库的头日志是不断的往前走而尾日志什么时候才能改变位置呢.

如果想要改变尾日志的位置,只有活动日志减少,活动日志减少就意味着数据库日志的截断,所以说,每次发生数据库事务日志截断的时候尾日志才会向后推移.

数据库日志文件有一个状态,status,大家细心观察一下就会发现,其实有0,2两种状态,0就是代表空闲,2代表使用.

千万不要小看这个状态,对于收缩数据库日志文件来说,这个状态是很重要的

日志文件能被收缩的原因是该文件尾部的数据被清除了,使得该部分空间被释放,而不是逃过尾部去删除文件首部或者中间部分的内容。

sqlserver数据库的收缩是从最后一个数据库日志文件开始进行压缩的,所以说只有当最后一个VLF的状态为0的时候,DBCC SHRINKFILE才能发挥作用,否则收缩数据库日志文件是不会有效果的.

时间: 2024-10-14 05:36:07

数据库日志文件(收缩管理)的相关文章

数据库日志文件收缩

项目所使用的数据库通过备份还原来的,导致日志文件很大,占用了很大的空间,在网上搜索了日志收缩的信息,整理了下. --清空日志 DUMP  TRANSACTION  EWABOQDB  WITH NO_LOG --截断事务日志 BACKUP LOG EWABOQDB WITH NO_LOG --收缩日志 右键要收缩的数据库--任务--收缩--文件--文件类型选择日志--收缩方式中选择收缩至XXM输入确定 以上已完成日志文件的收缩,日志文件所占空间已减少 下面是对日志文件的增长规则进行了个限制 右键

批量收缩数据库日志文件

declare @sql nvarchar(max),@paramDef nvarchar(100) declare dbname scroll cursor for select name,recovery_model from sys.databases where database_id>7 open dbname declare @dbname varchar(50),@recovery_model int,@db_log_file varchar(100) set @dbname=''

SQL SERVER2008 数据库日志文件的收缩方法

最近公司的数据库随着业务量的增多,日志文件巨大(超过300G),造成磁盘空间不够用,进而后来的访问数据库请求无法访问. 网上类似的方法也很多,但不可行,如下是我实践过,可行的,将日志文件收缩至任意指定大小的方法: 第一步: 在SQL SERVER Management Studio 中右击数据库选择"属性"--->"选项",将恢复模式由默认的"完整"改为"简单". 第二步:再次右键选择数据库的"任务"

SQL存储过程删除数据库日志文件的方法

--日志文件收缩至多少M DECLARE @DBLogSise AS INT SET @DBLogSise=0 --查询出数据库对应的日志文件名称 DECLARE @strDBName AS NVARCHAR(500) DECLARE @strLogName AS NVARCHAR(500) DECLARE @strSQL AS VARCHAR(1000) SELECT @strLogName=B.name, @strDBName=A.name FROM master.sys.databases

使用作业自动清理数据库日志文件

原文:使用作业自动清理数据库日志文件 在上一篇文章中介绍了如何删除数据库日志文件,但是想想还是不是不方便需要手工操作,于是想结合作业实现自动清理日志文件,在清理日志文件时我加上了条件,当磁盘控空间不足多少M才会清理,下面介绍如何实现该功能.没有阅读上一篇文章的,可以通过传送门阅读(删除数据库日志文件的方法)! 阅读目录 SQL查询磁盘空间大小 存储过程添加作业 示例下载 回到顶部 SQL查询磁盘空间大小  采用内置的存储过程,即可查看各个磁盘可用空间 exec master..xp_fixedd

数据库日志无法收缩

在论坛里面经常有人遇到,数据库日志文件无法收缩的问题.这里详细介绍下这个问题怎么解决. 处理 遇到日志文件无法收缩的问题,第一步肯定是先运行下面的命令: SELECT name,log_reuse_wait_desc FROM sys.databases where name='dbname' 对应的log_reuse_wait_desc 说明如下图:

数据文件 和日志文件 收缩 Sql Server

A. 将数据文件收缩到指定的目标大小 以下示例将 UserDB 用户数据库中名为 DataFile1 的数据文件的大小收缩到 7 MB. 复制 USE UserDB; GO DBCC SHRINKFILE (DataFile1, 7); GO B. 将日志文件收缩到指定的目标大小 以下示例将 AdventureWorks2008R2 数据库中的日志文件收缩到 1 MB.若要允许 DBCC SHRINKFILE 命令收缩文件,首先需要通过将数据库恢复模式设置为 SIMPLE 来截断该文件. 复制

删除数据库日志文件的方法

原文:删除数据库日志文件的方法 你曾经有在执行SQL的时候,数据库报事务日志已满,然后执行报错.然后纠结于怎么删除数据库日志,捣鼓半天吗,现在就提供两种删除日志文件的方法,希望能够帮到你! 阅读目录 方法一:手工操作 方法二:存储过程代替手工操作 示例存储过程下载 回到顶部 方法一:手工操作   1.数据库->右键->属性->选项-恢复模式->由完成切换成简单   2.数据库->右键->任务->收缩-文件->由完成切换成简单->文件类型->日志-

SQL 解决数据库日志文件已满的问题

出现数据库操作失败,查找原因,发现数据库日志已满: 解决此问题有两种方法: 1.压缩日志文件 1.数据库->属性->选项-恢复模式->由完成切换成简单 2.数据库->任务->收缩-文件->文件类型->日志->将文件收缩到 2.删除日志文件 分离数据库: 删除数据库日志文件 附加数据库时,出现找不到日志字样,删除数据库日志文件 点击保存,成功!