ヘッダーをスキップ

Oracle Data Guard 概要および管理
11gリリース1(11.1)

E05755-03
目次
目次
索引
索引

戻る 次へ

A Data Guardのトラブルシューティング

この付録は、スタンバイ・データベースのトラブルシューティングのヘルプとしてご利用いただけます。この項は、次の項目で構成されています。

A.1 一般的な問題

スタンバイ・データベースの使用時に発生する問題の原因には、次のようなものがあります。

A.1.1 ALTER DATABASE文によるデータファイル名の変更

STANDBY_FILE_MANAGEMENT初期化パラメータをAUTOに設定すると、スタンバイ・サイトのデータファイルを改名できません。STANDBY_FILE_MANAGEMENT初期化パラメータをAUTOに設定した場合、次のSQL文は使用できなくなります。

スタンバイ・データベースでこれらの文のいずれかを使用しようとすると、エラーが表示されます。次に例を示します。

SQL> ALTER DATABASE RENAME FILE '/disk1/oracle/oradata/payroll/t_db2.log' to 'dummy'; 
alter database rename file '/disk1/oracle/oradata/payroll/t_db2.log' to 'dummy'
*
ERROR at line 1:
ORA-01511: error in renaming log/datafiles
ORA-01270: RENAME operation is not allowed if STANDBY_FILE_MANAGEMENT is auto

フィジカル・スタンバイ・データベースにデータファイルを追加する方法は、9.3.1項を参照してください。

A.1.2 スタンバイ・データベースがプライマリ・データベースからREDOデータを受信しない

スタンバイ・サイトがREDOデータを受信していない場合は、V$ARCHIVE_DESTビューを問い合せて、エラー・メッセージをチェックします。たとえば、次のような問合せを入力します。

SQL> SELECT DEST_ID "ID",
2> STATUS "DB_status",
3> DESTINATION "Archive_dest",
4> ERROR "Error"
5> FROM V$ARCHIVE_DEST WHERE DEST_ID <=5;

ID DB_status Archive_dest Error
-- --------- ------------------------------ ------------------------------------
1 VALID /vobs/oracle/work/arc_dest/arc
2 ERROR standby1 ORA-16012: Archivelog standby database identifier mismatch
3 INACTIVE
4 INACTIVE
5 INACTIVE
5 rows selected.

問合せの出力によって解決しない場合は、次の問題リストを確認します。次のいずれかの条件に該当する場合、REDO転送サービスはスタンバイ・データベースにREDOデータを転送できません。

A.1.3 フィジカル・スタンバイ・データベースをマウントできない

スタンバイ制御ファイルが、ALTER DATABASE CREATE [LOGICAL] STANDBY CONTROLFILE ...文またはRecovery Managerコマンドを使用して作成されていない場合、スタンバイ・データベースをマウントすることはできません。次のタイプの制御ファイル・バックアップは使用できません。

A.2 ログ・ファイル宛先の障害

MANDATORY宛先にREOPENを指定した場合、REDO転送サービスは、REDOデータを正常に転送できなかったとき、プライマリ・データベースを停止します。

MAX_FAILURE属性を使用する場合は、REOPEN属性は必須です。例A-1に、再試行時間を5秒に設定し、再試行回数を3回に制限する方法を示します。

例A-1    再試行時間と制限の設定

LOG_ARCHIVE_DEST_1='LOCATION=/arc_dest REOPEN=5 MAX_FAILURE=3'

LOG_ARCHIVE_DEST_nパラメータのALTERNATE属性を使用して代替アーカイブ先を指定します。スタンバイ・データベースへのREDOデータの転送に失敗した場合は、代替アーカイブ先を使用できます。転送に失敗したときに、REOPEN属性が指定されていなかった場合、またはMAX_FAILURE属性のしきい値を超えた場合、REDO転送サービスは、次のアーカイブ操作時に代替先へのREDOデータの転送を試みます。

元のアーカイブ先で障害が発生したときに、元のアーカイブ先が自動的に代替アーカイブ先に変更されることを防ぐには、NOALTERNATE属性を使用します。

例A-2は、エラー発生時に、単一、必須のローカル宛先が異なる宛先へ自動的にフェイルオーバーするように初期化パラメータを設定する方法を示します。

例A-2    代替宛先の指定

LOG_ARCHIVE_DEST_1='LOCATION=/disk1 MANDATORY ALTERNATE=LOG_ARCHIVE_DEST_2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_2='LOCATION=/disk2 MANDATORY'
LOG_ARCHIVE_DEST_STATE_2=ALTERNATE

LOG_ARCHIVE_DEST_1の宛先で障害が発生した場合、アーカイブ・プロセスは、プライマリ・データベースでの次のログ・ファイル・スイッチでLOG_ARCHIVE_DEST_2の宛先に自動的に切り替えます。

A.3 ロジカル・スタンバイ・データベース障害の処理

ロジカル・スタンバイ・データベース障害を処理するための重要なツールは、DBMS_LOGSTDBY.SKIP_ERRORプロシージャです。表の重要度に基づいて、次のいずれかを実行できます。

これらの処理のいずれかを実行すると、SQL Applyの停止を回避できます。存在している問題は、後でDBA_LOGSTDBY_EVENTSビューを問い合せて検索し、訂正できます。DBMS_LOGSTDBYパッケージをPL/SQLコールアウト・プロシージャとともに使用する方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

A.4 フィジカル・スタンバイ・データベースへのスイッチオーバーの問題

通常、第8章で説明した手順に従うと、スイッチオーバーは正常に行われます。ただし、スイッチオーバーが失敗した場合でも、次の項を読むと、問題の解決に役立ちます。

A.4.1 REDOデータが転送されていないためスイッチオーバーできない

