【数据库事务日志碎片原理分析与方案】-深入解析篇.pdf

news2025/1/21 12:17:36

日志增长与 VLF 文件的个数 通过上面的相关内容的介绍,我们已经知道了日志文件自动的增长会到了一些问

题,而事实确实如此,下面,我们就来更加清楚的看看这些问题。

很显然,我们不希望日志文件任意的增长,我们更加希望这个增长是受我们控制 的。我们先看看自动增长的一些问题:

1.导致过多的 VLF。因为自动增长会在需要的时候去增加日志文件所在磁盘空间的大 小,而且每次分配的空间又会被分成多个 VLF,如果每次增长的磁盘空间不大,而数据库 的操作(指的是那些写日志的操作)又非常的频繁,最后就结果就是数据库的日志文件一 点点的增长,从而导致磁盘的文件碎片和数据库内部日志文件碎片,这样就会极大的降低 了读取日志的速度。另外,大家应该还记得之前我们说过:数据库的日志是循环写入的, 如果日志文件内部碎片,那么在重新将日志写入日志文件的时候,就需要去需找文件的位 置,会使得相对应的数据库操作更加的慢。

2.每次日志文件的增长会消耗 CPU 和 I/O:日志自动增长不会使用实例文件初始化, 因此,SQL Server 需要去每次都去经历日志文件进行初始化的全过程,而这个过程是非常 消耗资源的。这一点,大家只要知道有这么回事就行了,不用深究。

另外,如果我们在建立数据库的时候,采用了默认的配置,那么自动增长是被默 认开启的,而且默认的数据文件和日志文件的大小都很小。如果我们就这样使用数据库, 最后会发现:日志文件中包含成百上千个 VLF。

每次在新建一个数据库的时候,默认的大小以及自动增长的设置都是从 model 这个系统数据库中继承而来的。一般而言,日志文件的初始大小 1MB,自动增长为 10%。

这个时候,可能有朋友就要问了:这个 1MB 日志中包含多少个 VLF,或者说日

志文件的大小与 VLF 的个数之间是什么关系? 我们下面的一个表反映了日志文件的大小和 VLF 个数之间的关系。

很显然,在默认的情况下,数据库的日志文件将会包含 4 个 VLF,因为默认的时 候大小是 1MB<64MB 的。

所以,这样有一个建议:除非你需要用很多的小的数据库,否则,就调整 Model 数据库的一些设置,使得以后你新建的数据库从继承你设定的设置数据。

下面,我们就通过例子来看看一些问题。 我们下面的代码,创建了一个新的数据库,采用的默认的设置。同时,也将恢复

模型设置为 Full,如下所示:

在下面的一段代码中,我们使用 DBCC LOGINFO 来查看日志文件的 VLF 的个数, 如下: 

现在,我们再看到下面的代码,在代码中创建了一个新表 AgileSharpTable,并且开启 事务,然后插入 10000 行数据: 

此时,这个测试花了将近 50 秒的时间,此时,我们在查看 VLF 的信息,此时发现已 经有了 251 个。

下面,我们在新建一个数据库,此时我们自己设置日志文件的大小和增长情况, 如下:

此时,我们还是运行 DBCC LOGINFO,此时发现里面包含了 8 个 VLF,因为我们的 日志文件的初始大小>=64MB 并且<1GB。

像第一个例子,我们此时在新的数据库中创建新的表,并且插入 10000 条数据。然 后我们在运行 DBCC LOGINFO,此时发现,它的 VLF 还是 8 个。而且插入的数据也快了 很多,只有 27 秒,这个主要是因为日志文件初始化的过程变少,提高了性能。

到现在为止,我们做了一些简单的演示,也看出一些性能的问题,下面我们就进 一步的看看 VLF,那么在此之前,我们先具体的看看刚刚使用的 DBCC LOGINFO 命令。

深入 DBCC LOGINFO

通过刚刚的使用,我们已经发现这个命令相当的有用了,通过它我们可以找到日 志文件中的 VLF 的个数。另外,它还可以告诉我们更多的信息。为了更加的清楚,我们 删除之前的那个 VLFTest1 数据库,然后重新建立它。

然后运行 DBCC LOGINFO,得到如下的结果:

列名的解释如下:

FileID:在 sysfiles 中对用的 FileID,可以通过它表明日志文件存在的位置。

FileSize:VLF 的大小,单位是字节。

StartOffSet:VLF 文件在日志文件中起始的字节数。

Status:表明 VLF 是否包含活动的日志记录。2 表示这个 VLF 是活动的,不能被覆盖 写入。

Parity:它的之范围是 0,64 或者 128.
CreateLSN:VLF 最先创建的 LSN。如果两个 VLF 文件有相同的这个数字,就表明这

两个 VLF 是同时创建的,并且通过自动增长

简单的介绍之后,我们再来运行下面的一段代码:

