当前位置: 首页 > news >正文

SQL Serve 日志体系结构

SQL Server 事务日志记录着 undo 及 redo 日志,为了保证数据库在崩溃后恢复,或者在正常数据库操作期间进行回滚,保证数据库事务完整性和持久化。如果没有事务日志记录,数据库在事务上将不一致,并且在数据库崩溃后可能导致结构上损坏。

SQL Server 日志记录最初在内存中处理,可能在事务提交之前写入磁盘,单必须在事务完成提交之前写入磁盘,否则事务不会持久化(延迟事务特性例外)。

事务日志的内部结果是什么样子呢?

结构层次

事务日志在内部使用三层结构进行组织,如下图所示。

事务日志包含虚拟日志文件,虚拟日志文件包含存储实际日志记录的日志块。

事务日志分为多个虚拟日志文件(virtual log files),通常称为VLF。这样做是为了让 SQL Server 中的日志管理器更轻松地管理事务日志中的操作。你无法指定 SQL Server 在首次创建数据库或日志文件自动增长时创建了多少 VLF,但你可以影响它。创建多少个 VLF 的算法如下:

  • 日志文件大小小于 64MB:创建 4 个 VLF,每个大小约为 16 MB

  • 日志文件大小从 64MB 至 1GB:创建 8 个 VLF,每个大约是总大小的 1/8

  • 日志文件大小大于 1GB:创建 16 个 VLF,每个大约是总大小的 1/16

在 SQL Server 2014 之前,当日志文件自动增长时,添加到日志文件末尾的新 VLF 数量由上述算法根据自动增长大小确定。但是,使用这种算法,如果自动增长的大小很小,并且日志文件经历了许多自动增长,它可能会导致大量的小 VLF(称为VLF 碎片),这可能是一个很大的性能问题。

由于这个问题,在 SQL Server 2014 中,日志文件的自动增长算法发生了变化。如果自动增长的大小小于总日志文件大小的 1/8,则只创建一个新的 VLF,否则使用旧算法。这大大减少了由日志文件频繁自动增长的 VLF 数量。

每个 VLF 都有一个唯一标识它的序列号,并用于各种地方,你可能认为全新数据库的序列号将从 1 开始,但事实并非如此。

在 SQL Server 2019 实例上,我创建了一个新数据库,但未指定任何文件大小,然后使用以下代码检查 VLF:

CREATE DATABASE NewDB;GO
--MSSQL 2016 SP2开始可用SELECT    [file_id],     [vlf_begin_offset],    [vlf_size_mb],    [vlf_sequence_number]FROM sys.dm_db_log_info (DB_ID (N'NewDB'));GO
--MSSQL 任意版本可用DBCC LOGINFO('NewDB');GO

请注意,sys.dm_db_log_info 是在 SQL Server 2016 SP2 中添加的。你也可以使用 DBCC LOGINFO 命令查看,FSeqNo为 VLF 序列号。

请注意,第一个 VLF 从日志文件的偏移量 8192 字节开始。这是因为包括事务日志在内的所有数据库文件都有一个文件头页,该页占用了前 8KB,并存储了有关该文件的各种元数据。

那么为什么 SQL Server 选择 36 而不是 1 作为第一个 VLF 序列号呢?这是因为数据库的创建都是以 model 作为参考,model 中的最大 VLF 序列号加上1,即为新数据库的 VLF 序列号。该算法从 SQL Server 7.0 开始就已使用。

为了证明这一点,我运行了以下代码:

SELECT MAX ([vlf_sequence_number]) AS [Max_VLF_SeqNo]FROM  sys.dm_db_log_info (DB_ID (N'model'));GODBCC LOGINFO('model');GO

现在只要知道每个 VLF 都有一个序列号就足够了,每个 VLF 序列号增量为1。

日志块

每个 VLF 包含一个小的元数据标头,其余空间由日志块填充。每个日志块从 512 字节开始,以 512 字节为增量增长到最大 60KB,此时必须将其写入磁盘。如果发生以下情况之一,日志块可能会在达到其最大大小之前写入磁盘:

  • 事务提交,并且延迟持久性未作用于该事务,因此必须将日志块写入磁盘以使事务持久;

  • 使用延迟持久化,后台“flush the current log block to disk”每1ms定时触发;

  • 检查点或惰性写入器正在将数据文件页面写入磁盘,并且当前日志块中有日志记录影响要写入的页面(预写日志);