スイッチオーバーが正常に完了しない場合は、V$ARCHIVED_LOGビューのSEQUENCE#列を問い合せて、元のプライマリ・データベースから転送された最後のREDOデータが、スタンバイ・データベースに適用されているかどうかを確認します。最後のREDOデータがスタンバイ・データベースに転送されていない場合は、そのREDOデータが含まれるアーカイブREDOログ・ファイルを元のプライマリ・データベースから古いスタンバイ・データベースに手動でコピーし、SQL ALTER DATABASE REGISTER LOGFILE file_specification文を使用して登録します。次に、適用サービスを開始すると、アーカイブREDOログ・ファイルが自動的に適用されます。V$DATABASEビューのSWITCHOVER_STATUS列を問い合せます。SWITCHOVER_STATUS列の値TO PRIMARYは、プライマリ・ロールへのスイッチオーバーが可能になったことを示します。

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; 
SWITCHOVER_STATUS 
----------------- 
TO PRIMARY 
1 row selected 

V$DATABASEビューのSWITCHOVER_STATUS列に対するその他の有効な値の詳細は、第17章を参照してください。

スイッチオーバーを続行するには、8.2.1項(フィジカル・スタンバイ・データベースの場合)または8.3.1項(ロジカル・スタンバイ・データベースの場合)の説明に従って、ターゲットのスタンバイ・データベースをプライマリ・ロールに切り替える操作を再度実行します。

A.4.2 SQLセッションがアクティブなためスイッチオーバーできない

ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY文にWITH SESSION SHUTDOWN句を組み込んでいない場合、アクティブなSQLセッションがあると、スイッチオーバーを継続できません。アクティブなSQLセッションには、他のOracle Databaseプロセスが含まれていることがあります。

セッションがアクティブのときは、スイッチオーバーの試行が次のエラー・メッセージを伴って失敗します。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY * 
ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected

処置: V$SESSIONビューを問い合せ、エラーの原因となっているプロセスを判断します。次に例を示します。

SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION    
  2> WHERE TYPE = 'USER'
  3>  AND SID <> (SELECT DISTINCT SID FROM V$MYSTAT);
SID        PROCESS   PROGRAM 
---------  --------  ------------------------------------------------ 
        7      3537  oracle@nhclone2 (CJQ0)
       10
       14
       16
       19
       21
 6 rows selected.

この例では、JOB_QUEUE_PROCESSESパラメータがCJQ0プロセス・エントリに対応しています。ジョブ・キュー・プロセスはユーザー・プロセスなので、スイッチオーバーの発生を妨げるのはSQLセッションであると考えられます。プロセスまたはプログラム情報のないエントリは、ジョブ・キュー・コントローラによって開始されるスレッドです。

次のSQL文を使用して、JOB_QUEUE_PROCESSESパラメータが設定されていることを確認してください。

SQL> SHOW PARAMETER JOB_QUEUE_PROCESSES; 
NAME                           TYPE      VALUE
------------------------------ -------   -------------------- 
job_queue_processes            integer   5

さらに、パラメータを0(ゼロ)に設定してください。次に例を示します。

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
Statement processed.

JOB_QUEUE_PROCESSESは動的パラメータであるため、値を変更した際にインスタンスを再起動しなくても、変更を即時に有効にできます。これで、スイッチオーバー手順を再試行できます。

初期化パラメータ・ファイル内のパラメータは変更しないでください。インスタンスを停止し、スイッチオーバーが完了した後で再起動すると、パラメータが元の値にリセットされます。これは、プライマリ・データベースとフィジカル・スタンバイ・データベースの両方に適用されます。

表A-1に、スイッチオーバーを妨げる共通のプロセスと、実行する必要のある対処措置をまとめます。

表A-1    スイッチオーバーを妨げる共通のプロセス 
プロセスのタイプ  プロセスの説明  対処措置 

CJQ0 

Job Queue Scheduler Process 

JOB_QUEUE_PROCESSES動的パラメータを値0(ゼロ)に変更してください。変更は、インスタンスを再起動しなくても即時に有効になります。 

QMN0 

Advanced Queue Time Manager 

AQ_TM_PROCESSES動的パラメータを値0(ゼロ)に変更してください。変更は、インスタンスを再起動しなくても即時に有効になります。 

DBSNMP 

Oracle Enterprise Manager Management Agent 

オペレーティング・システムのプロンプトから、emctl stop agentコマンドを発行してください。 

A.4.3 ユーザー・セッションがアクティブなためスイッチオーバーできない

スイッチオーバーに失敗し、エラー「ORA-01093: ALTER DATABASE CLOSEは接続中のセッションがない場合にのみ実行できます」が戻された場合、通常これは、ALTER DATABASE COMMIT TO SWITCHOVER文が暗黙的にデータベースのクローズを実行したときに、その他のユーザー・セッションがデータベースに接続されていてクローズできなかったことが原因と考えられます。

このエラーが発生した場合は、データベースに接続されているユーザー・セッションをすべて切断します。まだアクティブなセッションを確認するには、次のようにV$SESSIONビューを問い合せます。

SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION;

A.4.4 ORA-01102エラーによりスイッチオーバーできない

スタンバイ・データベースとプライマリ・データベースが同じサイトに存在するとします。ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY文およびALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY文の両方が正常に実行された後、フィジカル・スタンバイ・データベースとプライマリ・データベースを停止し、再起動します。


注意

フィジカル・スタンバイ・データベースが起動後に読取り専用モードでオープンされていない場合、停止して再起動する必要はありません。 


ただし、2つ目のデータベースの起動はエラー・メッセージ「ORA-01102 データベースを排他モードでマウントすることができません。」を伴って失敗します。

スタンバイ・データベース(つまり元のプライマリ・データベース)で使用される初期化パラメータ・ファイルにDB_UNIQUE_NAMEパラメータを設定していないと、スイッチオーバー中にこの現象が発生することがあります。スタンバイ・データベースのDB_UNIQUE_NAMEパラメータが設定されていない場合、スタンバイ・データベースとプライマリ・データベースの両方が同じマウント・ロックを使用するため、2つ目のデータベースの起動時にORA-01102エラーが発生します。