运行 DBCC LOGINFO,结果如下: 从中可以看到,此时我们有一个活动的 VLF,而且还新建了 11 个 VLF。

控制 VLF

到这里,已经讲了很多与 VLF 相关的内容了,相信大家都应该心里不再害怕这些 内容了。其实日志文件碎片产生最主要的原因就是日志文件的增长次数过多,特别是如果 每次只是增长一点点的时候。

所以,当我们在创建数据库的时候需要设置合适的文件的大小,使得文件的大小 起码可以应付一段时间的增长。同时,也不要一下子就去创建一个很大的日志文件,因为 里面可能只包含很少的 VLF,最后却发挥不了太大作用,反而导致磁盘空间不足的错误发 生。

很多的朋友都问我有没有一些好的数据或者法则来判断导致应该创建多少个 VLF,这里的 回答是没有,如果非得要答案,只有一个:视情况而定。如果我以前说这话,可能要被人 批死,但是如果做过这方面工作的朋友,应该清楚:这才是真理。没有万能的钥匙。这主 要取决于数据库的读写的比例,还有就是日志文件备份的方式。

另外,也不是说:自动增长就是罪恶的,只要用的合适,依然不错,而且它还是 保护措施,特别是当我们把日志的增长速度估算错误的时候,自动增长可以来帮助我们弥 补这个问题。例如,假设我们把日志大小设置为 40GB,并且禁用了自动增长,但是数据 库的读写速度不是我们当初想的那样,我们当初以为 40GB 可以抗住 3 个月的数据库日志 的写入,但是结果却不是,如果我们禁用自动增长,结果可能导致数据库无法写入。

一般是通过一些数据进行分析了,这里我给朋友们一些可以参考的数据吧,但是 不能盲目的套用,但是思路是这样的。我一般会把日志文件的大小设置和所在的磁盘大小 相差 90%,并且开启自动增长。而且这个大小的设置也不是一下子就设置上去的,例如, 磁盘空间是 100GB,我不会一下子就设置 90GB 的日志文件,因为那样,里面包含的 VLF 太少,会导致严重的性能问题。所以要一步步的设置,例如,开始设置日志大小为 1GB, 然后在将其增加到 2GB(也就是每次增加 1GB,也有人推荐 512MB),一次类推,一直 最后到 90GB。当然,每一次增加的大小可以调整,需要自己去测一下。

修复日志碎片

到这里,对日志文件剩下的话题就是整理它的碎片了。

如果我们发现数据库中包含了非常多的 VLF,此时我们就需要去整理。在这, 朋友又要问了:你说的“非常多的碎片”,到底“非常多”是多少?说实在的,我还真 不好说了,但是可以这样思考:如果是你设置日志文件的大小和 VLF,你会根据我们之 前告诉大家的方法来设置 VLF 的个数(例如,每次增加 1GB 的日志文件,增加 8 个 VLF),得到你设置的 VLF 的个数,然后比较现在的 VLF 个数,如果两个数据之间相差 的十几倍以上,那么就可能存在 VLF 问了,就需要整理碎片了。

整理的方法简单,就是运行 DBCC SHRINKFILE 命令,如下: DBCC SHRINKFILE(<transaction log logical file name>,TRUNCATEONLY);

然后再想之前那么,把日志文件的大小设置回去。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2020年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;完美立方 形如 a^3 b^3 c^3 d^3的等式被称为完美立方等式。例如 12^3 6^3 8^3 10^3 。 编写一个程序&#xff0c;对任给的正整数 N (N≤100)&#xff0c;寻找所有的四元组 (a, b, c, d)&#xff0c…

leetcode 1382. 将二叉搜索树变平衡

2023.9.8 本题分为两步&#xff0c;先用中序遍历将二叉搜索树转化为排序数组&#xff0c;再通过排序数组构建一个平衡二叉树。 代码如下&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;*…

数据结构与算法基础-学习-32-选择排序之简单选择排序、堆排序

目录 一、简单选择排序基本思路 二、简单选择排序基本操作 三、简单选择排序算法思路 四、简单选择排序代码 1、SimpleSelectSortSentrySqQueue 五、简单选择排序算法分析 1、记录移动次数 2、记录比较次数 六、简单选择排序Linux环境编译测试 七、堆的定义 八、堆调…

MySQL数据表的约束

数据表约束&#xff1a;对于某一列的值能添加哪些内容做了一定的限制&#xff0c;这种限制的手段就称为约束。 &#xff08;一&#xff09;约束的类型 NOT NULL 指示某列不能存储 NULL 值。UNIQUE保证某列的每行必须有唯一的值。DEFAULT规定没有给列赋值时的默认值。PRIMARY …

利用less实现多主题切换(配合天气现象)

1. 先看效果&#xff1a; 2. 话不多说直接撸吧&#xff1a; 原理&#xff1a;先给body元素添加style&#xff0c;再根据天气现象动态更改style 开撸&#xff1a; 创建src/assets/style/variables.less 使用 XXX:var(–XXX,‘style’) 声明系列变量&#xff0c;之后添加其他变…

