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
© Copyright 2024 ExpyDoc