解决简单恢复模式下产生的日志增长

解决简单恢复模式下产生的日志增长

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

简介

  最近测试服务器进行数据归档,其间程序员发现一个问题,空间不足,我查看原因发现日志文件暴涨。然后将数据库改为简单恢复模式,但是依然存在这个问题。经过查询资料发现了日志文件在简单模式下依然增加的原因。

Simple概念

  Simple恢复模式也叫做”Checkpoint with truncate log“,其实这个名字更形象,在Simple模式下,SQL Server会在每次checkpoint或backup之后自动截断log,也就是丢弃所有的闲置日志记录,仅保留用于实例启动时自动发生的instance recovery所需的少量log,这样做的好处是log文件非常小,不需要DBA去维护、备份log,但坏处也是显而易见的,就是一旦数据库出现异常,需要恢复时,最多只能恢复到上一次的备份,无法恢复到最近可用状态,因为log丢失了。

Checkpoint

  CheckPoint和lazyWriter一样,都会将缓冲区内脏数据写入到磁盘,同时在简单恢复模式下截断日志;lazyWriter缓存不足的时候会触发执行,这里我们暂且不做讨论。

针对CheckPoint我请教了Careyson以后总结出以下几个触发其执行的原因:

  1. 一些Internal CheckPoint时,比如说关闭数据库实例等。
  2. 数据库完整备份或差异备份(日志备份不会触发checkpoint)。
  3. 数据库恢复模式为简单恢复模式下当日志文件使用超过70%时。
  4. CheckPoint执行的时间间隔阈值被足够多的日志记录超过。
  5. 手动执行CheckPoint。

场景描述:

  Simple模式主要用于非critical的业务,比如开发库和测试库,那么这次由于测试环境的磁盘紧张我们也都采用了简单模式。但是数据归档发生时依然产生了大量的日志,并且增加了磁盘占用,这又是什么原因那?因为我们在归档处理中使用了大量的insert和delete以及update操作,这样话,短时间内产生了大量的日志,这个时候日志迅速增加;又因为在SQL Server中,CheckPoint是一个完整的过程,这个过程的耗时取决于脏数据的大小。一旦在很短时间内,日志的CheckPoint没完成的时候日志增加超过了日志的规定上限。则将产生更多的日志。

  如上所述,产生这个问题的原因就是:CheckPoint时间间隔阈值被足够多的日志记录超过,触发CheckPoint才写入磁盘。

  下面这个实例来自于:

      http://sqlblog.com/blogs/linchi_shea/archive/2009/04/12/a-race-condition-in-the-simple-recovery-mode-why-is-my-log-autogrowing.aspx

    让我们用一个脚本来实际的阐明这种行为。首先在一个测试数据库中运行一下脚本创建一个测试表并填充一些数据。

  测试数据库设置:

  1.设置为简单的恢复模式。

  2.日志的大小为100M。

  3.日志文件的自动增长被禁用(因为观察日志空间被用完的错误比检查自动增长要容易)。

复制代码
–创建表并初始化数据
create table test(i int, c char(1000))
go
declare @i int 
set @i = 1
while @i < 10000     –插入9999条测试数据
begin          
  insert test values(@iabc)          
  set @i = @i + 1      
end
复制代码

   运行以下脚本,观察资源竞争:

复制代码

set nocount on go
declare @change_size int
set @change_size = 100  根据需要来调整这个值
declare @i int
set @i = 1
while @i < 100      
begin           
if @i % 2 = 0             
   update test set c = replicate(a@change_size)            
else               
  update test set c = replicate(b@change_size)                       
select @i = @i + 1       
end

复制代码

 反复根据修改@change_size来看结果,当我将@change_size改为120甚至更大时,得到了9002的错误信息,非常准确的告诉我数据库的事务日志已满。

通过上面这个引用的例子,很好地再现了问题的产生机制,那么我们怎么处理这个情况那?

解决

  方案1:

  强制执行CheckPoint。但是执行后有个很不好的影响,严重影响了存储过程的执行时间。由此可知这样做很消耗性能啊。

  方案2:

  缩短CheckPoint时间间隔阈值。

<span>解决简单恢复模式下产生的日志增长</span>

 默认值是0,意味着由SQL Server来管理这个回复间隔。   

 也可以SQL语句实现这个功能:

<span>解决简单恢复模式下产生的日志增长</span>

  方案3:

  增大日志文件大小。

总结:

  日志文件是一个双刃剑,WAL机制很好的保证了数据的一致性和维护性。但是也产生了额外的性能和维护的成本的上升。需要我们根据实际情况去处理这些不同的情景。需要注意的是在TempDB中是不会产生日志的,除非手动执行。除此之外,并非所有的时间间隔后都会产生日志,因为当数据很少的时候有可能不触发Checkpoint执行。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119622.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月28日 上午8:00
下一篇 2021年11月28日 上午9:00


相关推荐

  • svn如何删除当前账号,重新登录

    svn如何删除当前账号,重新登录

    2021年7月17日
    107
  • 高斯滤波器理解

    高斯滤波器理解高斯滤波器是空间滤波器的一种 学习高斯滤波器 需要空间滤波的知识作为先验知识 各种数字图像处理的书中都有介绍 冈萨雷斯的经典教材说的还是比较清楚的 建议看英文版 个人感觉比翻译过来的更容易理解 高斯滤波的模板是用高斯公式计算出来的 下面是一维和二维高斯分布函数及其函数图像 一维高斯分布函数 二维高斯分布函数 它们的图像分别为 那么高斯滤波模板是怎么生成的呢 是通过二维高斯函数计算出来的 例如 我们假设一个高斯模板的长 宽均为 5 方差为 0 5 那么首先 我们要在模板上建立一个坐标系 其原点

    2026年3月18日
    2
  • SQL server 2008 r2 安装教程[通俗易懂]

    SQL server 2008 r2 安装教程[通俗易懂]1、下载sqlserver2008r2的安装包(如果需要安装包可以私我,密钥自动输入)2、打开安装包,点击setup.exe3、点击“安装”,下一步选择“全新安装或向现有的安装添加功能”4、检测完成后点击确定5、选择输入产品密钥,这里会自动输入,下一步6、选择“我接受许可条款”,下一步7、选择“安装”8、检测无误后,点击“下一步”9、选择”SQLserver功能安装“,点击”下一步“10、这里全选,我这里选择的是默认路径c盘的,也可以选择放在其他目录下。点击”下一步

    2022年6月23日
    115
  • lodash的使用

    lodash的使用lodash 是一套工具库 内部封装了很多字符串 数组 对象等常见数据类型的处理函数 1 lodash 的引用 lodash 的引用 nbsp import from lodash 常规数组遍历 agent forEach function n key nbsp nbsp nbsp agent key agent id agent key agent name nbsp nbsp nbsp returnage

    2026年3月18日
    3
  • 状态机编程_vivado状态机

    状态机编程_vivado状态机给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润,你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。输入格式第一行包含整数 N 和 k,表示数组的长度以及你可以完成的最大交易数量。第二行包含 N 个不超过 10000 的正整数,表示完整的数组。输出格式输出一个整数,表示最大利润。数据范围1≤N≤105,1≤k≤100输入样例1:3 22

    2022年8月8日
    9
  • 〖EXP〗NSA MS17010永恒之蓝一键工具

    〖EXP〗NSA MS17010永恒之蓝一键工具漏洞简介永恒之蓝是指2017年4月14日晚,黑客团体ShadowBrokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。5月12日,不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。漏洞检测无损检测,不会对目标造成任何危害,大家无需担心Ladon192.168.1.8MS1701

    2022年4月27日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号