小记一下前段时间看的scn head room的问题。
1. scn的最大值。scn的表示是SCN_WRAP.SCN_BASE,最大值是 ffff.ffffffff,即65535.4294967295,也就是每当scn_base到ffffffff(或者说4294967295)的时候,scn wrap翻一位。因此最大值是:65535*4294967295=281470681677825(281万亿)
2. scn head room的问题,并不是到达了scn的最大值(281万亿),而是接近或者达到了当前最大可用scn。
3. 当前最大可用scn定义,是以1988年1月1号为起点,值是1,然后以每秒递增16384(也就是16k)。得出当前最大可用的scn值。
4. 如果当前的scn(即dbms_flashback.get_system_change_number ),达到了当前最大可用scn,此时就hang了,等待下一秒新的SCN上限。
5. 安全值是当前scn,如果以每秒16k的速度增长,到当前最大可用scn需要超过62天的时间。
2012年之后的补丁或者新版本的数据库,带了3个防止dblink传播高scn的隐含参数:
1 2 3 |
_external_scn_logging_threshold_seconds-- 默认86400秒,即24小时,表示如果受到外来scn影响跳变时间超过24小时,就在alertlog记录一条告警信息。 _external_scn_rejection_delta_threshold_minutes --外来scn每分钟变化超过xx值,就拒绝。默认值为0,不拒绝 _external_scn_rejection_threshold_hours --默认值24小时,外来scn超过本地最大可用scn24小时,就拒绝。 |
11.2.0.2之后,默认每秒递增的速率是32k(即_max_reasonable_scn_rate=32768),不再是16k。可以解决上面3的问题。
SCN Compatibility问题:
打过补丁或者12c的数据库,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
set serverout on declare EFFECTIVE_AUTO_ROLLOVER_TS date; TARGET_COMPAT number; IS_ENABLED boolean; begin dbms_scn.GETSCNAUTOROLLOVERPARAMS(EFFECTIVE_AUTO_ROLLOVER_TS,TARGET_COMPAT,IS_ENABLED); dbms_output.put_line('EFFECTIVE_AUTO_ROLLOVER_TS='||to_char(EFFECTIVE_AUTO_ROLLOVER_TS,'yyyy-mm-dd hh24:mi:ss')); dbms_output.put_line('TARGET_COMPAT=' || TARGET_COMPAT); if(IS_ENABLED)then dbms_output.put_line('IS_ENABLED IS TURE'); else dbms_output.put_line('IS_ENABLED IS FALSE'); end if; end; / EFFECTIVE_AUTO_ROLLOVER_TS=2019-06-23 00:00:00 TARGET_COMPAT=3 IS_ENABLED IS TURE PL/SQL procedure successfully completed SQL> |
可以Alter Database Set SCN Compatibility 3;但是降低需要重启。注意,3是96k