原文檔:http://www.dbsnake.net/how_to_dirty_adjust_scn.html
Posted: August 27, 2013 | Author: Cui Hua | Filed under: Oracle | Leave a comment »
隱含參數_minimum_giga_scn在Oracle 11.2.0.2打上相關的SCN的補丁以及後續的版本中已經被廢棄:
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.1.0
Connected as SYS
SQL> select count(*) from sys.all_parameters where name like ‘_minimum_giga_scn%’;
COUNT(*)
———-
0
SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHAN
——————————
0.00187269318848848
[oracle@localhost dbs]$ cat initdb121.ora
db121.__data_transfer_cache_size=0
db121.__db_cache_size=251658240
……省略顯示部分內容
*.undo_tablespace=’UNDOTBS1′
*._minimum_giga_scn=1
SQL> startup pfile=/u01/app/oracle/product/12.1.0/dbhome_1/dbs/initdb121.ora
LRM-00101: unknown parameter name ‘_minimum_giga_scn’
ORA-01078: failure in processing system parameters
另外,經我測試,不僅_minimum_giga_scn失效了,alter session set events ’10015 trace name adjust_scn level XXX’也失效了。
我沒有采用改數據文件頭再重建控制文件的方法,因爲在ASM的環境下這種方法太麻煩了(除非是以後ODU內嵌的BBED支持批量修改文件頭)。
我採用的是把控制文件拷出來直接修改控制文件的方式,幸運的是,12cR1的控制文件中我想改的地方其offset和之前的版本比並未改變。
這裏我想把SCN調整爲1G。
修改方法爲:
1、當數據塊爲8k的時候,控制文件大小爲16k
2、找到Controlfile Checkpointed at scn,偏移量爲第一個塊的60,比如0×4060,然後具體位置在0×4060的第9至第14個byte
3、找到第一個塊的第一行,如0×4000,將offset爲15的flag由0×04改爲0×00,並同時將checksum值(offset爲16、17)全部清零。
如下是改完控制文件後的效果:
SQL> startup mount pfile=/u01/app/oracle/product/12.1.0/dbhome_1/dbs/initdb121.ora
ORACLE instance started.
Total System Global Area 438423552 bytes
Fixed Size 2289304 bytes
Variable Size 255852904 bytes
Database Buffers 176160768 bytes
Redo Buffers 4120576 bytes
Database mounted.
SQL> alter database open;
Database altered.
SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)
———————————————————-
1.00001949
這裏再補充另外一種方法,即通過oradebug修改kcsgscn_的方式也可以達到同樣的效果:
如下是Big Endian平臺kcsgscn_的顯示效果:
SQL> select to_char(dbms_flashback.get_system_change_number(),’XXXXXXXXXXXX’) from dual;
TO_CHAR(DBMS_FLASHBACK.GET_SYS
——————————
94393E2E03F
從上述顯示結果中我們可以看到,上述系統的SCN wrap爲0×0943,SCN base爲0x93E2E03F,這個顯示結果和如下用oradebug查看kcsgscn_的顯示結果一致:
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [7000000000182A0, 7000000000182D0) = 00000943 93E2E07700000000 00000000 005C3BEE 00000000 00000000 00000000 00000000 00000000 07000000 00017F80
kcsgscn_就是SCN的值,所以其值會不斷往上增長:
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [7000000000182A0, 7000000000182D0) = 00000943 93E2E0A3 00000000 00000000 005C3C08 00000000 00000000 00000000 00000000 00000000 07000000 00017F80
oradebug中可以用poke命令來修改內存,其語法爲:
“oradebug poke <address> <length> <value>” allows you to modify a given region of memory (length of memory is limited to size of scalar C types)
還是回到之前那個例子,之前我們已經通過修改控制文件的方式把SCN調成了1G,現在我們通過oradebug直接修改內存的方式把SCN從1G調整到2G。
現在系統SCN爲1G:
SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)
———————————————————-
1.00007167
SQL> select CHECKPOINT_CHANGE#/(1024*1024*1024) from v$database;
CHECKPOINT_CHANGE#/(1024*1024*1024)
———————————–
1.00007022
SQL> select to_char(CHECKPOINT_CHANGE#,’XXXXXXXXXXXX’) from v$database;
TO_CHAR(CHECK
————-
40012688
現在數據庫服務器爲Linux,是Little Endian,所以其SCN base在前,SCN wrap在後,這和如下oradebug的顯示結果一致:
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AD30, 06001AD60) = 40012D2C 00000000 00000000 00000000 00000232 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000
2G對應的16進制是0×80000000
SQL> select to_char(2*1024*1024*1024,’XXXXXXXXXXXX’) from dual;
TO_CHAR(2*1024*1024*1024,’XXXX
——————————
80000000
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 438423552 bytes
Fixed Size 2289304 bytes
Variable Size 255852904 bytes
Database Buffers 176160768 bytes
Redo Buffers 4120576 bytes
Database mounted.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AD30, 06001AD60) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000
SQL> oradebug poke 0x06001AD30 4 0×80000000
BEFORE: [06001AD30, 06001AD34) = 00000000
AFTER: [06001AD30, 06001AD34) = 80000000
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AD30, 06001AD60) = 80000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001A8D0 00000000
SQL> alter database open;
Database altered.
SQL> select dbms_flashback.get_system_change_number()/(1024*1024*1024) from dual;
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()/(1024*1024*1024)
———————————————————-
2.00000081
從上述顯示結果中我們可以看到,我們已經成功的把系統SCN從1G調到了2G。