本文主要介绍 OceanBase 数据库处理一台 OBServer 上多个重叠冻结动作的机制。
在 OceanBase 数据库中,您可以通过以下几种方式触发冻结操作:
-
通过
ALTER SYSTEM MAJOR FREEZE
手动发起。
-
当增量数据写到超过
freeze_trigger_percentage
设置的阈值时,系统自动发起。
-
控制 OceanBase 数据库冻结阈值的配置项为
freeze_trigger_percentage
,默认为 70,表示当内存使用超过 70% 时会触发冻结。
-
通过设置配置项
major_freeze_duty_time
定时发起。
有关该以上配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 系统配置项 章节。
在某些场景下,可能会出现在一台 OBServer 上发起多个重叠的冻结动作。例如,系统里已经运行了手动发起的冻结,在一定时间内,增量数据超过了阈值,又触发了新的冻结请求,两个冻结请求会重叠。针对同一 OBServer 上多个重叠的冻结动作,OceanBase 数据库会遵循以下处理规则:
-
多个手动发起的冻结 ,只有完成了上一个版本的 merge 完成才能继续执行后续版本的冻结。
-
先达到
freeze_trigger_percentage
设置的阈值发起冻结,再手动发起冻结时,会在完成了上一个版本的 merge 完成才能继续执行后续版本的冻结。
-
先达到
freeze_trigger_percentage
设置的阈值发起冻结,再根据 duty_time 的设置定时发起冻结时,只会执行第一个冻结。第二个冻结会失败,并返回以下错误信息。
fail as ‘cannot do major freeze triggered by cluster self, out of version limit’
- 先手动发起冻结,再根据 duty_time 的设置定时发起冻结时,只会执行第一个冻结。第二个冻结会失败,并返回以下错误信息。
fail as ‘cannot do major freeze triggered by cluster self, out of version limit’
-
先触发由 duty_time 定时发起的冻结,再手动发起冻结时,再根据 duty_time 的设置定时发起冻结完成后,再执行手动发起的冻结。
-
注意无论由 duty_time 定时发起的冻结前后是否有冻结请求,在
rootservices.log
中都会记
录 major freeze has already been launched, no need to do again
。