背景

数据库开启CDC功能后,每天会生成大量的历史记录,即使达到参数“每个作业的最大历史记录“的阈值后也不会被删除,导致其它作业的历史记录被删除,无法查看以前的执行情况,非常不方便。

现象

数据库开启CDC后会创建“capture”和“cleanup”两个作业,capture作业会生成大量的历史记录,而且参数“每个作业的最大历史记录”不起作用,一直不删除。

分析

首先通过跟踪定位到SQL Agent服务在执行作业时调用存储过程msdb.dbo. sp_sqlagent_log_jobhistory处理作业历史记录。查看该存储过程的定义,首先把当前运行数据插入到历史记录表中。

然后通过@step_id判断是整个作业完成的记录还是执行过程中步骤的记录,如果是作业已经完成的记录,执行存储过程msdb.dbo.sp_jobhistory_row_limiter对历史记录进行清理。

查看存储过程msdb.dbo.sp_jobhistory_row_limiter的定义,首先从注册表中获取参数“所有作业最大行数”和“每个作业最大行数”的值。

先根据参数“每个作业最大行数”判断当前作业是否超过限制,并删除旧的记录。

然后根据参数“所有作业最大行数”判断所有作业历史记录是否超过限制,并删除旧的记录。

接下来分析为什么CDC的历史记录无法删除,通过跟踪定位到捕获作业调用存储过程[sys].[sp_cdc_scan]在一个没有退出方式的循环中扫描事务日志,并调用存储过程msdb.dbo. sp_sqlagent_log_jobhistory 记录历史记录,因为传递的@step_id的值代表这是执行步骤的记录,不是作业完成的记录,因此不会触发清理日志的存储过程,导致历史记录越积累越多。

总结:

  1. capture作业一直是运行的,所以记录的都是作业步骤的日志,不会执行到清理历史记录的步骤,导致历史记录越积累越多;

  2. 其它作业执行完成清理历史记录时,因为capture作业的历史记录越积累越多,达到“所有作业最大行数”的阈值,删除所有作业旧的历史记录。capture作业运行频繁,所以保留的大都是capture作业的历史记录,其它运行不频繁的作业的历史记录被删除。

解决

方法一:创建一个新的作业,定期删除CDC的作业历史记录。

 1 CREATE PROC [dbo].[usp_gt_delete_cdc_job_history]
2 AS
3 BEGIN
4 DECLARE @job_id UNIQUEIDENTIFIER;
5
6 DECLARE cdc_job_cursor CURSOR FOR SELECT
7 job_id
8 FROM
9 msdb.dbo.cdc_jobs
10 WHERE
11 job_type = 'capture';
12
13 OPEN cdc_job_cursor;
14 FETCH NEXT FROM cdc_job_cursor INTO @job_id;
15 WHILE @@FETCH_STATUS = 0
16 BEGIN
17 EXECUTE msdb.dbo.sp_jobhistory_row_limiter @job_id;
18
19 FETCH NEXT FROM cdc_job_cursor INTO @job_id;
20 END
21
22 CLOSE cdc_job_cursor;
23 DEALLOCATE cdc_job_cursor;
24 END

方法二:到msdb中修改存储过程的定义,增加对CDC作业处理的逻辑。该方式已经反馈给微软,在SQL Server下一个版本会采用,也算对SQL Server做一点小贡献。

以下是具体的代码。

 1 ELSE
2 BEGIN
3 IF EXISTS(SELECT 1 FROM msdb.sys.tables WHERE schema_id = SCHEMA_ID('dbo') AND name = 'cdc_jobs')
4 BEGIN
5 IF EXISTS(SELECT 1 FROM msdb.dbo.cdc_jobs WHERE job_id = @job_id AND job_type = 'capture')
6 BEGIN
7 EXECUTE msdb.dbo.sp_jobhistory_row_limiter @job_id
8 END
9 END
10 END

产品&服务

SQL专家云数据库智能运维平台
Moebius数据库多活集群

数据库协作运维服务

北京格瑞趋势科技有限公司是聚焦于数据服务的高新技术企业,成立于2008年,创始团队及核心技术人员来自微软和雅虎。微软数据平台金牌合作伙伴。通过产品+服务双轮驱动的业务模式,15年间累计服务4000+客户,覆盖互联网、市政、交通、电信、医疗、教育、电力、制造业等各个领域。

