咨询微信: dbservice1234 7 x 24 在线支持!

Oracle ORACDEBUG でデータベースSCNを修正する

Oracle ORACDEBUG でデータベースSCNを修正する

ORACLEデータベース によくあるエラ の解決策

プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com

 

 

1988年に、OracleがOracle V6をリリースした。このバーションに、Oracleはホットバックアップを導入した。同時に、SCN、48位ストレージの文法はコードに使えなくなった。12cまで使い続けた。(12cに八つのバイトでSCNをストレージする)。OracleのSCNは48位で表したから、最大値がは2の48乗に超えられない。
Oracleは48位のSCNが500年も使い続けるために、SCNを制約した。秒ごとにSCNの最大増速は16Kに超えられない。Oracleは1988年1月1日0点0分0秒を基準時間として、既存する秒を16Kに掛ける。つまり、既存するSCNの最大値はSCN HEADROOMである。
それで、SCN最大値の計算式は以下の通り:
(今の時間-19880101 000000)*16384–(current_scn)その中 16384はSCNの内部増速は16kで、これはコードの制約である。
この制約は11.2.0.2バーションの前に、scn の最大の伸び率は16k,在11.2.0.2版本开始,为32k。
この行は以下のようなバラメタ_max_reasonable_scn_rateによって、コントロールされる:

 

SQL> @paras
Enter value for paras: scn
old   6: AND x.ksppinm LIKE '%&paras%'
new   6: AND x.ksppinm LIKE '%scn%'
 
NAME                                               VALUE                DESCRIB
-------------------------------------------------- -------------------- ------------------------------------------------------------
。。。。。。。
_external_scn_rejection_threshold_hours            24                   Lag in hours between max allowed SCN and an external SCN
_max_reasonable_scn_rate                           32768                Max reasonable SCN rate
。。。。。
 
17 rows selected.
 
SQL> 


11.2でOracleはSCNの各秒の最大増速を16Kから32Kに増やして、SCN HEADROOMトラブルがあるシステムがその故障を別のシステムに伝えないために、しきい値も追加した。
この修正は以下のバッチに含んでいる:

scnheadroom1

もしSCNが突然増やしたら、alertに以下のようなアラームが現れる:

scnheadroom2

 

それで、以上のようなバッチを追加したら、前のバラメタでSCNを修正することができなくなった。

そして、データベースに一部の異常的なエラが現れる。SCNをふさわしい数値に変更する必要がある。例えば、一部のよくあるエラはデータベースに一部のブロックがデータベースSCNが一致していない。あるいは一部のundo$を持っているデータベースを起動するときに、失敗する:
ORA-600 [2256]
ORA-600 [2662]
ORA-600 [4000]
ORA-600 [kcsadjn1]

この前に、バラメタでSCNを修正した。例えば:
event=”10015 trace name adjust_scn level x” あるいは _minimum_giga_scn バラメタを使う。
前に言っていたとおり、前のバッチとバーションを利用したあと、使えなくなった。この場合に、以下のような方法を利用してください:
1,bbed直に修正(場合によってめんどくさくなる場合もある。例えば、修正する必要があるファイルが多い場合である)
2,ORACDEBUG で kcsgscnを修正する
3,制御ファイルを修正する
ここで、ORACDEBUG で kcsgscnを修正するという方法をテストする。
注意: 違ったENDIANとワード長と違っている。例えば、AIXではWRAP SCNが前にあって、BASE SCNが後ろにある。Linuxの場合はBASE SCNが前にあって、WRAP SCNが後ろにあるというフォーマットである。

今のデータベースのSCN

 

 

[oracle@lunar ~]$ ss
 
SQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 5 06:16:39 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
 
SQL> 
SQL> select checkpoint_change#,to_char(checkpoint_change#,'XXXXXXXXXXXXXXXXX')  from v$database;
 
CHECKPOINT_CHANGE# TO_CHAR(CHECKPOINT
------------------ ------------------
           1723797             1A4D95
 
SQL>


ここで、今のデータベースSCNが1723797で、100万を増やせば、2723797になる。




SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> select checkpoint_change#,to_char(checkpoint_change#,'XXXXXXXXXXXXXXXXX')  from v$database;
 
CHECKPOINT_CHANGE# TO_CHAR(CHECKPOINT
------------------ ------------------
           1723797             1A4D95
 
SQL>



データベースがmount状態だから、ここで見られるkcsgscn_のSCNの数値が0である。
次に2723797に修正して、計算する:


SQL> select to_char(2723797,'XXXXXXXXXXXXXXXX') from dual;
 
TO_CHAR(2723797,'
-----------------
           298FD5
 
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> oradebug poke 0x06001AE70 8 0x0000000000298FD5 
BEFORE: [06001AE70, 06001AE78) = 00000000 00000000
AFTER:  [06001AE70, 06001AE78) = 00298FD5 00000000
SQL> oradebug dumpvar sga kcsgscn_
kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00298FD5 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000
SQL> 
SQL> alter database  open;
 
Database altered.
 
SQL>  select checkpoint_change#,checkpoint_change#/1024/1024/1024 SCN_WARP  from v$database;
 
CHECKPOINT_CHANGE#   SCN_WARP
------------------ ----------
           2723798 .002536735
 
SQL> 


ここで2723797になった。