Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的异常检查点行为_Sql_Sql Server_Sql Server 2016_Sql Server 2017 - Fatal编程技术网

SQL Server中的异常检查点行为

SQL Server中的异常检查点行为,sql,sql-server,sql-server-2016,sql-server-2017,Sql,Sql Server,Sql Server 2016,Sql Server 2017,我希望能对SQL Server中奇怪的检查点行为的原因有一些看法 我有一个数据库,它采用简单恢复模式,从10GB开始。该数据库位于SQL Server 2017实例上,配置为间接检查点,目标恢复时间(以秒为单位)设置为60 我们在事务日志使用百分比(70%)上触发警报,这通常是在内部检查点出现时触发的。然后,随着事务日志的不断增长,我们继续收到警报,并最终注册了99%的完整性,但没有进一步增长 sys.databases中的log_reuse_wait_desc列显示活动事务是上次尝试的日志截断

我希望能对SQL Server中奇怪的检查点行为的原因有一些看法


我有一个数据库,它采用简单恢复模式,从10GB开始。该数据库位于SQL Server 2017实例上,配置为间接检查点,目标恢复时间(以秒为单位)设置为60

我们在事务日志使用百分比(70%)上触发警报,这通常是在内部检查点出现时触发的。然后,随着事务日志的不断增长,我们继续收到警报,并最终注册了99%的完整性,但没有进一步增长

sys.databases中的log_reuse_wait_desc列显示活动事务是上次尝试的日志截断失败的原因。我确认没有使用接近所有相关DMV的活动事务运行

发出检查点手动清除等待描述并截断日志

我的理论是,在上次尝试日志截断时,数据库有一个活动事务,无论是在70%的日志使用率被破坏时,还是在达到要刷新到磁盘的目标脏缓冲区之后。在这两种情况下,都有一个活动事务在该点阻止日志截断。由于最后一个检查点的活动最少,因此由于未达到脏缓冲区阈值,因此没有进一步的检查点尝试。因此,即使现在没有活动的事务日志截断,也无法在发出检查点之前进行

我打算将跟踪标志3502设置为on,以便在假定此事务正在运行时查看检查点活动

有没有人遇到过这种行为,或者知道SQL Server是否配置了回退,以便在事务日志使用率超过70%时运行检查点,即使日志继续填充


非常感谢

正如@sepupic所指出的,发出检查点的70%日志空间使用率是自动检查点的一个特征,而不是内部检查点的特征(参见对问题的评论)

这种被注意到的行为的简单原因是,当活动事务继续执行时,间接检查点会对脏页阈值违规做出响应。活动事务阻止检查点发生日志截断,因此事务日志继续增长

在最后一个间接检查点和以前的活动事务(阻止日志截断)完成之间,没有足够的脏页来触发间接检查点的发生


因此,即使在调查中未发现任何活动事务,并且通过发出手动检查点命令立即清除了日志文件使用情况,最后一个日志\u重用\u等待\u描述仍保持活动事务。

只是一些观察结果。1.>>>数据库配置为间接检查点,将target_recovery_time_in_seconds设置为60 target_recovery_time_in_seconds设置为60是SQL Server 2016中间接检查点的默认值,这正是创建数据库时使用的值。内部检查点仍然会出现在70%的可用空间中,以刷新脏页并尝试日志截断,但被活动事务满足。我觉得奇怪的是,SQL Server只会在日志百分比为70%的情况下启动一次。因为在这个特定实例中,事务完成后似乎没有足够的页面被弄脏,导致没有检查点,因此没有日志截断。目标恢复时间的默认值为0(表示60秒),恢复间隔默认值也是0(表示1分钟),但是,它们都设置为0,如果不设置,则使用自动检查点。但是,如果以秒为单位更改目标恢复时间,则会使用间接检查点。请参见此处的目标恢复时间和“恢复间隔”选项的交互:使用间接检查点时,它们基于自上次检查点以来生成的脏页数量,使用自动检查点时,它们根据自上次检查点以来生成的日志记录触发,也就是说,70%的阈值由自动检查点使用,而不是由内部检查点使用。内部检查点是dbcc checkdb/checktable(创建数据库snepshot时)、关闭时、执行完全/差异备份时使用的检查点