処置: DB_UNIQUE_NAME=unique_database_nameをスタンバイ・データベースが使用する初期化パラメータ・ファイルに追加して、スタンバイ・データベースとプライマリ・データベースを停止し、再起動します。

A.4.5 スイッチオーバー後にREDOデータが適用されない

スイッチオーバー後にアーカイブREDOログ・ファイルが新しいスタンバイ・データベースに適用されません。

これは、スイッチオーバー後、環境パラメータまたは初期化パラメータが適切に設定されていなかったことが原因と考えられます。

処置:

A.4.6 失敗したスイッチオーバーをロールバックして最初からやりなおす

フィジカル・スタンバイ・データベースでエラーが発生し、スイッチオーバーを続行できない場合は、次の手順に従って、新しいフィジカル・スタンバイ・データベースをプライマリ・ロールに戻すことができます。

  1. 新しいスタンバイ・データベース(元のプライマリ)に接続し、次の文を発行して、このスタンバイ・データベースをプライマリ・ロールに戻します。

    SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
    
    

    この文が正常に実行された場合は、必要に応じてデータベースを停止し、再起動します。再起動すると、データベースはプライマリ・データベース・ロールで実行されるため、それ以降の手順を実行する必要はありません。

    この文が正常に実行されなかった場合は、手順3に進んでください。

  2. プライマリからフィジカル・スタンバイにロールを変更するスイッチオーバーを開始したときに、トレース・ファイルがログ・ディレクトリに書き込まれています。このトレース・ファイルには、元のプライマリ制御ファイルを再作成するために必要なSQL文が含まれています。トレース・ファイルの位置を特定し、SQL文を一時ファイルに抽出します。SQL*Plusから一時ファイルを実行します。これによって、新しいスタンバイ・データベースはプライマリ・ロールに戻されます。

  3. 元のフィジカル・スタンバイ・データベースを停止します。

  4. 新しいスタンバイ制御ファイルを作成します。このファイルは、プライマリ・データベースとフィジカル・スタンバイ・データベースの再同期化に必要です。フィジカル・スタンバイ制御ファイルを元のフィジカル・スタンバイ・システムにコピーします。フィジカル・スタンバイ制御ファイルの作成方法は、3.2.2項を参照してください。

  5. 元のフィジカル・スタンバイ・インスタンスを再起動します。

    この手順が正常終了し、アーカイブ・ギャップ管理が使用可能になると、FALプロセスが起動し、欠落したアーカイブREDOログ・ファイルをフィジカル・スタンバイ・データベースに再アーカイブします。プライマリ・データベース上でログ・スイッチを強制実行し、プライマリ・データベースとフィジカル・スタンバイ・データベースの両方のアラート・ログを調べて、アーカイブREDOログ・ファイルの順序番号が正しいことを確認します。

    アーカイブ・ギャップ管理の詳細は6.3.3.1項を、トレース・ファイルの場所については付録Gを参照してください。

  6. スイッチオーバーを再度実行します。

    この時点で、Data Guard構成は初期状態にロールバックされています。最初に失敗したスイッチオーバーの問題をすべて解決した後、スイッチオーバー操作を再度実行できます。

A.5 ロジカル・スタンバイ・データベースへのスイッチオーバーの問題

ロジカル・スタンバイ・データベースに関連するスイッチオーバー操作には、通常、準備とコミットの2つのフェーズがあります。これに対する例外は、ロジカル・スタンバイ・データベースを使用したOracleソフトウェアのローリング・アップグレードの場合、またはData Guard Brokerを使用している場合です。ロジカル・スタンバイ・データベースを使用したローリング・アップグレードの実行中、またはData Guard Brokerで開始されたスイッチオーバー操作の際に障害が発生した場合は、A.5.2項に直接進んでください。


注意

Data Guard構成のすべてのデータベースで、フラッシュバック・データベースを有効にすることをお薦めします。この項の手順では、使用するData Guard構成内のすべてのデータベースで、フラッシュバック・データベースが有効にされていると想定しています。 


A.5.1 スイッチオーバー操作の準備フェーズ中の障害

スイッチオーバー操作の準備フェーズ中に障害が発生した場合、スイッチオーバーを取り消して、スイッチオーバー操作を再度初めから行います。

A.5.1.1 プライマリ・データベースの準備中の障害

ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY文の実行中に障害が発生した場合、プライマリ・データベースで次のSQL文を発行してスイッチオーバーの準備フェーズを取り消します。

SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY CANCEL;

これで、スイッチオーバー操作を再度初めから行うことができます。

A.5.1.2 ロジカル・スタンバイ・データベースの準備中の障害

ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY文の実行中に障害が発生した場合、プライマリ・データベースおよびターゲット・スタンバイ・データベースで準備操作を取り消す必要があります。次の手順に従ってください。

  1. プライマリ・データベースで、スイッチオーバーの準備のために発行した文を取り消します。

    SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO LOGICAL STANDBY CANCEL;
    
    
  2. スイッチオーバーのターゲットであるロジカル・スタンバイ・データベースで、スイッチオーバーの準備のために発行した文を取り消します。

    SQL> ALTER DATABASE PREPARE TO SWITCHOVER TO PRIMARY CANCEL;
    
    

    これで、スイッチオーバー操作を再度初めから行うことができます。

A.5.2 スイッチオーバー操作のコミット・フェーズ中の障害

スイッチオーバーのコミットでは単一のSQL文のみを使用しますが、内部的には多数の操作が実行されます。実行する必要がある修正処理は、エラー発生時のスイッチオーバー操作のコミットの状態によって異なります。