你可以将日志块看作是大小可变的页面,它按照事务更改数据库创建的顺序存储日志记录。每个事务没有专门的日志块,多个并发事务的日志记录可以混合在一个日志块中。你可能认为,当去寻找单个事务的所有日志记录时会带来困难,但事实并非如此。此外,当一个日志块被写入磁盘时,它完全有可能包含来自未提交事务的日志记录。

日志序列号(LSN)

日志块在 VLF 中有一个 ID,从 1 开始,对于 VLF 中的每个新日志块增量为 1。日志记录在日志块中也有一个 ID,从 1 开始,对于日志块中的每个新日志记录增加 1。因此,事务日志的结构层次结构中的所有三个元素都有一个 ID,它们合并为一个称为日志序列号的三方标识符中,通常简称为LSN。

一条 LSN 定义为 <VLF sequence number>:<log block ID>:<log record ID>(4 字节:4 字节:2 字节),唯一标识一条日志记录。这是一个不断增加的标识符,因为 VLF 序列号永远增加。

你也可以使用 fn_dblog 查看当前数据库的事务日志:

--sys.fn_dblog(Start LSN nvarchar(25), End LSN nvarchar(25))SELECT [Current LSN] FROM sys.fn_dblog(NULL, NULL)

相关文章:

SQL Serve 日志体系结构

SQL Server 事务日志记录着 undo 及 redo 日志&#xff0c;为了保证数据库在崩溃后恢复&#xff0c;或者在正常数据库操作期间进行回滚&#xff0c;保证数据库事务完整性和持久化。如果没有事务日志记录&#xff0c;数据库在事务上将不一致&#xff0c;并且在数据库崩溃后可能导…...

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号,public,ooci

文章目录1.函数重载&#xff1a;writetofile()&#xff0c;Ctrue和false&#xff0c;C0和非02.类和对象&#xff1a;vprintf2.1 构造函数&#xff1a;对成员变量初始化2.2 析构函数&#xff1a;一个类只有一个&#xff0c;不允许被重载3.引用&#xff1a;C中&取地址&#x…...

asio网络编程 tcp、udp、rpc

轻量级的tcp/udp/rpc库&#xff0c;简化socket程序编写。 同时&#xff0c;RPC部分也提供了方便易用的功能。 仓库地址 https://github.com/shuai132/asio_net asio_net a Tiny Async TCP/UDP/RPC library based on ASIO and RpcCore Features 简化TCP、UDP相关程序的编写…...

双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)

Depth2Uart 双目测距------双目相机V1.0&#xff0c;将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能&#xff1a;基于Intel Realsense官方提供的SDK&#xff0c;双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离&#xff0…...

jetson nano(ubuntu)安装Cmake

文章目录安装环境一.命令行安装二.Cmake源码编译安装安装环境 jetson nano 系统&#xff1a;4.6.1 一.命令行安装 sudo apt install cmake这种直接安装cmake的方式&#xff0c;其实安装的版本都太老了&#xff0c;这种方式不推荐 二.Cmake源码编译安装 更新一下系统软件 su…...

图的基本介绍和表示方式

图的基本介绍 为什么要有图这个基本数据结构? 我们还学习过线性表&#xff08;数组、队列、链表和栈&#xff09;和树&#xff0c;但是我们可以发现&#xff0c;线性表局限于一个直接前驱&#xff08;就是只能有唯一一个前面的结点&#xff09;和一个直接后继的&#xff08;…...

本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED

本周大新闻&#xff0c;AR方面&#xff0c;消息称微软解散工业元宇宙团队&#xff1b;德国AR公司Gixel GmbH亮相&#xff1b;Brilliant推出单片式附加形态AR眼镜&#xff1b;MIT研发垂直堆叠全彩Micro LED&#xff1b;谷歌XR串流正式上线。VR方面&#xff0c;索尼发布了PS VR2的…...

SpringMVC:拦截器(12)

拦截器1. 拦截器概念2. 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1: 创建拦截器类步骤2: 配置拦截器类步骤3: SpringMVC添加SpringMvcSupport包扫描和interceptor包扫描步骤4: 简化SpringMvcSupport的编写5 测试3. 拦截器参数解析&#xff08;了解&#xff09;3.1 前置处理…...

计算机网络3:HTTP1.0和HTTP1.1的区别

