入門 - 日本オラクル

OPS for NT 入門
日本オラクル株式会社
1998年2月18日
1
(注) この資料はOracle8.0を想定して記述しております。
1
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
2
シングルインスタンス構成
インスタンス
SGA
LGWR
DBWR
・・・
データベース
REDOログファイル
データファイル
制御ファイル
OPSの動きを説明する前に、通常のシングルノードでのOracleデータベー
スはどのような構成になっているのかを説明致します。
Oarcleデータベースは「インスタンス」と「データベース」から構成されます。
「インスタンス」はSGA(*1)と呼ばれるメモリー領域とLGWRやDBWRといった
バックグラウンドプロセス群から構成されています。
「データベース」はディスクに保存されたデータファイル・制御ファイ
ル・REDOログファイルといった複数の物理ファイルから構成されています。
*1 SGA ( System Grobal Area )
<参考>
Oracle_SID というのはインスタンス名を表わし、初期化パラメータにある
db_nameがデータベース名を表わします。
3
パラレルサーバの構成
インスタンス1
インスタンス2
SGA
LGWR
DBWR
SGA
・・・
DBWR LGWR
・・・
データベース
REDOログファイル
REDOログファイル
データファイル
制御ファイル
共有ディスク(RAWデバイス)
上の図はOPSの構成図になります。
OPSの特徴は以下のものが挙げられます。
・ Oracleインスタンスは、各ノード上で動作する。
・ 各々のインスタンスは、独立したSGAおよびバックグラウンドプロセス群
を所有する。
・ 全てのインスタンスが同じデータファイルと制御ファイルを共有する。
・ 各インスタンスは、独自のREDOログファイルの1セットを持ち、それに対
して書き込みを行う。
・ 全てのインスタンスで、同一のデータベースに同時にトランザクションを
実行でき、各インスタンスでは、複数のユーザーが同時にトランザクション
を実行できる。
・ 単一ノードのOracle同様、行レベルロックが保持される。
・ データベースはRAWデバイス上に置かなければいけない(*1)
*1 これは、「異なるノード間で同じファイルシステムをマウントすることはで
きない」という理由からです。
4
OPSの構成
クライアント
Oracle RDBMS
Oracle Parallel Server
初期化パラメータファイル
Oracle RDBMS
Oracle Parallel Server
初期化パラメータファイル
ハートビート
共有ディスク(RAW
)
共有ディスク(RAW)
ローカルDISK
ローカルDISK
DB-A
データベースファイル
制御ファイル
REDOログファイル
5
5
OPS for NT サービスの実装
異なるインスタンス
クライアント
・ OracleServiceOPS1
・ OracleServiceOPS2
・ OracleTNSListner80
・ OracleTNSListner80
・ OracleAgent80
・ OracleAgent80
OPS2
OPS1
ハートビート
共有ディスク(RAW
)
共有ディスク(RAW)
OPS
同じデータベース
6
6
OPS for NT サービスの実装
クライアント
・ OracleServiceOPS1
・ OracleServiceOPS2
・ OracleTNSListner
・ OracleTNSListner
・ OracleAgent80
・ OracleAgent80
OPS2
ハートビート
共有ディスク(RAW
)
共有ディスク(RAW)
OPS
同じデータベース
7
7
Oracle Parallel Server アーキテクチャ
ユーザー
Oracle クラスタ
ポーティング
インタフェース
ユーザー
Applications
Applications
Oracle DBMS
+
Parallel Server
Oracle DBMS
+
Parallel Server
OSDレイヤ
OSDレイヤ
Windows NT 4.0
高速インターコネクト
ハートビート
OSDレイヤ
OSDレイヤ
Windows NT 4.0
共有ディスク (RAWデバイス)
RAWデバイス)
8
OSDレイヤ
CM
CM
IPC
IO
Start
P&M
IPC
IO
Start
P&M
OSレベルでクラスタの各ノードを監視
ノード間通信に利用
全てのノードから共有ディスクへの同時アクセスを実現
OPSコンポーネントの起動順序を定義
Oracle Enterprise Manager (OEM) など、管理ツール
及びパフォーマンス監視ツールを利用可能にする
9
9
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
10
RAWデバイスの設定
空き領域
拡張パーティション
論理ドライブ
フォーマット
NTFS / FAT
RAWパーティション
この状態のものを使う
ファイルフォーマットしていない
のでOSから認識できない
11
RAWデバイスの設定は、ディスクアドミニストレータで行います。
RAWパーティションは、ディスクアドミニストレータ上で拡張パーティションを
作成し、それにフォーマットを全く適用しない状態で論理ドライブを割り当て
た時に作成されます。
11
RAWデバイスの設定
RAWパーティション
…
共有ディスク
ローカルディスク
12
この図の場合、ディスク2がローカルディスク、ディスク0,1が共有ディスクと
なっています。
12
RAWパーティションへのアクセス
2.アクセス時はシンボリックリンク名にアクセスする
OPS_LOG1T1
シンボリックリンク名
1. RAWパーティションとシンボリックリンク名をリンク付ける
13
13
WindowsNT における論理ドライブの命名規則
\Device\HarddiskX\PartitionY
X 物理ドライブ番号
Y 論理ドライブ番号
\Device\Harddisk0\Partition1
14
WindowsNTの場合、論理ドライブは\Device\HarddiskX\PartitionY として定
義されます。
XとYはそれぞれ「ディスクアドミニストレータ」ウィンドウに示されている物理
ドライブ番号と論理ドライブ番号です。
共有ディスク(ディスク0)上で左から1番目の論理ドライブは
\Device\Harddisk0\Parririon1
と定義されます。
(Diskの番号は0からPartitionの番号は1から始まることにご注意下さい*1)
*1 Partition0はディスク全体を表わすという特別な意味を持っています
14
SETLINKS ユーティリティ(1)
RAWパーティションとシンボリックリンク名をリンク付ける
C:\> SETLINKS /F: OPS_log1t1
OPS_LOG1t1
\Device\Harddisk0Partition1
シンボリックリンク名
15
OPSではRAWデバイスへのアクセスは論理ドライブに直接アクセスするの
ではなく、シンボリックリンクを通じて行います。
そのためには、シンボリックリンク名と論理ドライブを関連付ける必要があり
ますが、そのためのユーティリティとしてOPSはSETLINKSユーティリティを
用意しています。
15
SETLINKS ユーティリティ(2)
OPS_log1t1
OPS_log2t1
OPS_sys01
…
\Device\Harddisk0Partition1
\Device\Harddisk0Partition2
\Device\Harddisk1Partition1
…
ORALINK1.TBL
C:\> SETLINKS /F : ORALINK1.TBL
OPS_log1t1
OPS_log2t1
OPS_sys01
16
図上にORALINK1.TBL(*1)というテーブルファイルがありますが、このような
シンボリック名と論理ドライブとの関連を記述したテーブルファイルを作成し、
SETLINKS /F:テーブルファイル
と実行することにより、シンボリックリンク名と論理ドライブを関連付ける事
ができます。 (この作業は両ノードで行う必要があります)
*1 OPSはこのようなテーブルファイルのひな形を用意していますので、この
ひな形を修正することにより簡単にテーブルファイルを作成することができ
ます。
16
アクセス例
create database ops
controlfile reuse
logfile '\\.\OPS_log1t1' size 20M reuse,
'\\.\OPS_log2t1' size 20M reuse
datafile '\\.\OPS_sys01' size 30M reuse
character set JA16SJIS;
\\.\シンボリックリンク名
自ノードを表わす
17
17
RAWデバイスのバックアップ
RAWデバイス → NTFS
OCOPY80 \\.\OPS_USER01
D:\backup\user01
シンボリックリンク名
を使用
NTFS → RAWデバイス
OCOPY80 D:\backup\user01
\\.\OPS_USER01
18
RAWデバイスはWindowsNTから認識できない ( WindowsNTエクスプローラ
から見えない ) ので、通常のCOPYコマンドを使用することができません。
そのため、Oracle8でRAWデバイスをバックアップするにはオラクルが提供
しているOCOPY80コマンドを使用する必要があります。
このコマンドは、RAWデバイスをWindowsNTが認識できるファイルにコピー
するコマンドです。
18
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
19
クライアントからの接続
OPSへの接続は基本的には以下の3つ
・ 明示的な接続
・ Net8の Listner Load Balancing を利用した接続
・ アプリケーション・フェール・オーバでの接続
20
明示的な接続
ノード1
ノード2
どちらのノードに接続するか明示的に指定
共有ディスク
21
OPSの場合、クライアントからサーバへの接続する時には、「明示的にサー
バを指定する」というのが基本的な考え方です。
あるサーバがダウンした時には、そのサーバに接続していたクライアントに
エラーメッセージが返されます。そのクライアントが、システムに再接続した
ければ、稼動しているサーバに明示的に接続し直す必要があります。
21
Listener Load Balancing ( Net2.3~ )
ノード1
ListenerOPS1
InstanceOPS1
ノード2
ランダム
ListenerOPS2
InstanceOPS2
22
OPSの接続のやり方には、SQL*Net のListener Load Balancing(LLB)機能
を使用する方法があります。
LLBは、1つの接続文字列に「リスナーとインスタンス」のセットを複数設定し
ます。この設定により、1つの接続文字列から複数の「リスナーとインスタン
ス」に接続がばらけることにより、Load Balancing つまり負荷分散を実現し
ます。
22
Listener Load Balancing ( Net2.3~ )
DESCRIPTION_LIST句を書く事により
DESCRIPTION句を複数設定可能
tnsnames.ora
ops.world = ( DESCRIPTION_LIST =
(DESCRIPTION =
ADDRESS = (PROTOCOL = tcp) (HOST = OPS1) (PORT = 1521))
(CONNECT_DATA = (SID = ops1)))
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp) (HOST = OPS2) (PORT = 1521))
(CONNECT_DATA = (SID = ops2))))
ここで設定したアドレスにランダムに接続しにいく
23
Listener Load Balancing ( Net2.3~ )
ノード1
ListenerOPS1
InstanceOPS1
ノード2
ListenerOPS2
InstanceOPS2
既にダウンしているリスナーに接続しに行く時にはクライアントに
エラーメッセージが返らずに、自動的に稼動ノードに接続できる
24
LLBは、リスナーが落ちている場合、そのリスナーに接続しようとしますが、
リスナーとのコンタクトに失敗した場合は、クライアントにエラーメッセージを
返さずに、他の リスナーに接続することができます。
24
Listener Load Balancing ( Net2.3~ )
ノード1
ListenerOPS1
InstanceOPS1
ORA-12203
ノード2
ListenerOPS2
InstanceOPS2
インスタンスがダウンしている時にはクライアントにエラーメッセージ
が返ってしまい稼動ノードにつながらない。
25
LLBは 「インスタンスが落ちていてリスナーが稼動している」 状態のリスナー
には接続しに行き、インスタンスが落ちているので
ORA-12203 などの
エラーメッセージを返します。
ORA-12203
TNS: 宛先に接続できません
25
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
26
OPSCTLユーティリティ
SVRMGR
ノード1
1.tnsnames.oraからOPSノード
の情報を取得
tnsnames.ora
OPSCTL
SVRMGR
ノード2
2.各ノードのSVRMGRをキック。
インスタンスの起動・停止を行う
SVRMGR
ノード3
27
OPSCTLはクラスタ内の全てのインスタンスに関する情報をTNSNAMES.ORAから取得しま
す。次にそのノード上のOPSCTLはNet8を通じて、他のノードと交信を行います。
<コマンド例>
全てのインスタンスを起動
OPSCTL START -Cinternal/password -Ndatabase_name
個々のインスタンスの起動
OPSCTL START -Isid -Cinternal/password -Ndatabase_name
全てのインスタンスの停止
OPSCTL STOP -Cinternal/password -Ndatabase_name
個々のインスタンスの停止
OPSCTL STOP -Isid -Cinternal/password -Ndatabase_name
<設定上の注意点>
・ インスタンスの各SIDが、OPS内で重複していないこと。
・ OPSCTLユーティリティが実行されているノード上のTNSNAME.ORAファイルに各イン
スタンスのエントリが含まれていること。
・ 全てのインスタンスのINIT_COM.ORAおよびINITSID.ORAが
ORACLE_HOME\DATABASAE(7.3.4の場合はORACLE_HOME\OPS ) ディレクトリ
にあること。
27
OEMからのOPSの管理
OEM コンソール
Agent
OPSCTL
ノード1
Agent
OPSCTL
ノード2
Agent
OPSCTL
ノード3
28
OPSCTLユーティリティを、OEMコンソールからコールすることも可能です。
( OSDにP&M モジュールが含まれていることが前提です)
OPSCTLがOEMコンソールによってコールされると、OPSCTLとの通信には
1つのノードだけのIntelligentAgentが使われます。
次にそのノード上のOPSCTLはNet8を通じて、他のノードと交信を行います。
28
手動による起動・停止
29
OEM利用すると、OPS全体とOPS個々のインスタンスの起動・停止が実現
できます。
<OPS全体の起動>
ナビゲータウィンドウからOPSを右クリック 。起動を選択。
→ 起動画面で「選択したインスタンスのみ」をチェックしない
<OPS各インスタンスの起動>
ナビゲータウィンドウからOPSを右クリック 。起動を選択。
→ 起動画面で「選択したインスタンスのみ」をチェック
→ 「インスタンスの選択」ボタンをクリック
→ 起動したいインスタンスを選択
<OPS全体の停止><OPS各インスタンスの停止>についても、停止を選択す
ることにより同様のやり方で行うことができます。
29
OPSに対するジョブの発行
30
OEMはOPS全体とOPSの各インスタンスに対してジョブの発行を行うことが
できます。
OPSに対してのジョブを作成するには、ジョブ作成画面の「宛先のタイプ」か
らパラレルサーバを選択します。すると「使用可能な宛先」に検出されてい
るOPSサービスが表示されますので、そこで適当なOPSサービスを選択す
ることにより、ジョブを作成することができます。
また、OPSの各インスタンスに対してのジョブを作成するには、ジョブ作成
画面の「宛先のタイプ」からパラレルサーバインスタンスを選択します。する
と「使用可能な宛先」に検出されているOPSの各インスタンスが表示されま
すので、そこで適当なインスタンスを選択することにより、ジョブを作成する
ことができます
30
OPS用イベントの作成
31
OEMはOPSの各インスタンスに対してのイベントを作成し、それらのイベン
トの監視を行うことができます。
OPSの各インスタンスに対してのイベントを作成するには、「イベントセット
の作成」画面の 「サービスタイプ」で 「Parallel Server Instance 」を選択しま
す。すると「使用可能な宛先」に検出されているOPSインスタンスが表示さ
れますので、そこで適当なOPSインスタンスを選択することにより、イベント
を作成することができます。
31
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
32
アーカイブログ運用の注意点
• アーカイブログファイルはRAWデバイス上に
は置けない
• LOG_ARCHIVE_FORMATにはログ順序番号とスレッ
ド番号を指定する
• リカバリ時にはリカバリセッションによって
読み込めなければいけない
33
OPSでアーカイブ運用を行う場合にはいくつか注意点が必要です。
まず、一番気を付けなければならないのが、アーカイブログファイルはRAW
デバイス上には置けない。という事です。これはアーカイブログファイルは
Oracleが動的に名前を付けて生成するという性質を持っているからです。
また、アーカイブファイルのフォーマットですが、通常のシングルインスタン
スで指定している 「ログ順序番号」 に加え、インスタンスを識別するスレッ
ド番号を指定します。
例) LOG_ARCHIVE_FORMAT = LOG%s_%t.ARC
さらに、アーカイブ運用 ( REDOログからアーカイブログにCOPYを行ってい
る )時には、各ノードのローカルディスク等にアーカイブファイルを置きます
が、リカバリを行う時には、リカバリセッションが認識できるディレクトリ
(LOG_ARCHIVE_DEST)上にアーカイブログがなければなりません。
33
アーカイブ運用構成例
ノード1
ノード2
ローカルデイスク
ローカルデイスク
アーカイブ
ログファイル
アーカイブ
ログファイル
REDOログファイル
データファイル
共有DISK(RAW)
REDOログファイル
34
34
アジェンダ
OPS for NTの基礎知識
– OPS for NT アーキテクチャ
– RAWデバイスの設定とアクセス方法
– クライアントからの接続
– OPS for NT の管理
– アーカイブログ運用
OPS for NT 耐障害テスト結果
35
Oracleを起動する前の最終チェック
ユーザー
Applications
Oracle DBMS
+
Parallel Server
Oracle クラスタ
ポーティング
インタフェース
OSDレイヤ
OSDレイヤ
Windows NT 4.0
ユーザー
この階層できちんと
クラスタ構成が確立
していること !!
Applications
Oracle DBMS
+
Parallel Server
OSDレイヤ
OSDレイヤ
Windows NT 4.0
共有ディスク (RAWデバイス)
RAWデバイス)
36
DLM.LOG
• Oracleの下の階層できちんとクラスタ構成が出来て
いるかを確認する事
• dlm の Reconfigurationが行われたノード数を意識す
る (すべてのノードで同じ時間に同じノード数になっ
ている)
• 問題が判明するまでサービス・インスタンスの状態
をかえない
DLM.LOG
14:23:43-00196-00142- Reconfiguration started: Thu Mar 05 14:23:43 1998
14:23:43-00196-00142- List of ノードs: 0,
14:23:43-001f4-00142- Reconfiguration complete: Thu Mar 05 14:23:43 1998
14:25:02-0034b-00142- Reconfiguration started: Thu Mar 05 14:25:02 1998
14:25:02-0034b-00142- List of ノードs: 0,1,
14:25:07-002ce-00142- Reconfiguration complete: Thu Mar 05 14:25:07 1998
37
dlm.logをチェックすることにより、クラスタ構成の状態を把握することができます。
クラスタ構成は、ノードの状況により変化します。
障害が発生した場合には、そのノードを切り離し、稼動ノードだけでクラスタ構成を確立し、
そのノードが復旧した場合は、復旧ノードを加えた状態でクラスタ構成を確立します。
dlm.logを見ることにより、クラスタ構成の状況を把握することができます。
スライドの例を見てみましょう。
Mar05 14:23:43 に Reconfiguration がスタートし、その時は0番のノード (実際にはノード1)
のみでReconfigurationが行われていて、complete しています。
つまり、この時点では、1ノードだけでクラスタ構成を確立しています。
Mar05 14:25:02 に Reconfiguration がスタートし、その時は0番と1番のノード (実際にはノー
ド1、ノード2)でReconfigurationが行われていて、complete した。
つまり、2ノードでクラスタ構成を確立したことになります
注) DLM.LOGはOracleService<SID>のサービスの開始時に古いものをクリアし、新たに書
き出しを始めます。障害の原因が判明するまでは、むやみにOracleService<SID>の停止・
開始を行わないようにして下さい。
また、Oracleインスタンスを起動する際には必ずdlm.logを確認して、正常なクラスタ構成が
確立されていることを確認後、起動して下さい。
37
PGMS.LOG
• Oracle8からDLMがIDLMとなりOracleのコンポーネ
ントとなった。
• Oracleを立ち上げないとログを書いてくれない。
• Oracle8からは、PGMS.LOGで確認する。
PGMS.LOG
20:06:57 | MESSAGE
20:06:57 | MESSAGE
20:06:57 | MESSAGE
20:06:57 | MESSAGE
| 00ea |
| 00ea | pGMSNodeMap(): Event(3) CMEVENT_RECONFIG Rcfg(6) NodeMap [00][00][00][02]
| 0105 | HandleReconfig(): Reconfig OK - nodes(1) rcfgGen(7) master(1)
| 0105 |
15:01:36 |
15:01:36 |
15:01:37 |
15:01:37 |
| 00b1 |
| 00b1 | pGMSNodeMap(): Event(1) CMEVENT_RECONFIG Rcfg(0) NodeMap [00][00][00][03]
| 0049 | HandleReconfig(): Reconfig OK - nodes(2) rcfgGen(2) master(0)
| 0049 |
MESSAGE
MESSAGE
MESSAGE
MESSAGE
38
38
検証環境
サーバー
ノード数
CPU per node
Memory per node
共有ディスク
高速インタコネクト
OS
クラスタソフト
Oracleのバージョン
.
Hitachi FLORA-S series/SM2
2
2 ( PentiumPro 200MHZ )
512MB
Hitachi Disk Array DF350 (HT-4044-C934D)
100BaseT ( HITACHI PC-CN7320 )
Windows NT 4.0, Service Pack 3
MultiServer/Connection Manager for Windows NT
Oracle7 Server for Windows NT R7.3.3.0.5
( ただし、OCOPYのテストの時には7.3.4.2.0を使用 )
39
今回の障害テストは日立様の協力を得、上記の様な環境でテストを行いま
した。
39
テストの流れ
client1
client2
ノード1に接続
ノード2に接続
1行Insert into emp
1行Insert into emp
1行Update emp
1行Update emp
1行 Delete from Emp
1行 Delete from Emp
障害を発生させる
COMMIT
COMMIT
障害内容の把握
復
旧
40
障害テストでは、以下のような流れでテストを行いました。
データベースには、SCOTT/TIGERユーザーを作成し、EMP表を作る。
クライアントマシンから、SQL*Plusを使い、ノード1及びノード2のインスタン
スにセッションを張る。
EMP表に対して、2つのSQL*Plusから1行ずつInsertする。
EMP表に対して、2つのSQL*Plusから1行ずつUpdateする。
EMP表に対して、2つのSQL*Plusから1行ずつDeleteする。
これらのDML文は、ノード1からはOPS1.sql、ノード2からはOPS2.sqlの各ス
クリプトで行う。
障害を発生させる。
障害発生後、2つのSQL*PlusでCommitを発行する。
障害内容の把握。
※障害発生後、前述のOPS1.sql又はOPS2.sqlがlockを保持しているかどう
か確認するために、「正常なノード」から「障害発生ノードが更新していたデー
タ」に対して、更新を行うSQL文を発行しました。
40
インスタンス停止
ORA-12571発生
正常動作
クライアント
ノード1
Shutdown Immediate
Shutdown Abort
ノード2
インスタンス1
インスタンス2
DB
テスト1
41
ノード1のインスタンスを停止する
(Shutdown Immediate / Shutdown Abort)
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-12571
再接続時 → ORA- 12203
ノード2 commitを発行時 → 正常
再接続時 → 正常
ノード1が更新していたデータに対して更新処理を行う → ロック待ちなし
< 原因の特定 >
ノード1上でsvrmgr23を起動し、internalで接続。
select username,status from v$session; の発行。
→ ORA-01034が発生。
インスタンスが停止していると考えられる。
< 対処方法 >
dlm.logによりクラスタ構成を確認した後、インスタンスを起動する。
ノード2の更新内容はDBに反映されていますが、ノード1の更新内容はロールバックされ
反映されていません。ノード1で行った更新処理を再度行う必要があります。
ORA-12571
ORA-12203
ORA-01034
TNS: パケットライターに障害が発生しました
TNS: 宛先に接続できません
Oracleは使用不能です
41
OracleService<SID>停止
ORA-12571発生
正常動作
クライアント
ノード1
OracleService<SID>停止
ノード2
インスタンス1
インスタンス2
DB
42
テスト2 ノード1のOracleService<SID>を停止する
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-12571
再接続時 → ORA- 12203
ノード2 commitを発行時 → 正常
再接続時 → 正常
ノード1が更新していたデータに対して更新処理を行う → ロック待ちなし
< 原因の特定 >
ノード1上でsvrmgr23を起動。
→ ORA-09352が発生。これにより、OracleService<SID>が停止していると考えられる。
< 対処方法 >
ノード1でサービスを開始、dlm.logによりクラスタ構成を確認した後、インスタンスを起動す
る。
ノード2の更新内容はDBに反映されていますが、ノード1の更新内容はロールバックされ
反映されていません。ノード1で行った更新処理を再度行う必要があります。
ORA-12571
ORA-12203
ORA-09352
TNS: パケットライターに障害が発生しました
TNS: 宛先に接続できません
Windows32ビットの2タスクドライバは新規のOracleタスクを起動できません
42
マシン電源ダウン
ORA-03113発生
正常動作
クライアント
ノード1
マシン電源DOWN
ノード2
インスタンス1
インスタンス2
DB
43
テスト3 ノード1の電源を停止する
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-03113
ノード2 commitを発行時 → 正常
再接続時 → ORA- 12203
再接続時 → 正常
ノード1が更新していたデータに対して更新処理を行う → ロック待ちなし
< 原因の特定 >
ノード1を見てみると、電源が落ちていることが確認できる。
< 対処方法 >
ノード1で電源を入れ、サービスを開始、dlm.logによりクラスタ構成を確認した後、インスタ
ンスを起動する。
ノード2の更新内容はDBに反映されていますが、ノード1の更新内容はロールバックされ
反映されていません。ノード1で行った更新処理を再度行う必要があります。
ORA-03113
ORA-12203
通信チャネルでファイルの終わりが検出されました
TNS: 宛先に接続できません
43
パブリックネットワーク切断 (1)
ORA-03113発生
正常動作
クライアント
ノード1
ノード1のPublic
ケーブルを抜く
ノード2
インスタンス1
インスタンス2
DB
44
テスト4 ノード1に接続しているPublicケーブルを抜く
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-3113
再接続時 → ORA- 12203
ノード2 commitを発行時 → 正常
再接続時 → 正常
ノード1が更新していたデータに対して更新処理を行う → ロック待ち状態
< 原因の特定>
ノード1上でsvrmgr23を起動し、internalで接続。
select username,status from v$session; の発行。
→ インスタンス1で接続していたユーザがStatusがINACTIVEの状態でセッションが
残っている。インスタンスは正常であると分かる。
Lisnrctlでリスナーの状態を確認。
→ 正常であると分かる。
Pingコマンドをクライアントに向けて発行。
→ Time Outになるので、Network障害であることが確認できる。
< 対処方法 >
次ページ
ORA-03113
ORA-12203
通信チャネルでファイルの終わりが検出されました
TNS: 宛先に接続できません
44
パブリックネットワーク切断 (2)
ロック待ち
クライアント
ネットワーク障害を解決
ノード1
セッションが切れてしまったクライア
ントが更新していたデータを、他のセッ
ションから更新しようとするとロック
待ち状態になる
ノード2
インスタンス1
インスタンス2
DB
45
< 対処方法 >
ここで、ネットワークの問題を解決しても、復旧が終わる訳ではない。
この場合、インスタンス1でつながっていたユーザのセッションが残ってしまうため、そのユー
ザが変更をかけていた行に対してのロックがかかった状態のままになってしまう。
この時のセッションは V$SessionのSTATUS:INACTIVE という状態で残り続ける。
ちなみに、ALTER SYSTEM KILL SESSION ; を残ったセッションに発行しても、STATUS
がKILLになるだけで、ロックは保持され続ける。
この状態からセッションを消す方法は以下の3つが考えられる。
1. SHUTDOWN ABORTを行う。
2. SQL*NetのSQLNET.EXPIRE_TIMEのパラメータを設定する
3. TCP/IPのKeep Aliveの設定を行う。
ノード2の更新内容はDBに反映されていますが、ノード1の更新内容はロールバックされ
反映されていません。残ったセッションが消えた後で、ノード1で行った更新処理を再度行
う必要があります。
注)
・ SQLNET.EXPIRE_TIMEについてはマニュアル「SQL*Netの理解」を参照して下さい。
・ NTでのTCP/IPの設定は次のページに説明しています。
・ また、このケーブル障害時のロックの問題はOPS特有の問題でなく、通常のシング
ルノードでも起こる問題である。
45
WindowNTでのKeepAliveの設定
レジストリでTCP/IPのKeep Aliveを行う。
パラメータは
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\P
arameters
-\KeepAliveTime
デフォルト 7,200,000(2時間)
-\KeepAliveInterval
デフォルト 1000(1秒)
-\TcpMaxDataRetransmissions
デフォルト 5(回)
46
WindowsNTの場合は、レジストリでTCP/IPのKeep Aliveを行う。
パラメータ詳細は以下の通り。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\Parameters
(a) KeepAliveTime
タイプ:REG_DWORD - ミリセコンド
範囲:1-0xFFFFFFFF
デフォルト:7,200,000(2時間)
最後のデータ送受信が行われてから、KeepAliveパケットを送信するまでの時間を設定す
る。[KeepAliveTime]時間を経過しても次のパケットが届かない場合に、1回目のKeepAlive
パケットが送信される。
(b) KeepAliveInterval
タイプ:REG_DWORD - ミリセコンド
範囲:1-0xFFFFFFFF
デフォルト:1000(1秒)
(c) TcpMaxDataRetransmissions
タイプ:REG_DWORD - 数
範囲:0-0xFFFFFFFF
デフォルト:5(回)
[KeepAliveInterval]時間後に2回目のKeepAliveパケットが送信される。その後、
[TcpMaxDataRetransmissions]回数、KeepAliveパケットを送信し、返答が無い場合に接続
を切断する。この時、2回目以降のKeepAliveパケットの送信間隔は、前回の2倍の時間が
設定される。
このパラメータの値を変更(特にKeepAliveTimeの時間を短く設定)することにより、TCP/IP
のタイムアウトの時間を短くすることができる。
このパラメータの値を変更してテストした結果、残ったセッション(STATUS:INVALIDのセッショ
ンも)がV$SESSIONから削除され、ロックを解放することが確認できた。
今回は、設定を変更することによる、システム全体への影響についての検証までは行いま
せんでした。実際に使用する際には影響を考えて設定する必要があります。
46
プライベートケーブル切断(1)
正常動作
ORA-3113発生
クライアント
ノード1のPrivateケーブルを抜く
ノード1
ノード2
インスタンス1
インスタンス2
DB
47
テスト6 ノード1のPrivateケーブルを抜く (1)
< Client側での障害検知 >
ノード1 commitを発行時 → 正常
再接続時 →
正常
ノード2 commitを発行時 → 正常
再接続時 →
ORA-12500
(select 発行時にORA-3113)
ノード2が更新していたデータに対して更新処理を行う → ロック待ちなし
注) Privateケーブル障害が起き、ノード間通信ができなくなった場合は、クォーラムリソースをつ
かんでいるノードが生き残る。今回のテストではノード1がクォーラムリソースをつかんだた
めノード1が生き残こった。
ノード2では commitが正常に発行できたが、これはタイミングの問題 (クラスタがノード間通信
の障害を判別する前にcommit処理を終えることができた ) であり、commit時点でエラーが
発生する場合もある。
< 原因の特定 >
両ノードのOracle Service<SID>を確認。
ノード1 → 正常
ノード2 → 終了
両ノードのdlm.logを確認
ノード1 → ノード1でReconfig(1つのノードだけで、クラスタ環境を構築)
ノード2 → error
1つのノードだけでクラスタ構成が構築されていることにより、Privateケーブルが怪しいと
判断。ノード1からノード2にPrivateケーブル経由でPingを発行。Time Out になることによ
り、Privateケーブル障害が発見できる。
47
プライベートケーブル切断(2)
正常動作
ORA-3113発生
クライアント
ノード1のPrivateケーブルを抜く
ノード1
ノード2
インスタンス1
インスタンス2
DB
48
テスト6 ノード1のPrivateケーブルを抜く (2)
< 対処方法 >
ネットワークの問題を解決した後、ノード2で、サービスを開始、dlm.logによりクラスタ構成
(2ノードでクラスタ構成していること)を確認した後、インスタンスを起動する。
今回のケースでは、ノード1・ノード2の更新内容が共に反映されていた(両ノードともに
commit処理は正常に終了)。ただし、ノード2でのCommit処理時にエラーになり、commitが
できなかった場合にはノード2で行った更新処理を再度行う必要があります
ORA-03113
ORA-12500
通信チャネルでファイルの終わりが検出されました
TNS:リスナーが専用サーバ・プロセスの起動に失敗しました
48
ノードのSCSIケーブル切断
ORA-01092発生
(ORA-00603発生)
正常動作
クライアント
ノード1
ノード2
インスタンス1
インスタンス2
ノード1の共有
Diskにつながる
SCSIケーブルを
抜く
DB
49
テスト7 ノード1の共有DISKにつながるSCSIケーブルを抜く
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-01092(0603)
再接続時 →
ノード2 commitを発行時 → 正常
再接続時 →
ORA-00472
正常
ノード2が更新していたデータに対して更新処理を行う → ロック待ちなし
< 原因の特定 >
ノード1上でsvrmgr23を起動しinternalで接続を行う。
select username,status from v$session; の発行。
→ ORA-1034
ノード1のディスクアドミニストレータで、共有DISKがofflineになっていることを確認
→ SCSIケーブル障害の発見
< 対処方法 >
この場合、SCSIケーブルを接続しただけでは、データベースを起動することができない。
(ORA-1081やORA-1012が発生)
一度、データベースを shutdown abort し、データベースを再起動する。
ノード2の更新内容はDBに反映されていますが、ノード1の更新内容はロールバックされ
反映されていません。ノード1で行った更新処理を再度行う必要があります。
ORA-01092
ORA-00603
ORA-00472
ORA-01034
ORA-01081
ORA-01012
Oracleインスタンスが終了しました強制的に接続が切り離されます
致命的なエラーが発生したためOracleサーバセッションが終了しました
PMONプロセスはエラーで終了しました
Oracleは使用不能です
すでに稼働中のOracleを起動しました。まずOracleを停止して下さい。
ログオンしていません。
49
共有DISKのSCSIケーブル切断
ORA-01092発生
ORA-00603発生
クライアント
ノード1
ノード2
インスタンス1
共有Diskの
SCSIケーブルを
抜く
インスタンス2
DB
50
テスト8 共有DISKのSCSIケーブルを抜く
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-0603
再接続時 → ORA- 00472
ノード2 commitを発行時 → ORA-1092
再接続時 → ORA- 00472
< 原因の特定 >
両ノードでsvrmgr23を起動し、internalで接続。
両ノードで select username,status from v$session; の発行。
→ ORA-1034
両ノードのディスクアドミニストレータで、共有DISKがofflineになっていることを確認
→ SCSIケーブル障害の発見
< 対処方法 >
この場合、SCSIケーブルを接続しただけでは、データベースを起動することができない。
(ORA-1081やORA-1012が発生)
一度、データベースを shutdown abort し、データベースを再起動する。
両ノードの更新内容はDBに反映されていません。両ノードで行った更新処理を再度行う必
要があります。
ORA-00603
ORA-01092
ORA-00472
ORA-01034
ORA-01081
ORA-01012
致命的なエラーが発生したためOracleサーバセッションが終了しました
Oracleインスタンスが終了しました強制的に接続が切り離されます
PMONプロセスはエラーで終了しました
Oracleは使用不能です
すでに稼働中のOracleを起動しました。まずOracleを停止して下さい。
ログオンしていません。
50
ディスク電源ダウン
ORA-00603発生
ORA-00603発生
クライアント
ノード1
ノード2
インスタンス1
共有Diskの
電源を切断する
インスタンス2
DB
51
テスト9 共有DISKの電源を切断する
< Client側での障害検知 >
ノード1 commitを発行時 → ORA-0603
再接続時 → ORA-00472
ノード2 commitを発行時 → ORA-0603
再接続時 → ORA-00472
< 原因の特定 >
両ノードでsvrmgr23を起動し、internalで接続。
両ノードで select username,status from v$session; の発行。
→ ORA-1034
両ノードのディスクアドミニストレータで、共有DISKがofflineになっていることを確認
→ 共有DISKの電源切断を発見
< 対処方法 >
この場合、共有DISKの電源を入れただけでは、データベースを起動することができない。
一度、データベースを shutdown abort し、データベースを再起動する。
両ノードの更新内容はDBに反映されていません。両ノードで行った更新処理を再度行う必
要があります。
ORA-00603
ORA-00472
ORA-01034
ORA-01081
ORA-01012
致命的なエラーが発生したためOracleサーバセッションが終了しました
PMONプロセスはエラーで終了しました
Oracleは使用不能です
すでに稼働中のOracleを起動しました。まずOracleを停止して下さい。
ログオンしていません。
51
まとめ
クライアントから、障害内容を特定することは困難
サーバ側での原因究明作業は必須
インスタンスの状態の確認
OracleService<SID>の状態の確認
dlm.logの確認
dlm.logによりクラスタ構成の再構築が行われている場合
にはPingを実行する
ディスクアドミニストレータでの共有DISKの確認
52
クライアントからは、障害内容のある程度の予測は出来ますが、特定することは困難だと
思われます。
やはり、障害時にはある程度スキルをもった技術者による「サーバ側でのトラブルシューティ
ング」が不可欠になります。その際には以下のような作業を行うことにより原因究明が可能
になります。
・ インスタンスの状態の確認
・ OracleService<SID>の状態の確認
・ dlm.logの確認
・ dlm.logによりクラスタ構成の再構築が行われている場合にはPingを実行する
・ ディスクアドミニストレータでの共有DISKの確認
尚、WindowsNTでは、リモートでサーバの作業は出来ませんので、これらの作業はサーバ
が置いてある現場で行う事になります。
また、障害は1つだけとは限りません。複数の障害が同時に起こる場合もありますので、
障害解決後には必ずdlm.logを確認し、正常なクラスタ構成が確立していることを確認して
から、データベースを立ち上げる必要があります。
また、dlm.logはOracleService<SID>のサービスの開始時に古いものをクリアし、新たに書
き出しを始めますので、むやみにOracleService<SID>の起動・停止を行わないように気を
付けて下さい。
52
最後になりますが、OPSの導入の一番のメリットは、マシンを多重化するこ
とによる「システム可用性の向上」ですが、OPSの管理は決して簡単なもの
ではありません。
シングルノードのWindowsNTシステムのように、「障害が起きたら、何も考え
ずに立ち上げ直せば良い」 というものではないのです。
OPS for NTは 「ある程度管理コストがかかっても、可用性を向上したい」 と
いうシステムに向いています。提案時には、お客様にこの事をしっかりと認
識してもらうことが大切だと思います。
この文書はあくまでも参考資料であり、掲載されている情報は予告なしに
変更されることがあります。この文書に関連して不都合が生じた場合も、米
国オラクル社及び日本オラクル株式会社は一切保証せず、特に責任は負
いかねますのでご容赦下さい。また許可なく、改編、引用することを禁じま
す。
53