适用场景:与 event 10015 类似,在数据库 mount 状态下,用于解决 SCN 相关的一致性问题。
操作步骤:在参数文件中添加或修改 _minimum_giga_scn=n ,其中 n 为要增加的 SCN 值(单位为 10 亿),然后重启数据库至 mount 状态。
注意事项:在 2012 年 1 月后的 PSU 中,由于引入了隐含参数 _external_scnrejection_threshold_hours ,导致 _minimum_giga_scn 和 10015 事件失效。
其中 1 为增进 SCN 10 亿 (1 billion) (1024 * 1024 * 1024) ,通常 Level 1 已经足够,也可根据实际情况适当调整
startup mount;
alter session set events '10015 trace name adjust_scn level 1';
其中 level 1 为增进 SCN 10 亿 (1 billion) (1024 * 1024 * 1024) ,通常 Level 1 已经足够,也可根据实际情况适当调整
recover database;
alter database open;
(1)、 gdb/dbx 直接修改内存中的值
适用场景:适用于 Linux 系统下的各种 Oracle 版本,在数据库 mount 和 open 状态下均可操作。
操作步骤:
安装 gdb 工具:如果系统未安装,可通过 yum install gdb -y 命令安装。
查看当前 SCN 值:
SQL> select current_scn, to_char(current_scn, 'XXXXXXXXXX') as scn_hex from v$database;
CURRENT_SCN SCN_HEX
----------- -----------
1375762 14FE12
目标 SCN :
select 1375762 + 1000000 as target_scn, to_char(1375762 + 1000000, 'XXXXXXXXXX') as target_hex from dual;
TARGET_SCN TARGET_HEX
---------- -----------
2375762 244052 (重点记录此值)
确定 SCN BASE 内存地址:
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug dumpvar sga kcsgscn;
kcslf kcsgscn_ [ 06001AE70, 06001AEA0) = 0014FE19 00000000 00000000 00000000 000001DB 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
输出中 06001AE70 是 SCN BASE 内存地址(重点记录此地址)。
使用 gdb 修改内存值:
[root@rac01 ~]# yum install gdb -y
[root@rac01 ~]# ps -ef | grep pmon
oracle 9404 1 0 12:09 ? 00:00:00 ora_pmon_localdb
[root@rac01 ~]$ gdb $ORACLE_HOME/bin/oracle 9404
(gdb) set *((unsigned int *) 0x000000006001AE70) = 0x244052
(gdb) quit
A debugging session is active.
Inferior 1 [process 9404] will be detached.
Quit anyway? (y or n) y
Detaching from program: /u01/app/product/11.2.0/db_1/bin/oracle, process 9404
(2)、 gdb/dbx 直接修改内存中的值
适用场景:适用于 12.2 以下版本,在数据库 OPEN 或者 MOUNT 状态都可以修改。
操作步骤:
SQL> select current_scn, to_char(current_scn, 'XXXXXXXXXX') as scn_hex from v$database;
CURRENT_SCN SCN_HEX
----------- -----------
2376909 2444CD
SQL> select 2376909 + 1000000 as target_scn, to_char(2376909 + 1000000, 'XXXXXXXXXX') as target_hex from dual;
TARGET_SCN TARGET_HEX
---------- -----------
3376909 33870D( 重点记录 )
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug dumpvar sga kcsgscn;
kcslf kcsgscn_ [ 06001AE70, 06001AEA0) = 002444D2 00000000 00000000 00000000 000005B1 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
06001AE70 此值重点记录
SQL> oradebug poke 0x06001AE70 4 0x33870D;
BEFORE: [06001AE70, 06001AE74) = 00244570
AFTER: [06001AE70, 06001AE74) = 0033870D
(3)、 使用新的 EVENT 21307096 增加 SCN 的值
适用场景:适用于 12.2 及以上版本,且数据库需要安装 21307096 补丁。
操作步骤:
修改 EVENT :在参数文件中添加 event="21307096 trace name context forever, level 3" ,其中 level 的值表示 SCN 的增量,范围是 1 到 4095 ,增量计算公式为 lowest_scn + event level * 1000000 。例如,如果数据库中最低的数据文件检查点 SCN 为 990396 ,最高为 992660 ,则 SCN delta 为 1 ,由 (992660 - 990396) / 1000000 计算得出 。
关库,使用更改后的 pfile 启动
SQL> recover database using backup controlfile until cancel;
SQL> alter database open resetlogs;
SQL> select current_scn from v$database;
注意事项:此方法不是直接修改 SCN 的值,而是通过数据库自动增加的机制来实现 SCN 的增加,每秒增加 16K ,如果 LEVEL 设置很大,那么数据库 open 的时间就会很长。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30310891/viewspace-3110293/ ,如需转载,请注明出处,否则将追究法律责任。