目录1. HTTP是什么2.HTTP1.0和HTTP1.1的区别3.名词解释&#xff08;1&#xff09;If-Modified-Since&#xff08;IMS&#xff09;、Expires&#xff08;2&#xff09;If-None-Match&#xff0c;Etag&#xff08;3&#xff09;If-Unmodified-Since1. HTTP是什么 超文本传输协议…...

Urho3D 编辑器说明

Urho3D编辑器是一个脚本应用程序&#xff0c;可以与Urho3D播放器应用程序一起运行。要开始&#xff0c;请执行以下任意命令&#xff1a;&#xff08;在bin目录中&#xff09;Editor.bat、Editor.sh或Urho3DPlayer Scripts/Editor.as Urho3D播放器应用程序支持的所有命令行选项…...

C++类基础(十一)

运算符重载&#xff08;二&#xff09; ● 对称运算符通常定义为非成员函数以支持首个操作数的类型转换 struct Str {int val 0;Str(int input): val(input){}auto operator(Str x){std::cout << "auto operator(Str x)\n";return Str(val x.val);} }; int …...

Windows安装系列:SVN Server服务

一、下载与安装 1、下载VisualSVN-Server-5.1.1-x64.msi 地址&#xff1a;Download | VisualSVN Server 2、找到最新版本SVN 5.1.1&#xff0c;直接双击它&#xff0c;弹出如下安装界面 3、点击Next 4、勾选我接受&#xff0c; 点击"Next" 5、默认选项&#xff0c…...

快速傅里叶算法(FFT)快在哪里?

目录 前言 1、DFT算法 2、FFT算法 2.1 分类 2.2 以基2 DIT&#xff08;时间抽取&#xff09; FFT 算法为例 2.2.1 一次分解 2.2.2 多次分解 参考 前言 对信号分析的过程中&#xff0c;为了能换一个角度观察问题&#xff0c;很多时候需要把时域信号波形变换到频域进行分…...

利用Markdown写学术论文资料汇总贴

1是最详细的&#xff0c;重点看&#xff01; Markdown 写作&#xff0c;Pandoc 转换&#xff1a;我的纯文本学术写作流程 2补充一些细节&#xff0c;也可以看看。 用Markdown写作学术论文 3写得和上面差不多&#xff0c;如果上面两篇有什么问题还没解决&#xff0c;可以看看…...

MySQL 高级查询

目录1.左关联2.右关联3.子查询4.联合查询5.分组查询1.左关联 MySQL中的左关联&#xff08;Left Join&#xff09;是一种基于共同列的连接操作&#xff0c; 它将左侧表中的所有行与右侧表中匹配的行结合在一起&#xff0c; 如果右侧表中没有匹配的行&#xff0c;则结果集中右侧…...

JavaSE学习day4_01 循环for,while,do...while

1. 循环高级 1.1 无限循环 for、while、do...while都有无限循环的写法。 最为常用的是while格式的。 因为无限循环是不知道循环次数的&#xff0c;所以用while格式的 代码示例&#xff1a; while(true){} 1.2 跳转控制语句&#xff08;掌握&#xff09; 跳转控制语句&…...

C/C++中的static关键字

概述在C/C中都有static关键字的使用&#xff0c;可以分别修饰变量和函数&#xff0c;分为静态变量【静态成员】、静态成员函数。2. static用法概况静态变量的作用范围在一个文件内&#xff0c;程序开始时分配空间&#xff0c;结束时释放空间&#xff0c;默认初始化为0&#xff…...

67 自注意力【动手学深度学习v2】

67 自注意力【动手学深度学习v2】 深度学习学习笔记 学习视频&#xff1a;https://www.bilibili.com/video/BV19o4y1m7mo/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 给定长为n 的序列&#xff0c;每个xi为长为d的向量&#xff0c;自注意力将xi 既当…...

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;二级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 一个骰子&#xff0c;从3个不同角度看过去的点数如图所示&#xff0c;请问5的对面是什么点数&#xff1f;&#xff08; &#xff09; …...

关于链表中插入结点的操作……

服了&#xff0c;好久没敲链表了&#xff0c;这都忘了 newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur->next newnode; newnode->next cur->next; cur-…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...

day51 python CBAM注意力

目录 一、CBAM 模块简介 二、CBAM 模块的实现 &#xff08;一&#xff09;通道注意力模块 &#xff08;二&#xff09;空间注意力模块 &#xff08;三&#xff09;CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...

npm install 相关命令

npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖&#xff08;默认&…...