哪位大侠给解析一下,阈值存储过程为什么会跳过低阈值直接执行高阈值了?
我在一个数据库上定义了若干阈值存储过程,如下:1> sp_helpthreshold
2> go
segment name free pages last chance? threshold procedure
-------------- ------------ -------------- -------------------------
logsegment 768000 0 sp_thresholdaction_second 日志空间使用空间大于40%时激活
logsegment 512000 0 sp_thresholdaction_second 日志空间使用空间大于60%时激活
logsegment 256000 0 sp_thresholdaction 日志空间使用空间大于80%时激活
logsegment 21624 1 sp_thresholdaction 日志空间使用空间大于98%时激活
两个存储过程里面都将日志dump tran了,执行后日志段应该是被清空了的。
但是我发现sp_thresholdaction经常被调用,有时候比sp_thresholdaction_second还多
这样看来,日志是不是会瞬间增大,越过40%直接到80%甚至是98%呢?
请大侠给介绍一下,日志段是怎么增大的,多谢啦 日志是不是会瞬间增大,越过40%直接到80%甚至是98%呢?
-----------------------------------------------------------------
我觉得是有可能的。 好像我也注意到类似的现象了。
假如有个大的事务,在阈值检测期间使得日志段剩余空间急剧下降低于非最终阈值的话, 有可能会跳过非最终阈值的。 自己分析了一下,应该是这样的:
由于事务的原子性,截断日志的操作会等待所有已经提交的事务执行完成后才能进行。这样会导致日志超过阈值点的情况出现。
其实阈值存储过程已经激活了,但日志不能截断而已。
更严重的情况是,若在激活阈值存储过程时,有事务A在运行,阈值存储过程会等待A完成后才生效。如果A尚未完成时,又来了一个要执行很长时间的事务B,那阈值存储过程要接着等待B,若B执行完成前又来了C...这样就会导致日志一直不能截断,最后激活最后机会阈值存储过程,此时会阻塞所有提交上来的新事务不执行,直到日志成功截断。但已经运行的任务是会等待执行完的。如果不想等待已经执行的事务执行完,可以用dump tran with no_log,这是危险的操作,不到日志满时不要执行。 能否在各个sp_thresholdaction 里面加个timestamp写audit data表跟踪一下呢?
页:
[1]