redis如何保证接口的幂等性

背景 如何防止接口中同样的数据提交&#xff0c;以及如何保证消息不被重复消费&#xff0c;这些都是shigen在学习的过程中遇到的问题。今天&#xff0c;趁着在学习redis的间隙&#xff0c;我写了一篇文章进行简单的实现。 注意&#xff1a;仅使用于单机的场景&#xff0c;对于…

春秋云镜 CVE-2017-1000480

春秋云镜 CVE-2017-1000480 Smarty < 3.1.32 PHP代码执行漏洞 靶标介绍 3.1.32 之前的 Smarty 3 在未清理模板名称的自定义资源上调用 fetch() 或 display() 函数时容易受到 PHP 代码注入的影响。 启动场景 漏洞利用 poc /index.php?eval*/phpinfo();/*/index.php?ev…

原生JavaScript+PHP多图上传实现

摘要 很多场景下需要选择多张图片上传&#xff0c;或者是批量上传以提高效率&#xff0c;多图上传的需求自然就比较多了&#xff0c;本文使用最简单的XMLHttpRequest异步上传图片。 界面 上传示例 代码 index.html <!DOCTYPE html> <html><head><titl…

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…

【Chrome】chrome浏览器未连接到互联网

问题描述 电脑上安装了一个联想电脑管家&#xff0c;进行了一下清理&#xff0c;并优化了一下启动项&#xff0c;Chrome浏览器突然什么网站都无法访问了。以为更新坏了&#xff0c;但相同的网站放到火狐浏览器上&#xff0c;竟然可以打开&#xff0c;怎么回事呢&#xff1f;怎…

使用EMgu检测人脸

1,安装EMgu 在NuGet中,查找并安装EMgu 2,做人脸检测 首先,声明几个重要的类 //Thread.Sleep(3000);matImg = new Mat();capture.Retrieve(matImg, 0); frame=new Image<Bgr, byte>(matImg.Bitmap); 当,frame != null时,检测到人脸 3,给人脸画框 i…

MySQL主从分离读写复制

在高负载的生产环境里&#xff0c;把数据库进行读写分离&#xff0c;能显著提高系统的性能。下面对MySQL的进行读写分离。 试验环境 A机&#xff1a;IP:192.168.0.1 mysql版本&#xff1a;mysql-5.6.4,主数据服务器&#xff08;只写操作&#xff09; B机&#xff1a;IP:192.…

SpringMVC_执行流程

四、SpringMVC执行流程 1.SpringMVC 常用组件 DispatcherServlet&#xff1a;前端控制器&#xff0c;用于对请求和响应进行统一处理HandlerMapping&#xff1a;处理器映射器&#xff0c;根据 url/method可以去找到具体的 Handler(Controller)Handler:具体处理器&#xff08;程…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties&#xff1a;配置文件1.3 generatorConfig.xml&#xff1a;代码生成器1.4 spring-mybatis.xml &#xff1a;spring与mybatis整合的配置文件1.5 spring-context.xml &#xff1a;上下文配置文件1.6 spring-mvc-xml:…

uni-app 之 获取网络列表数据

uni-app 之 获取网络列表数据 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view v-for"(item) in caturl" :key&…

学信息系统项目管理师第4版系列05_组织通用管理

1. 流程管理 1.1. 流程是组织运行体系的框架基础&#xff0c;流程框架的质量影响和决定了整个组织运行体系的质量 1.2. 流程是指工作活动流转的过程 1.2.1. 流程可以是跨部门、跨岗位工作活动流转的过程 1.3. 业务流程是一组将输入转化为输出的相互关联或相互作用的活动 1…

NPM 常用命令(六)

1、npm explain 1.1 命令使用 npm explain <package-spec>别名: why 1.2 描述 此命令将打印导致在当前项目被其他引用包的依赖链。 如果提供了一个或多个包规范&#xff0c;则只有与其中一个说明符匹配的包才会解释它们的关系。 包规范还可以引用 ./node_modules 中…

Typescript技术分享

1、初识TypeScript TypeScript是什么&#xff1f; TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集。TypeScript 在 JavaScript 的基础上添加了可选的静态类型和基于类的面向对象编程。 2、TS类型 2.1 布尔类型(boolean) boolean类型只有两个取…

重建与发展:数字资产借贷行业朝着可持续发展迈进!

纵观历史&#xff0c;贷款和货币一样古老&#xff0c;无论哪种形式的货币都需要有其借贷市场。现在&#xff0c;比特币以其分散和透明的性质&#xff0c;在加密领域占据龙头地位。 就像之前的货币一样&#xff0c;比特币要真正蓬勃发展&#xff0c;也需要一个强大的借贷市场。然…

2023计算机毕业设计题目 毕设选题大全

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…