SQLserver在底层存储分别会在MSSQL目录下自动创建mdf数据文件和ldf日志文件
接下来详细介绍下数据库在应用层面操作时底层是怎么实现的:
SqlServer为完成数据恢复或事务回滚,对数据库中任何数据的修改都会记录在重做日志文件中。日志文件中的最小单位是日志记录,一条日志记录对应一个使数据库状态发生变化的操作。与表中的记录一样,日志记录也是由多个列构成,每个列对应数据修改操作的一个属性。
日志文件中的日志记录在某些条件下是不需要的 这些条件包括:
日志记录所在的事务已经提交。
日志记录修改的数据页已经被checkpoint进程写入磁盘。
(checkpoint是一个内部事件,这个事件激活以后会触发数据库写进程(DBWR)将数据缓冲 (DATABUFFER CACHE)中的脏数据块写出到数据文件中。,我认为是个flush)
任何数据库备份不再需要这个日志记录
数据库镜像,数据库复制等环境不再需要读取这个日志记录
Checkpoint与LSN详解:
checkpoint是重做日志对数据页刷新到磁盘的检查点,通过LSN号保存记录,作用是当发生宕机事件后 再次启动时会查询到checkpoint点在该检查点之后发生的事务修改恢复到磁盘
假设数据库未处于镜像,复制的环境中:
根据存储的日志记录情况 重做文件中VLF可以分为以下4种状态:
active:VLF中存在属于活动事务的日志记录,活动的事务指的是未结束的事务
Recoverable:不包含活动事务的日志,即数据库刺死处于维护一个完整日志序列的状态,而这些VLF还未进行本分;或者数据库处于复制,镜像等需要使用重做日志
传送方式同步数据库间数据的环境 VLF包含未传送的重做数据
reusable:VLF中包含的日志记录是不再需要的 这种状态也称为可截断(内容可以被新产生的重做数据覆盖)
Unused:未被使用
VLF的位置
打开数据库找到对应的位置查询 dbcc loginfo 查看里面字段startoffset (具体哪个值需要看那个VLF已使用需要再次看起状态status 看是否包含活动状态)
跳过startoffset之后参考以下字段偏移41个字节
字段 偏移
Parity 1 1
Fseqno 4 4-7
Status 4 8-B
Filesize 8 10-17
CreateLSN 10 20-29
VLF个数与日志文件大小的关系
空间大小 VLF个数
512KB<=size<768KB 2 524288 786432
768KB<=SIZE<1MB 3
1MB<=SIZE<=64MB 4
64MB<SIZE<=1GB 8
SIZE>1GB 16
日志记录定位
1,先找到VLF的起始位置
2,第一个VLF的位置都在8192字节之后 至于与mdf之间的关系:从数据页的页头得到VLF的序列号,序列号一致的在同一个日志块中 而通过日志序列号可以得到startoffset的偏移位置)
日志记录
找到日志段之后 查看VLF字段 注意两个字段:
lbk_offsetSlotArray、lbk_totalSize
这两个字段 可以知道相对偏移量与这个日志段的总字节大小
可以得到俩个偏移量 都是以日志段头为相对偏移 得到中间一块是日志记录,通过测试 得到里面有一个objid跟ldf中的id是一致的,也可以说明每一次插入对应一条日志
详细了解加QQ 1176545149 了解