A.5.2.1 元のプライマリ・データベースの変換での障害

ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY文の実行中に障害が発生した場合、次の手順を実行します。

  1. 元のプライマリ・データベースのV$DATABASE固定ビューのDATABASE_ROLE列をチェックします。

    SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
    
    
    • 列にLOGICAL STANDBYの値が含まれる場合、スイッチオーバー操作は完了していますが、スイッチオーバー後のタスクで障害が発生しています。この場合、データベースを停止して再オープンすることをお薦めします。

    • 列にPRIMARYの値が含まれる場合、手順2に進みます。

  2. 元のプライマリで次の問合せを実行します。

    SQL> SELECT COUNT(*) FROM SYSTEM.LOGSTDBY$PARAMETERS
      2> WHERE NAME = 'END_PRIMARY';
    
    
    • 問合せで0が戻される場合、プライマリの状態は、スイッチオーバーのコミット・コマンドが発行される前と同一です。修正処理を実行する必要はありません。スイッチオーバー操作のコミットに進むか、A.5.1.2項で説明するようにスイッチオーバー操作を取り消します。

    • 問合せで1が戻される場合、プライマリは一貫性がない状態のため、手順3に進む必要があります。

  3. インスタンス化された既存のまたは新しいロジカル・スタンバイ・データベースにより保護されるための機能が維持されるよう、元のプライマリ・データベースで対処措置を実行します。

    スイッチオーバー操作のコミット中に発生したエラーの基となる原因を修正してSQL文(ALTER DTABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY)を再発行します。次の手順を実行することもできます。

    1. スイッチオーバー・コマンドのコミットを開始したインスタンスのアラート・ログから、元のプライマリへのフラッシュバックに必要なSCNを判別します。この情報は、SQL文ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBYの後に表示されます。

      LOGSTDBY: Preparing the COMMIT TO SWITCHOVER TO LOGICAL STANDBY DDL at scn 
      [flashback_scn].
      
      
    2. プライマリ・データベースのすべてのインスタンスを停止します。

      SQL> SHUTDOWN IMMEDIATE;
      
      
    3. プライマリ・データベースを排他モードでマウントします。

      SQL> STARTUP MOUNT;
      
      
    4. データベースをアラート・ログから取得したSCNまでフラッシュバックします。

      SQL> FLASHBACK DATABASE TO BEFORE SCN <flashback_scn>;
      
      
    5. プライマリ・データベースをオープンします。

      SQL> STARTUP;
      
      
    6. 元のプライマリ・データベースのデータベース・ガードを低くします。

      SQL> ALTER DATABASE GUARD NONE;
      
      

    この時点で、プライマリの状態はスイッチオーバーのコミット・コマンドが発行される前と同一です。修正処理を実行する必要はありません。スイッチオーバー操作のコミットに進むか、A.5.1.1項で説明するようにスイッチオーバー操作を取り消します。

A.5.2.2 ターゲット・ロジカル・スタンバイ・データベースの変換での障害

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY文の実行中に障害が発生した場合、次の手順を実行します。

  1. ターゲット・スタンバイ・データベースのV$DATABASE固定ビューのDATABASE_ROLE列をチェックします。

    SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
    
    
    • 列にPRIMARYの値が含まれる場合、スイッチオーバー操作は完了していますが、スイッチオーバー後のタスクで障害が発生しています。この場合、次の手順を実行します。

