Gubuntu 发表于 2010-11-19 12:03

哪位大侠给解析一下,阈值存储过程为什么会跳过低阈值直接执行高阈值了?

我在一个数据库上定义了若干阈值存储过程,如下:

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%呢?

请大侠给介绍一下,日志段是怎么增大的,多谢啦

andkylee 发表于 2010-11-19 13:15

日志是不是会瞬间增大,越过40%直接到80%甚至是98%呢?



-----------------------------------------------------------------

我觉得是有可能的。 好像我也注意到类似的现象了。

假如有个大的事务,在阈值检测期间使得日志段剩余空间急剧下降低于非最终阈值的话, 有可能会跳过非最终阈值的。

Gubuntu 发表于 2011-10-17 15:34

自己分析了一下,应该是这样的:
由于事务的原子性,截断日志的操作会等待所有已经提交的事务执行完成后才能进行。这样会导致日志超过阈值点的情况出现。
其实阈值存储过程已经激活了,但日志不能截断而已。

更严重的情况是,若在激活阈值存储过程时,有事务A在运行,阈值存储过程会等待A完成后才生效。如果A尚未完成时,又来了一个要执行很长时间的事务B,那阈值存储过程要接着等待B,若B执行完成前又来了C...这样就会导致日志一直不能截断,最后激活最后机会阈值存储过程,此时会阻塞所有提交上来的新事务不执行,直到日志成功截断。但已经运行的任务是会等待执行完的。如果不想等待已经执行的事务执行完,可以用dump tran with no_log,这是危险的操作,不到日志满时不要执行。

Eisen 发表于 2011-10-17 16:32

能否在各个sp_thresholdaction 里面加个timestamp写audit data表跟踪一下呢?
页: [1]
查看完整版本: 哪位大侠给解析一下,阈值存储过程为什么会跳过低阈值直接执行高阈值了?