CDC作业历史记录无法删除问题的更多相关文章

  1. kettle删除资源库中的转换或者作业

    在资源库中新建转换,作业都很简单,那么加入现在不需要其中某个转换或者作业该怎么办呢? 下图是已经存在的转换跟作业 现在需要删除aa这个转换 操作步骤如下: 1.工具----资源库----探索资源库 出 ...

  2. linux删除或隐藏命令历史记录history

    1.环境变量添加HISTCONTROL = ignorespace 在命令前面插入空格,这条命令会被 shell 忽略,也就意味着它不会出现在历史记录中.但是这种方法有个前提,只有在你的环境变量 HI ...

  3. Git永久删除文件和历史记录

    目录 Git永久删除文件和历史记录 使用filter-branch 添加到.gitignore文件里并push修改后的repo 清理和回收空间 Git永久删除文件和历史记录 造成你想从git存储库中永 ...

  4. 如何批量删除QQ浏览器指定历史记录和导出指定的历史记录

    QQ浏览器的历史记录只有清空历史记录和删除选中项两个功能.有时我不想删除所有的历史记录,只是想删除指定的历史记录保留对自己有用的历史记录,方便自己以后查找.但是删除选中项功能只能一项一项的选择,才能批 ...

  5. at, batch, atq, atrm - 排队、检查或删除以后要执行的作业

    总览 at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...] atq [-V] [-q 队列] [-v] atrm [-V] 作业 [作业...] b ...

  6. 每天一个linux命令(49):at命令   atrm删除作业,由作业号标识。

    atq命令 例如:从现在起三天后的下午四点运行作业at 4pm + 3 days:在July 31上午十点运行作业at 10am July 31:明天上午一点运行作业at 1am tomorrow. ...

  7. Replication--复制与CDC和镜像

    复制和CDC 都是使用logreader来从日志中读取数据的变更,然后写入到分发库(复制)或变更表中. 1> 单独创建复制发布 在该情况下,会在分发服务器上创建日志读取代理作业(ServerNa ...

  8. SQL SERVER 作业浅析

    作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Activ ...

  9. SQL Server是如何让定时作业

    如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL S ...

  10. SQL SERVER 作业(或叫执行计划)

    如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL S ...

随机推荐

  1. git push卡住了 git push writing object

    解决方案: 执行命令:$ git config --global http.postBuffer 524288000 再次push 会卡在这里:POST git-receive-pack(892384 ...

  2. python快速入门【六】----真题测试

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  3. 5.10 Windows驱动开发:摘除InlineHook内核钩子

    在笔者上一篇文章<内核层InlineHook挂钩函数>中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能 ...

  4. 使用window.print进行前端打印,批量打印,设置分页,ie、火狐下设置页眉页脚

    window.print() print() 方法用于打印当前窗口的内容.谷歌调用 print() 方法会产生一个打印预览弹框,让用户可以设置打印请求. 但谷歌貌似不能自定义设置页眉页脚的文字:ie和 ...

  5. 性能暴增70%!AMD线程撕裂者RPO 7000将于10月19日发布: 96核心Zen 4史无前例

    据wccftech最新报道,AMD的下一代Ryzen Threadripper(线程撕裂者)PRO 7000"Storm Peak"CPU将于10月19日作为终极工作站解决方案亮相 ...

  6. 【双指针】双指针算法详解两道经典OJ【力扣27,力扣26,力扣38】超详细算法教程

    [双指针]双指针算法详解两道经典OJ[力扣27,力扣26,力扣38]超详细算法教程 今天又又到了我们刷力扣题的时间啦! 今天博主给大家带来的三道题是: 27. 移除元素 26. 删除有序数组中的重复项 ...

  7. webrtc终极版(一)5分钟搭建多人实时会议系统webrtc

    webrtc终极版(一),支持https,在线部署[不是本地demo],采用RTCMultiConnection官方demo,5分钟即可搭建成功 @ 目录 webrtc终极版(一),支持https,在 ...

  8. 大数据技术之DataX

    一.DataX简介 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase.FTP等各种异构数据源之 ...

  9. CF1842

    A 比两边和的大小即可. B 显然如果一个数拥有的所有二进制位的 \(1\) 被包含在 \(x\) 中,选了一定不会导致不能变成 \(x\):如果有一个 \(1\),\(x\) 对应的位上是 \(0\ ...

  10. BZOJ3364 Distance Queries 距离咨询 题解

    原题 简化题意:有一棵 \(n\) 个点的树, \(q\) 组询问,每次询问回答两点间的距离. 令 \(dis[i][j]\) 表示 \(i\) 到 \(j\) 的距离,根节点为 \(rt\) ,则有 ...