7 x 24 在线支持!
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 '%¶s%' 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トラブルがあるシステムがその故障を別のシステムに伝えないために、しきい値も追加した。
この修正は以下のバッチに含んでいる:
もしSCNが突然増やしたら、alertに以下のようなアラームが現れる:
それで、以上のようなバッチを追加したら、前のバラメタで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になった。