データベースを停止して、再オープンします。ALTER DATABASE GUARD NONEコマンドを発行して、データベースに対する書込み制限を削除します。
  • 新しいプライマリまたは別の新しいプライマリに対するバイスタンダになるための機能が維持されるよう、ロジカル・スタンバイで対処措置を実行します。

    スイッチオーバー操作のコミット中に発生したエラーの基となる原因を修正してSQL文(ALTER DTABASE COMMIT TO SWITCHOVER TO PRIMARY)を再発行します。次の手順を実行して、スイッチオーバーのコミットを試行する直前の一貫性の時点までロジカル・スタンバイ・データベースをフラッシュバックすることもできます。

    1. スイッチオーバーのコミット・コマンドを開始したインスタンスのアラート・ログから、ロジカル・スタンバイへのフラッシュバックに必要なSCNを判別します。この情報は、SQL文ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARYの後に表示されます。

      LOGSTDBY: Preparing the COMMIT TO SWITCHOVER TO PRIMARY DDL at scn 
      [flashback_scn].
    2. ターゲット・スタンバイ・データベースのすべてのインスタンスを停止します。

      SQL> SHUTDOWN IMMEDIATE;
      
      
    3. ターゲット・ロジカル・スタンバイ・データベースをマウントします。

      SQL> STARTUP MOUNT;
      
      
    4. 必要なSCNまでターゲット・ロジカル・スタンバイをフラッシュバックします。

      SQL> FLASHBACK DATABASE TO BEFORE SCN <flashback_scn>;
      
      
    5. データベースをオープンします(Oracle RACの場合、すべてのインスタンスをオープンします)。

      SQL> STARTUP OPEN;
      
      

    この時点で、ターゲット・スタンバイの状態はスイッチオーバーのコミット・コマンドが発行される前と同一です。対処措置を実行する必要はありません。スイッチオーバー操作のコミットに進みます。

    A.6 SQL Applyが停止した場合の処置

    適用サービスでは、サポートされないDML文、DDL文およびオラクル社が提供するパッケージを、SQL Applyが実行されているロジカル・スタンバイ・データベースに適用できません。

    サポートされない文やパッケージが検出されると、SQL Applyは停止します。表A-2で説明する処理を実行して問題を解決した後、ロジカル・スタンバイ・データベースでSQL Applyを再開してください。

    表A-2    一般的なSQL Applyエラーの解決方法 
    エラー  解決方法 

    サポートされない文またはオラクル社が提供するパッケージが検出された可能性を示すエラー 

    DBA_LOGSTDBY_EVENTSビューで、最後の文を検索してください。この結果、SQL Applyの失敗の原因となった文とエラーが表示されます。不適切なSQL文が原因でSQL Applyに失敗した場合は、その文とエラーに関する情報とともにトランザクション情報を表示できます。このトランザクション情報は、問題の原因を正確に判断するためにLogMinerツールで使用できます。 

    データベース管理を要求するエラー(特定の表領域内の領域不足など) 

    問題を解決した後、ALTER DATABASE START LOGICAL STANDBY APPLY文を使用してSQL Applyを再開してください。 

    不適切なSQL文の入力によるエラー(不適切なスタンバイ・データベースのファイル名が表領域文に入力された場合など) 

    適切なSQL文を入力した後、DBMS_LOGSTDBY.SKIP_TRANSACTIONプロシージャを使用して、次回SQL Applyが実行されたときに不適切な文が無視されるようにしてください。その後、ALTER DATABASE START LOGICAL STANDBY APPLY文を使用してSQL Applyを再開してください。 

    不適切なSKIPパラメータの設定によるエラー(特定の表で全DMLがスキップされるように指定したが、CREATEALTERおよびDROP TABLEの各文がスキップされるように指定していないなど) 

    DBMS_LOGSTDBY.SKIP('TABLE','schema_name','table_name',null)プロシージャを発行した後、SQL Applyを再開してください。 

    障害の原因を特定するためにDBA_LOGSTDBY_EVENTSビューを問い合せる方法は、第17章を参照してください。

    A.7 REDOデータ転送のネットワーク調整

    最適なパフォーマンスを得るには、REDO転送サービスで使用される各Oracle Net接続記述子で、Oracle Net SDUパラメータを32KBに設定します。

    次の例は、データベース初期化パラメータ・ファイル内のリモート宛先netservを定義する部分を示します。

    LOG_ARCHIVE_DEST_3='SERVICE=netserv'
    
    

    次の例は、tnsnames.oraファイル内のサービス名の定義を示します。

    netserv=(DESCRIPTION=(SDU=32768)(ADDRESS=(PROTOCOL=tcp)(HOST=host) (PORT=1521)) 
    (CONNECT_DATA=(SERVICE_NAME=srvc)))
    
    

    次の例は、listener.oraファイル内の定義を示します。

    LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)
    (HOST=host)(PORT=1521))))
    
    SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SDU=32768)(SID_NAME=sid)
    (GLOBALDBNAME=srvc)(ORACLE_HOME=/oracle)))
    
    

    待機時間が長いかまたは帯域幅が大きいネットワーク・リンクを使用してリモート・サイトへのアーカイブを行う場合は、Oracle Netプロファイル・パラメータのSQLNET.SEND_BUF_SIZEおよびSQLNET.RECV_BUF_SIZEを使用して、ネットワークの送受信I/Oバッファのサイズを大きくすることでパフォーマンスを改善できます。

    『Oracle Database Net Services管理者ガイド』を参照してください。

    A.8 スタンバイ・データベースのディスクのパフォーマンスが遅い

    ファイル・システム上の非同期I/Oがパフォーマンス上の問題を示している場合は、ダイレクトI/Oオプションを使用してファイル・システムをマウントするか、またはFILESYSTEMIO_OPTIONS=SETALL初期化パラメータを設定します。最大I/Oのサイズ設定は、1MBです。

    A.9 プライマリ・データベースの停止を回避するにはログ・ファイルを一致させる必要がある

    構成内の1つ以上のスタンバイ・データベースでスタンバイREDOログを構成した場合は、各スタンバイ・データベースのスタンバイREDOログ・ファイルのサイズが、プライマリ・データベースのオンラインREDOログ・ファイルのサイズと正確に一致していることを確認してください。

    ログ・スイッチが発生したときに、プライマリ・データベースに新しい現行のオンラインREDOログ・ファイルのサイズと一致する使用可能なスタンバイREDOログ・ファイルがない場合、次のようになります。

    たとえば、プライマリ・データベースで、ログ・ファイルが100KのオンラインREDOログ・グループを2つ使用する場合、スタンバイ・データベースは、ログ・ファイル・サイズが100KのスタンバイREDOログ・グループを3つ持ちます。

    また、REDOログ・グループをプライマリ・データベースに追加した場合は、対応するスタンバイREDOログ・グループをスタンバイ・データベースに追加する必要があります。これにより、プライマリ・データベースが悪影響を受ける可能性が低くなります。これは、ログ・スイッチが発生したときに、必要なサイズのスタンバイREDOログ・ファイルが使用できないためです。

    A.10 ロジカル・スタンバイ・データベースのトラブルシューティング

    この項は、次の項目で構成されています。

    A.10.1 エラーのリカバリ

    ロジカル・スタンバイ・データベースでは、ユーザー表、順序およびジョブがメンテナンスされます。他のオブジェクトをメンテナンスするには、REDOデータ・ストリームにあるDDL文を再発行する必要があリます。

    SQL Applyに障害が発生した場合、エラーはDBA_LOGSTDBY_EVENTS表に記録されます。次の各項では、このようなエラーのリカバリ方法を説明します。

    A.10.1.1 ファイル仕様が含まれているDDLトランザクション

    DDL文は、プライマリ・データベースとロジカル・スタンバイ・データベースでは同じ方法で実行されます。基礎となるファイル構造が両方のデータベースで同じ場合、DDLはスタンバイ・データベース上で予想どおりに実行されます。

    エラーの原因が、ロジカル・スタンバイ・データベース環境に適合しないファイル仕様を含んだDDLトランザクションにある場合は、次の手順を実行して問題を解決してください。

    1. ALTER SESSION DISABLE GUARD文を使用してデータベース・ガードをバイパスし、ロジカル・スタンバイ・データベースへの変更を可能にします。

      SQL> ALTER SESSION DISABLE GUARD;
      
      
    2. 正しいファイル仕様を使用してDDL文を実行し、データベース・ガードを再び使用可能にします。次に例を示します。

      SQL> ALTER TABLESPACE t_table ADD DATAFILE '/dbs/t_db.f' SIZE 100M REUSE;
      SQL> ALTER SESSION ENABLE GUARD;
      
      
    3. ロジカル・スタンバイ・データベースでSQL Applyを開始し、障害が発生したトランザクションをスキップします。

      SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE
        2> SKIP FAILED TRANSACTION;
      
      

    トランザクション障害の原因となった問題を修正し、トランザクションをスキップせずにSQL Applyを再開できる場合があります。たとえば、使用可能領域がすべて使用された場合などです。(DDLトランザクションをスキップするときに、プライマリおよびロジカル・スタンバイ・データベースの内容にずれを生じさせないようにしてください。可能な場合は、スキップされたトランザクションのかわりに補足用トランザクションを手動で実行する必要があります。)

    次の例に、SQL Applyの停止、エラーの修正およびSQL Applyの再開を示します。

    SQL> SET LONG 1000
    SQL> ALTER SESSION SET NLS_DATE_FORMAT  = 'DD-MON-YY HH24:MI:SS';
    
    Session altered.
    
    SQL> SELECT EVENT_TIME, COMMIT_SCN, EVENT, STATUS FROM DBA_LOGSTDBY_EVENTS;
    
    EVENT_TIME              COMMIT_SCN
    ------------------ ---------------
    EVENT
    -------------------------------------------------------------------------------
    STATUS
    -------------------------------------------------------------------------------
    22-OCT-03 15:47:58
    
    ORA-16111: log mining and apply setting up
    
    22-OCT-03 15:48:04          209627
    insert into "SCOTT"."EMP"
    values
       "EMPNO" = 7900,
       "ENAME" = 'ADAMS',
       "JOB" = 'CLERK',
       "MGR" IS NULL,
       "HIREDATE" = TO_DATE('22-OCT-03', 'DD-MON-RR'),
       "SAL" = 950,
       "COMM" IS NULL,
       "DEPTNO" IS NULL
    ORA-01653: unable to extend table SCOTT.EMP by %200 bytes in tablespace T_TABLE
    
    

    この例で、ORA-01653メッセージは、表領域がいっぱいで表を拡張できないことを示しています。問題を修正するには、新しいデータファイルを表領域に追加します。次に例を示します。

    SQL> ALTER TABLESPACE t_table ADD DATAFILE '/dbs/t_db.f' SIZE 60M;
    Tablespace altered.
    
    

    次に、SQL Applyを再開します。

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    Database altered.
    
    

    SQL Applyを再開すると、障害が発生したトランザクションが再実行され、ロジカル・スタンバイ・データベースに適用されます。

    A.10.1.2 DML障害のリカバリ

    DML障害のフィルタ処理には、SKIP_TRANSACTIONプロシージャを使用しないでください。また、スキップされたイベント表にあるDMLのみでなく、トランザクションに関連しているすべてのDMLについても注意が必要です。これが複数の表の原因となります。

    DML障害は通常、特定の表に関する問題を示しています。たとえば、障害が即時に解決できない記憶域の不足に関するエラーであるとします。次の手順は、この問題に応答する1つの方法を示しています。

    1. 表をスキップ・リストに追加することによって、トランザクションではなく、表をバイパスします。

      SQL> EXECUTE DBMS_LOGSTDBY.SKIP('DML','SCOTT','EMP');
      SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
      
      

      この時点から、SCOTT.EMP表に関するDMLアクティビティは適用されません。表は、記憶域の問題を解決した後で修正できます。ただし、表を修正するには、DBMS_LOGSTDBYパッケージ内のプロシージャを実行するための管理者権限がある、プライマリ・データベースへのデータベース・リンクを設定していることが必要です。

    2. プライマリ・データベースへのデータベース・リンクを使用して、ローカルなSCOTT.EMP表を削除し、表を再作成して、データをスタンバイ・データベースに転送します。

      SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
      SQL> EXECUTE DBMS_LOGSTDBY.INSTANTIATE_TABLE('SCOTT','EMP','PRIMARYDB');
      SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
      
      
    3. 新規にインスタンス化された表とデータベースの残りの部分にまたがってビューの一貫性が得られるように、SQL Applyがプライマリ・データベースと一致するまで待機してから、この表を問い合せます。詳細な例は、10.5.5項「ロジカル・スタンバイ・データベースでの表の追加または再作成」を参照してください。

    A.10.2 SQL*Loaderセッションのトラブルシューティング

    Oracle SQL*Loaderには、様々なソースからOracle Databaseにデータをロードする方法が用意されています。この項では、SQL*Loaderユーティリティの一部のSQL Apply関連機能について説明します。

    選択したデータ・ロード方法に関係なく、SQL*Loader制御ファイルには、APPENDおよびREPLACEキーワードを介して、新規データのロード先となるOracle表の現在の内容に対して実行する作業を示す指示が含まれています。次の例に、これらのキーワードをLOAD_STOKという表に使用する方法を示します。

    SQL*LoaderスクリプトでREPLACEキーワードを使用するかわりに、データをロードする前にプライマリ・データベースの表に対してSQL*PlusのTRUNCATE TABLEコマンドを発行することをお薦めします。これは、プライマリ・データベースとスタンバイ・データベースの両方から高速かつ効率的な方法で表のコピーをパージするのと同じ効果があります。これは、TRUNCATE TABLEコマンドはオンラインREDOログ・ファイルに記録され、ロジカル・スタンバイ・データベースでSQL Applyにより発行されるためです。

    SQL*Loaderスクリプトに引き続きREPLACEキーワードを挿入することはできますが、プライマリ・データベースではオブジェクトからの0(ゼロ)行のDELETEが試行されます。プライマリ・データベースから行が削除されていないため、REDOログ・ファイルにREDOは記録されません。したがって、ロジカル・スタンバイ・データベースに対してDELETE文は発行されません。

    SQL文TRUNCATE TABLEを使用せずにREPLACEキーワードを発行すると、トランザクションをロジカル・スタンバイ・データベースに適用する必要がある場合に、SQL Applyに次のような問題が発生する可能性があります。

    A.10.3 長時間実行トランザクションのトラブルシューティング

    SQL Apply環境における長時間実行トランザクションの主な原因の1つは、全表スキャンです。また、索引の作成時や再作成時のように、SQL文がスタンバイ・データベースに複製されるために、長時間実行トランザクションが発生することもあります。

    長時間実行トランザクションの識別

    SQL Applyで1つのSQL文が長時間実行されている場合は、SQL Applyインスタンスのアラート・ログに次のような警告メッセージがレポートされます。

    Mon Feb 17 14:40:15 2003
    WARNING: the following transaction makes no progress
    WARNING: in the last 30 seconds for the given message!
    WARNING: xid =
    0x0016.007.000017b6 cscn = 1550349, message# = 28, slavid = 1
    knacrb: no offending session found (not ITL pressure)
    
    

    この警告メッセージの注意事項は次のとおりです。

    長時間実行文で実行されているSQL文を判別できない場合がありますが、次のSQL文を発行すると、SQL Applyが作業中のデータベース・オブジェクトを識別できます。

    SQL> SELECT SAS.SERVER_ID
      2       , SS.OWNER
      3       , SS.OBJECT_NAME
      4       , SS.STATISTIC_NAME
      5       , SS.VALUE
      6    FROM V$SEGMENT_STATISTICS SS
      7       , V$LOCK L
      8       , V$STREAMS_APPLY_SERVER SAS
      9   WHERE SAS.SERVER_ID = &SLAVE_ID
     10     AND L.SID = SAS.SID
     11     AND L.TYPE = 'TM'
     12     AND SS.OBJ# = L.ID1;
    
    

    また、次のSQL文を発行すると、実行ごとに多数のディスク読取りを発生させたSQL文を識別できます。

    SQL> SELECT SUBSTR(SQL_TEXT,1,40)
      2       , DISK_READS
      3       , EXECUTIONS
      4       , DISK_READS/EXECUTIONS
      5       , HASH_VALUE
      6       , ADDRESS
      7    FROM V$SQLAREA
      8   WHERE DISK_READS/GREATEST(EXECUTIONS,1) > 1
      9     AND ROWNUM < 10
     10   ORDER BY DISK_READS/GREATEST(EXECUTIONS,1) DESC
    
    

    すべての表に主キー制約を定義することをお薦めします。これにより自動的に列がNOT NULLとして定義されます。主キー制約を定義できない表の場合は、NOT NULLとして定義されている適切な列に索引を定義する必要があります。表に適切な列が存在しない場合はその表を見直し、可能な場合はSQL Applyでスキップしてください。

    SCOTTスキーマのFTS表に対して発行されたDML文をすべてスキップする手順は、次のとおりです。

    1. SQL Applyを停止します。

      SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
      Database altered
      
      
    2. SCOTT.FTS表について、すべてのDMLトランザクションのスキップ・プロシージャを構成します。

      SQL> EXECUTE DBMS_LOGSTDBY.SKIP(stmt => 'DML' , -
           schema_name => 'SCOTT' , -
           object_name => 'FTS');
      PL/SQL procedure successfully completed
      
      
    3. SQL Applyを開始します。

      SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
      Database altered
      
    ITLが不十分な状態のトラブルシューティング

    Interested Transaction List(ITL)が不十分な状態は、SQL Applyインスタンスのアラート・ログでレポートされます。例A-3に、警告メッセージの例を示します。

    例A-3    ITLが不十分な状態に関してレポートされる警告メッセージ

    Tue Apr 22 15:50:42 2003
    WARNING: the following transaction makes no progress
    WARNING: in the last 30 seconds for the given message!
    WARNING: xid =
    0x0006.005.000029fa cscn = 2152982, message# = 2, slavid = 17
    
    リアルタイム適用の分析

    例A-3のメッセージは、SQL Applyプロセス(slavid)#17が過去30秒にわたって進捗がなかったことを示しています。適用プロセスにより発行されているSQL文を判別するには、次の問合せを発行します。

    SQL> SELECT SA.SQL_TEXT
      2    FROM V$SQLAREA SA
      3       , V$SESSION S
      4       , V$STREAMS_APPLY_SERVER SAS
      5   WHERE SAS.SERVER_ID = &SLAVEID
      6     AND S.SID = SAS.SID
      7   AND SA.ADDRESS = S.SQL_ADDRESS
    SQL_TEXT
    ------------------------------------------------------------
    insert into "APP"."LOAD_TAB_1" p("PK","TEXT")values(:1,:2)
    
    

    ITLが不十分な状態を識別するには、次の例に示すようにV$LOCKビューを問い合せる方法もあります。TXロックのリクエスト値が4のセッションは、ITLが使用可能になるまで待機中です。

    SQL> SELECT SID,TYPE,ID1,ID2,LMODE,REQUEST
      2    FROM V$LOCK
      3   WHERE TYPE = 'TX'
    
    SID        TY ID1        ID2        LMODE      REQUEST
    ---------- -- ---------- ---------- ---------- ----------
             8 TX     327688         48          6          0
            10 TX     327688         48          0          4
    
    

    この例では、SID 10SID 8が保持しているTXロックを待機中です。

    障害後のレビュー

    セグメントのITLが不十分な状態が長時間続くことはまずありません。また、この状態の継続時間が30秒未満の場合、スタンバイ・データベースのアラート・ログではレポートされません。したがって、ITLが不十分な状態になっているオブジェクトを判別するには、次の文を発行します。

    SQL> SELECT SEGMENT_OWNER, SEGMENT_NAME, SEGMENT_TYPE
      2    FROM V$SEGMENT_STATISTICS
      3   WHERE STATISTIC_NAME = 'ITL WAITS'
      4     AND VALUE > 0
      5   ORDER BY VALUE
    
    

    この文では、インスタンスが前回起動された後にITLが不十分な状態になったことのあるデータベース・セグメントがすべてレポートされます。


    注意

    このSQL文は、Data Guard環境のロジカル・スタンバイ・データベースに限定されません。すべてのOracleデータベースに適用可能です。 


    ITLが不十分な状態の解消

    特定のデータベース・オブジェクトのINITRANSの整数を増やすには、最初にSQL Applyを停止する必要があります。

    関連項目

    INITRANSの整数を指定する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。この整数は、データベース・オブジェクトに割り当てられた各データ・ブロック内で割り当てられる初期の同時トランザクション・エントリ数です。 

    次の例に、appスキーマ内の表load_tab_1INITRANSを増やすための手順を示します。

    1. SQL Applyを停止します。

      SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
      Database altered.
      
      
    2. データベース・ガードを一時的にバイパスします。

      SQL> ALTER SESSION DISABLE GUARD;
      Session altered.
      
      
    3. スタンバイ・データベースでINITRANSを増やします。次に例を示します。

      SQL> ALTER TABLE APP.LOAD_TAB_1 INITRANS 30;
      Table altered
      
      
    4. データベース・ガードを再び使用可能にします。

      SQL> ALTER SESSION ENABLE GUARD;
      Session altered
      
      
    5. SQL Applyを開始します。

      SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
      Database altered.
      
      

    また、スイッチオーバー時に新しいスタンバイ・データベースでエラーが発生しないように、プライマリ・データベースでデータベース・オブジェクトを変更することを考慮してください。

    A.10.4 フラッシュバック・トランザクションでのORA-1403エラーのトラブルシューティング

    SQL Applyが「ORA-1403: データが見つかりません。」エラーを戻す場合は、フラッシュバック・トランザクションを使用して欠落しているデータを再構成できる場合があります。これは、スタンバイ・データベース・インスタンスで指定されているUNDO_RETENTION初期化パラメータに依存します。

    通常、ロジカル・スタンバイ・データベース環境でORA-1403エラーは表示されません。このエラーが発生するのは、SQL Applyの管理対象である表のデータがスタンバイ・データベースで直接変更された後、同じデータがプライマリ・データベースで変更された場合です。

    変更されたデータがプライマリ・データベースで更新されてからロジカル・スタンバイ・データベースで受信されると、SQL Applyはデータのオリジナル・バージョンがスタンバイ・データベースに存在することを確認してから、レコードを更新します。この確認に失敗すると、「ORA-1403: データが見つかりません。」エラーが戻されます。

    初期エラー

    SQL Applyが検証に失敗すると、ロジカル・スタンバイ・データベースのアラート・ログでエラー・メッセージがレポートされ、DBA_LOGSTDBY_EVENTSビューにレコードが挿入されます。

    アラート・ログ内の情報は切り捨てられますが、エラー全体がデータベース・ビューでレポートされます。次に例を示します。

    LOGSTDBY stmt: UPDATE "SCOTT"."MASTER"
      SET
        "NAME" = 'john'
      WHERE 
        "PK" = 1 and 
        "NAME" = 'andrew' and 
        ROWID = 'AAAAAAAAEAAAAAPAAA'
    LOGSTDBY status: ORA-01403: no data found
    LOGSTDBY PID 1006, oracle@staco03 (P004)
    LOGSTDBY XID 0x0006.00e.00000417, Thread 1, RBA 0x02dd.00002221.10
    
    調査

    最初のステップは、エラーの原因となった表の履歴データを分析することです。そのためには、SELECT文のVERSIONS句を使用します。たとえば、プライマリ・データベースで次の問合せを発行できます。

    SELECT VERSIONS_XID
          , VERSIONS_STARTSCN
          , VERSIONS_ENDSCN
          , VERSIONS_OPERATION
          , PK
          , NAME
       FROM SCOTT.MASTER
            VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
      WHERE PK = 1
      ORDER BY NVL(VERSIONS_STARTSCN,0);
    
    VERSIONS_XID     VERSIONS_STARTSCN VERSIONS_ENDSCN V  PK NAME
    ---------------- ----------------- --------------- - --- -------
    03001900EE070000           3492279         3492290 I   1 andrew
    02000D00E4070000           3492290                 D   1 andrew
    
    

    データベースが保持するように構成されているUNDO保存の量(UNDO_RETENTION)と表に対するアクティビティによっては、戻される情報が広範囲にわたり、その量を制限するために構文間でバージョンの変更が必要になる場合があります。

    戻された情報から、レコードが最初にSCN 3492279で挿入され、SCN 3492290でトランザクションID 02000D00E4070000の一部として削除されたことがわかります。

    このトランザクションIDを使用してデータベースを問い合せ、トランザクションの有効範囲を確認する必要があります。そのためにはFLASHBACK_TRANSACTION_QUERYビューを問い合せます。

    SELECT OPERATION
         , UNDO_SQL
      FROM FLASHBACK_TRANSACTION_QUERY
     WHERE XID = HEXTORAW('02000D00E4070000');
    
    OPERATION  UNDO_SQL
    ---------- ------------------------------------------------
    DELETE     insert into "SCOTT"."MASTER"("PK","NAME") values
               ('1','andrew');
    BEGIN
    
    

    トランザクションの開始を表す1行が必ず戻されることに注意してください。このトランザクションでは、マスター表から削除されたのは1行のみです。実行時のUNDO_SQL列では、元のデータが表にリストアされます。

    SQL> INSERT INTO "SCOTT"."MASTER"("PK","NAME") VALUES ('1','ANDREW');
    SQL> COMMIT;
    
    

    SQL Applyを再開すると、トランザクションがスタンバイ・データベースに適用されます。

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    

  • 戻る 次へ
    Oracle
    Copyright © 1999, 2008 Oracle Corporation.

    All Rights Reserved.
    目次
    目次
    索引
    索引