четверг, 1 ноября 2012 г.

Increase SCN manualy


Один из способов, но самый простой и рабочий.
SCN состоит из двух частей - 0x0000.00000000
0000 - SCN WRAP
00000000 - SCN BASE

Этот метод увеличивает часть  «SCN BASE».

Тесткейс
Для начала необходима установка параметра
SQL> alter system set "_allow_error_simulation"=TRUE scope=spfile;

System altered.

Без него этот метод не работает.
Далее необходим эвент  adjust_scn

SQL> alter system set events 'immediate trace name adjust_scn level ';

System altered.

Где n – это  1,2,3….и т д.
Каждый  уровень увеличивает SCN на 1073741824 единицы, НО отталкиваясь от текущего SCN БД.
То есть.

SQL> select to_char(dbms_flashback.get_system_change_number) from dual;

TO_CHAR(DBMS_FLASHBACK.GET_SYSTEM_CHANGE
----------------------------------------
3221225473

SQL> alter system set events 'immediate trace name adjust_scn level 1'; --попытаемся выдать меньше, чем текущий

System altered.

В алерте будет вот такое
Wed Oct 31 17:37:50 EET 2012
Errors in file /oracle/admin/prime/udump/prime_ora_3995.trc:
ORA-00600: internal error code, arguments: [2256], [0], [1073741824], [0], [3221225705], [], [], []
Wed Oct 31 17:37:52 EET 2012
OS Pid: 3995 executed alter system set events 'immediate trace name adjust_scn level 1'

У этой 600-ой  аргументы
[1073741824] – то, что мы пытаемся вставить в SCN BASE
[3221225705] – то, что там уже  есть, а учитывая что первый и третий аргумент – это SCN WRAP, то в данном случае это есть текучий SCN БД.

Соответвено, у SCN остается прежним

SQL> select to_char(dbms_flashback.get_system_change_number) from dual;

TO_CHAR(DBMS_FLASHBACK.GET_SYSTEM_CHANGE
----------------------------------------
3221225756

А если возьмем больше, то получим больше ;)

SQL> alter system set events 'immediate trace name adjust_scn level 8';

System altered.

SQL> select to_char(dbms_flashback.get_system_change_number) from dual;

TO_CHAR(DBMS_FLASHBACK.GET_SYSTEM_CHANGE
----------------------------------------
8589934594

Комментариев нет:

Отправить комментарий