Edited at

オラクルデータベースのデータベース・リンクが2019年6月23日以降に機能しなくなる?


■ 要約


データベース・リンク(dblink接続)が2019年6月23日以降に失敗する可能性があります。

そのために、古いバージョンのOracleデータベースでデータベース・リンクを使用している場合はパッチ適用が必要な場合があります。

※古いバージョンとは、

10g リリース 2 (10.2.0.5 以下)

11g リリース 1 (11.1.0.7 以下)

11g リリース 2 (11.2.0.3 以下)

12c リリース 1 (12.1.0.1)

パッチ適用を行わないと、

これらの古いバージョンのデータベースから新しい(またはパッチが適用された)バージョンのデータベースへのデータベース・リンク(dblink接続)が2019年6月23日以降に失敗する可能性があります。

※新しいバージョンとは、

11g リリース 2 (11.2.0.4)

12c リリース 1 (12.1.0.2)

12c リリース 2 (12.2.0.1)

18c

19c

※パッチとは、

サポートの DOC に説明があります。

Oracle Database 12.1.0.1 および 11.2.0.3 以下のリリースに対する推奨パッチと、2019年6月までに実施いただきたい対策について (ドキュメントID 2378443.1)


問題が発生する可能性があるのは、古いバージョンのデータベースと新しい(またはパッチが適用された)バージョンのデータベースを接続するデータベース・リンクであり、2つの古いバージョンのデータベースを接続するデータベース・リンクではこの問題は発生しません。

発生条件に合致するバージョン同士の組み合わせであっても、2019年6月23日後のデータベース・リンク利用時に、即時に使用不能になることはありません。

2019年6月以降の任意の時点でエラーが発生する可能性があるということです。


データベースクライアントとデータベースサーバーとの相互運用性には影響ありません。

16K/秒を超えるトランザクション(SCN増加)を発生させ続ける高負荷データベース以外では、運用を続けても、事象が発生しない可能性が高いと考えられます。


約16K/秒以上のトランザクション(SCN増加)が発生する可能性があるかどうかで、以下のようにご判断できると考えられます。


・発生する可能性がある

将来的に本事象が発生する可能性があるため、該当パッチの適用やバージョンアップを推奨します。

もしくは、データベースリンクの不使用を検討ください。


・発生する可能性がない

本事象が発生する可能性は極めて低いため、対応を見送ることも可能と思われます。

ただし安全の為に定期的なCurrent SCNの状況確認の実施を推奨します。

定期的に確認することで、予兆の検知と早期対処が可能となります。

SQL> select version, to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') DATE_TIME,

2 dbms_flashback.get_system_change_number current_scn

3 from v$instance;


■ 詳細


1)SCN(System Change Number)基本

SCNはある時点におけるデータベースのコミットされたバージョンを定義するスタンプです。

Oracleでは、すべてのコミットされたトランザクションに一意なSCNを割り当てます。

SCNの値は、データベースが更新された論理的な時点をあらわし、この値はデータベースに対する変更を記録するためにOracleによって利用されます。

SCNはCOMMITするたびに増加する正の整数値であり、時刻には依存していません。

よって、SCN -> 時刻、時刻 -> SCN への変換は行うことができません。

(DB起動中には、現在のSCNが5分毎に SMON_SCN_TIME表にその時刻のSCN情報が1行ずつアップデートされています。)


2)SCN(System Change Number)詳細

SCNは6バイト(48ビット)の数値で最大値は 281,474,976,710,656 であり、SCN_BASEとSCN_WRAP の2つの要素でもあらわされます。

SCN_BASEは4バイト(32ビット)、SCN_WRAPは2バイト(16ビット)の数値で、SCN_BASEがその最大値(2の32乗 = 4294967296)に達すると、SCN_WRAPが1つ増加し、SCN_BASEは0にリセットされます。SCN_WRAPがその最大値(2の16乗 = 65536)に達するまで、これが繰り返されます。

また、12.2以降のリリースで compatibleが12.2以上に設定されている場合は、SCNは8バイトに拡張されています。


3)データベース・リンクとは

データベース・リンクとは、異なるDB間で接続を確立し、他DB内のデータ参照や更新を 行う機能 であり、他のデータベース上の表への直接アクセス(select、delete、update)できます。

リモートマテリアライズド・ビュー(Mview) でもデータベース・リンクを使用しています。


4)SCN(System Change Number)はデータベース・リンク間のデータベースで同じ値に引き上げられる動作をする

データベース・リンク経由でアクセスされるデータベース間では、以下のタイミングで SCN の同期が行われ、SCN の小さいデータベースが SCN の大きいデータベースと同じ値に引き上げられる動作が行われます。

・ リモート問合せの最初と最後

・ リモート・トランザクションの最初と最後

・ データベース・リンクの接続が確立される時

データベース間で比較し、バージョンや接続元・接続先に関わらず、大きいSCNの値に同期するところがポイントです。


5)SCNに対して現行で使用できる上限値

現行で使用できるSCN値の上限値というのがあり、1988年1月1日から経過秒数毎に16,384(16K /秒)という増加率(SCNレート)で値が増加 していくようです。

そして、データベースの Current SCN は、システムのトランザクション(COMMIT)数に応じて増加していきますが、この上限値を超えることはできないようです。

これは、データベースの現在の最大SCN制限として知られています。

こうすることで、Oracle DatabaseはSCNを長期間にわたって配給し、バージョン12.2.0.1以下を使用しているすべてのOracle Databaseで500年以上のデータ処理が可能になります。

12.2.0.1から互換性を12.2に設定した場合は、SCNが96K /秒の速度で消費されても、Oracle Databaseでは300万年近くのデータ処理が可能になるようです。

今回のパッチは、データベースのこの最大SCN制限を増加させて、12.2.0.1と同じにするようです。

※ 実装においてはオラクル社非公開の部分もある為、実際とは異なる可能性もあります。


6)発生する可能性のある事象

特定のパッチが適用済みのデータベースでは、2019年6月23日以降、最大SCN制限の増加率である 「SCNレート」が従来の16K/秒 から高い96K/秒 SCNレートへ自動で切り替わりるようです。

そのため、Current SCNの値が従来SCNレート以上に増加したパッチ適用済みのデータベースと、従来SCN レートのデータベースとで データベース・リンク を行うと、両方のデータベースの Cuttent SCN を同期させる必要があるために、従来SCNレートで動作しているデータベース側の最大SCN制限を Cuttent SCN が超えてしまう場合もあります。

そうなることにより、エラーが発生し処理が失敗する可能性があります。

※ 実装においてはオラクル社非公開の部分もある為、実際とは異なる可能性もあります。


7)ご参考までに、

11.2.0.4 では、次のような隠しパラメータがありました。

PARAMETER                                                    DESCRIPTION                                                VALUE

----------------------------------------------------------- --------------------------------------------------------- ----------------------
_external_scn_rejection_threshold_hours Lag in hours between max allowed SCN and an external SCN 24
_max_reasonable_scn_rate Max reasonable SCN rate 32768
_bug19777862_c3_external_scn_rejection_threshold_hours Lag in hours between max allowed SCN and an external SCN 4464
_bug19777862_low_scn_headroom_warning_threshold_days low SCN headroom warning threshold in days 90

以上