ヘッダーをスキップ

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

E05755-03
目次
目次
索引
索引

戻る 次へ

10 ロジカル・スタンバイ・データベースの管理

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

10.1 SQL Applyアーキテクチャの概要

SQL Applyでは、バックグラウンド・プロセスの集合を使用して、プライマリ・データベースの変更がロジカル・スタンバイ・データベースに適用されます。

図10-1に、情報の流れと各プロセスで実行されるロールを示します。

図10-1    SQL Applyの処理


画像の説明

ログのマイニングおよび適用処理中は、次のように、様々なプロセスとその機能が関係します。

ログのマイニング中には、次のプロセスが実行されます。

適用処理中には、次のプロセスが実行されます。

V$LOGSTDBY_PROCESSビューを問い合せると、SQL Applyプロセスのアクティビティを検査できます。現行のアクティビティに関する情報は、V$LOGSTDBY_STATSビューでも提供されます。このビューには、SQL Applyアクティビティ中のロジカル・スタンバイ・データベースに関する統計、現在の状態およびステータス情報が表示されます。この2つのビューと他の関連ビューの詳細は、10.3項「ロジカル・スタンバイ・データベースの管理および監視関連のビュー」を参照してください。


注意

SQL Applyプロセス(COORDINATORプロセスlsp0を含む)はすべてバックグラウンド・プロセスです。リソース・マネージャによる調整は行われません。そのため、ロジカル・スタンバイ・データベースでリソース・グループを作成しても、SQL Applyプロセスには影響ありません。 


10.1.1 SQL Applyに関する各種の考慮事項

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

10.1.1.1 トランザクション・サイズの考慮事項

SQL Applyでは、トランザクションが大小2つのクラスに分類されます。

すべてのトランザクションは、最初は小さいトランザクションとして分類されます。SQL Applyでは、トランザクションが大きいトランザクションとして再分類されるタイミングは、LCRキャッシュに使用可能なメモリー量と、トランザクションに属するLCRのメモリー使用量に応じて決定します。

10.1.1.2 ページアウトの考慮事項

LCRキャッシュのメモリーがすべて使用され、SQL Applyを進行させるために領域の解放が必要になると、SQL Applyの下でページアウトが発生します。

たとえば、LCRキャッシュに100MBのメモリーが割り当てられている場合に、SQL Applyでサイズが300MBのLONG列を含む表に対するINSERTトランザクションが検出されるとします。この場合、ログ・マイニング・コンポーネントは、LONGデータの最初の部分をページアウトして列変更の後半部分を読み取ります。適切にチューニングされているロジカル・スタンバイ・データベースの場合、ページアウト・アクティビティはほとんど発生せず、システム全体のスループットには影響しません。

関連項目

問題のあるページアウトを識別して修正処理を実行する方法の詳細は、10.5項「ロジカル・スタンバイ・データベースのカスタマイズ」を参照してください。 

10.1.1.3 再開の考慮事項

トランザクションのコミット・レコードがREDOログ・ファイルからマイニングされてロジカル・スタンバイ・データベースに適用されるまで、ロジカル・スタンバイ・データベースに対する変更は永続的な変更になりません。つまり、ユーザー指示の結果であるかシステム障害の結果であるかに関係なく、SQL Applyは停止されるたびに、コミットされていない最も古いトランザクションまで遡って再びマイニングする必要があります。

トランザクションの処理量が小さくても長時間オープン状態になっている場合は、SQL Applyを最初から再開すると非常に高コストになります。これは、SQL Applyではコミットされていない少数のトランザクションのREDOデータを読み取るだけでなく、多数のアーカイブREDOログ・ファイルを再びマイニングする操作が必要になるためです。これを軽減するために、SQL Applyはコミットされていない古いデータのチェックポイントを定期的に実行します。チェックポイントが実行されるSCNは、V$LOGSTDBY_PROGRESSビューのRESTART_SCN列に反映されます。

再開時には、SQL ApplyはRESTART_SCN列に表示される値より大きいSCNで生成されるREDOレコードのマイニングを開始します。再開に不要なアーカイブREDOログ・ファイルは、SQL Applyにより自動的に削除されます。

多数のDDLトランザクション、パラレルDML文(PDML)およびダイレクト・パス・ロードなど、ある種のワークロードがあると、RESTART_SCNはワークロードの存続期間中は進行しなくなります。

10.1.1.4 DML適用の考慮事項

SQL Applyがロジカル・スタンバイ・データベースのスループットと待機時間に影響するDMLトランザクションを適用する場合、次の特性があります。

10.1.1.5 DDL適用の考慮事項

SQL Applyがロジカル・スタンバイ・データベースのスループットと待機時間に影響するDDLトランザクションを適用する場合、次の特性があります。

10.1.1.6 パスワード検証関数

パスワードの複雑性をチェックするパスワード検証関数は、SYSスキーマで作成する必要があります。SQL ApplyはSYSスキーマで作成されたオブジェクトをレプリケートしないため、このような検証関数は、ロジカル・スタンバイ・データベースにレプリケートされません。ロジカル・スタンバイ・データベースでは、パスワード検証関数を手動で作成し、適切なプロファイルと関連付ける必要があります。

10.2 ロジカル・スタンバイ・データベース内の表に対するユーザー・アクセスの制御

SQLのALTER DATABASE GUARD文は、ロジカル・スタンバイ・データベース内の表に対するユーザー・アクセスを制御します。デフォルトでは、ロジカル・スタンバイ・データベースについてはデータベース・ガードがALLに設定されています。

ALTER DATABASE GUARD文では、次のキーワードを使用できます。

たとえば、SQL Applyによってメンテナンスされない表をユーザーが変更できるようにするには、次の文を使用します。

SQL> ALTER DATABASE GUARD STANDBY;

権限を持つユーザーは、ALTER SESSION DISABLE GUARDおよびALTER SESSION ENABLE GUARD文をそれぞれ使用して、現在のセッションでデータベース・ガードを一時的にオフまたはオンにできます。この文は、Oracle9iで同様の機能を行っていたDBMS_LOGSTDBY.GUARD_BYPASS PL/SQLプロシージャにかわるものです。ALTER SESSION [ENABLE|DISABLE] GUARD文は、10.5.4項に説明されているように、データベース・ガードを一時的に無効にしてデータベースを変更するときに役立ちます。


注意

データベース・ガードが無効のときに、プライマリおよびロジカル・スタンバイ・データベースの内容に相違を生じさせないようにしてください。 


10.3 ロジカル・スタンバイ・データベースの管理および監視関連のビュー

次のパフォーマンス・ビューでは、ロジカル・スタンバイ・データベースを保守するSQL Applyの動作が監視されます。次の各項では、ロジカル・スタンバイ・データベースの監視に使用できる主なビューについて説明します。

10.3.1 DBA_LOGSTDBY_EVENTSビュー

DBA_LOGSTDBY_EVENTSビューには、SQL Apply操作中に発生した重要なイベントが記録されます。デフォルトでは、最新の10,000のイベントが記録されます。ただし、記録されるイベントの数は、PL/SQLプロシージャDBMS_LOGSTDBY.APPLY_SET()をコールして変更できます。SQL Applyが突然停止した場合は、このビューにその原因も記録されます。


注意

SQL Applyを停止させるエラーは、イベント表に記録されます。この種のイベントはALERT.LOGファイルにも記録され、テキストにLOGSTDBYキーワードが挿入されます。このビューを問い合せるときは、EVENT_TIME_STAMPCOMMIT_SCNCURRENT_SCNの順に列を選択して、イベントが必要な順序になるようにします。 


このビューは、適用されたDDLトランザクションやスキップされたDDLトランザクションなどの他の情報も表示されるようにカスタマイズできます。次に例を示します。

SQL> ALTER SESSION SET NLS_DATE_FORMAT  = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> COLUMN STATUS FORMAT A60
SQL> SELECT EVENT_TIME, STATUS, EVENT FROM DBA_LOGSTDBY_EVENTS
  2  ORDER BY EVENT_TIMESTAMP, COMMIT_SCN, CURRENT_SCN;

EVENT_TIME         STATUS
------------------------------------------------------------------------------
EVENT
-------------------------------------------------------------------------------
23-JUL-02 18:20:12 ORA-16111: log mining and apply setting up
23-JUL-02 18:25:12 ORA-16128: User initiated shut down successfully completed
23-JUL-02 18:27:12 ORA-16112: log mining and apply stopping
23-JUL-02 18:55:12 ORA-16128: User initiated shut down successfully completed
23-JUL-02 18:57:09 ORA-16111: log mining and apply setting up
23-JUL-02 20:21:47 ORA-16204: DDL successfully applied
create table hr.test_emp (empno number, ename varchar2(64))
23-JUL-02 20:22:55 ORA-16205: DDL skipped due to skip setting 
create database link link_to_boston connect to system identified by change_on_inst
7 rows selected.

この問合せは、SQL Applyの開始と停止が数回繰り返されたことを示しています。適用されたDDLとスキップされたDDLも示しています。

10.3.2 DBA_LOGSTDBY_LOGビュー

DBA_LOGSTDBY_LOGビューには、SQL Applyで処理中のアーカイブ・ログに関する動的な情報が表示されます。

次に例を示します。

SQL> COLUMN DICT_BEGIN FORMAT A10;
SQL> SET NUMF 99999999
SQL> SELECT FILE_NAME, SEQUENCE# AS SEQ#, FIRST_CHANGE# AS F_SCN#, -
     NEXT_CHANGE# AS N_SCN#, TIMESTAMP, -
     DICT_BEGIN AS BEG, DICT_END AS END, -
     THREAD# AS THR#, APPLIED FROM DBA_LOGSTDBY_LOG -
     ORDER BY SEQUENCE#;
FILE_NAME                 SEQ# F_SCN    N_SCN TIMESTAM BEG END THR# APPLIED
------------------------- ---- ------- ------- -------- --- --- --- ---------
/oracle/dbs/hq_nyc_2.log  2     101579  101588 11:02:58 NO  NO  1     YES
/oracle/dbs/hq_nyc_3.log  3     101588  142065 11:02:02 NO  NO  1     YES
/oracle/dbs/hq_nyc_4.log  4     142065  142307 11:02:10 NO  NO  1     YES
/oracle/dbs/hq_nyc_5.log  5     142307  142739 11:02:48 YES YES 1     YES
/oracle/dbs/hq_nyc_6.log  6     142739  143973 12:02:10 NO  NO  1     YES
/oracle/dbs/hq_nyc_7.log  7     143973  144042 01:02:11 NO  NO  1     YES
/oracle/dbs/hq_nyc_8.log  8     144042  144051 01:02:01 NO  NO  1     YES
/oracle/dbs/hq_nyc_9.log  9     144051  144054 01:02:16 NO  NO  1     YES
/oracle/dbs/hq_nyc_10.log 10    144054  144057 01:02:21 NO  NO  1     YES
/oracle/dbs/hq_nyc_11.log 11    144057  144060 01:02:26 NO  NO  1  CURRENT
/oracle/dbs/hq_nyc_12.log 12    144060  144089 01:02:30 NO  NO  1  CURRENT
/oracle/dbs/hq_nyc_13.log 13    144089  144147 01:02:41 NO  NO  1       NO

BEGおよびEND列のエントリYESは、LogMinerディクショナリの作成がログ・ファイルの順序番号5で開始したことを示しています。最新のアーカイブREDOログ・ファイルは順序番号13で、ロジカル・スタンバイ・データベースでは1時2分41秒に受信されています。

APPLIED列は、SQL ApplyによりSCN 144057までのREDOがすべて適用されたことを示しています。トランザクションでは複数のアーカイブ・ログ・ファイルを使用している可能性があるため、複数のアーカイブ・ログ・ファイルのAPPLIED列に値CURRENTが表示されることがあります。

10.3.3 V$DATAGUARD_STATSビュー

このビューには、ロジカル・スタンバイ・データベースのフェイルオーバー特性に関連する次のような情報が表示されます。

次に例を示します。

SQL> COL NAME FORMAT A20
SQL> COL VALUE FORMAT A12
SQL> COL UNIT FORMAT A30
SQL> SELECT NAME, VALUE, UNIT FROM V$DATAGUARD_STATS;
 
NAME                 VALUE        UNIT
-------------------- ------------ ------------------------------
apply finish time    +00 00:00:00 day(2) to second(1) interval
apply lag            +00 00:00:00 day(2) to second(0) interval
transport lag        +00 00:00:00 day(2) to second(0) interval

この出力は、プライマリ・データベースから生成されたすべてのREDOを受信および適用したロジカル・スタンバイ・データベースからの出力です。

10.3.4 V$LOGSTDBY_PROCESSビュー

このビューには、次のように、SQL Apply関連の各種プロセスの現在の状態に関する情報が表示されます。

次に例を示します。

SQL> COLUMN SERIAL# FORMAT 9999
SQL> COLUMN SID FORMAT 9999
SQL> SELECT SID, SERIAL#, SPID, TYPE, HIGH_SCN FROM V$LOGSTDBY_PROCESS;
 
  SID   SERIAL#   SPID         TYPE            HIGH_SCN
  ----- -------   ----------- ---------------- ----------
   48        6    11074        COORDINATOR     7178242899
   56       56    10858        READER          7178243497
   46        1    10860        BUILDER         7178242901
   45        1    10862        PREPARER        7178243295
   37        1    10864        ANALYZER        7178242900
   36        1    10866        APPLIER         7178239467
   35        3    10868        APPLIER         7178239463
   34        7    10870        APPLIER         7178239461
   33        1    10872        APPLIER         7178239472
 
9 rows selected.

HIGH_SCN列は、READERプロセスが他のすべてのプロセスに先行することと、PREPARERおよびBUILDERプロセスが残りのプロセスに先行することを示しています。

SQL> COLUMN STATUS FORMAT A40
SQL> SELECT TYPE, STATUS_CODE, STATUS FROM V$LOGSTDBY_PROCESS;
 
TYPE             STATUS_CODE STATUS
---------------- ----------- -----------------------------------------
COORDINATOR            16117 ORA-16117: processing
READER                 16127 ORA-16127: stalled waiting for additional
                             transactions to be applied
BUILDER                16116 ORA-16116: no work available
PREPARER               16116 ORA-16117: processing
ANALYZER               16120 ORA-16120: dependencies being computed for
                             transaction at SCN 0x0001.abdb440a
APPLIER                16124 ORA-16124: transaction 1 13 1427 is waiting
                             on another transaction
APPLIER                16121 ORA-16121: applying transaction with commit
                             SCN 0x0001.abdb4390
APPLIER                16123 ORA-16123: transaction 1 23  1231 is waiting
                             for commit approval
APPLIER                16116 ORA-16116: no work available

出力は、実行中のSQL Applyのスナップショットを示しています。マイニング側では、READERプロセスはさらに読み取れるように追加のメモリーが使用可能になるまで待機中で、PREPARERプロセスはREDOレコードの処理中、BUILDERプロセスに使用可能な作業はありません。適用側では、COORDINATORAPPLIERプロセスにさらにトランザクションを割当中で、ANALYZERはSCN 7178241034で依存性を計算中、APPLIERの1つは使用可能な作業がなく、2つにはまだ満たされていない未処理の依存性があります。

関連項目

出力例は10.4.1項「SQL Applyの進捗の監視」を参照してください。 

10.3.5 V$LOGSTDBY_PROGRESSビュー

このビューには、次のように、SQL Applyの進捗に関する詳細情報が表示されます。

次に例を示します。

SQL> SELECT APPLIED_SCN, LATEST_SCN, MINING_SCN, RESTART_SCN FROM V$LOGSTDBY_PROGRESS;
 
APPLIED_SCN  LATEST_SCN MINING_SCN RESTART_SCN
----------- ----------- ---------- -----------
 7178240496  7178240507 7178240507  7178219805

この出力は次のことを示しています。

この出力は次のことを示しています。

10.3.6 V$LOGSTDBY_STATEビュー

このビューには、次のように、SQL Applyの現在の状態の概要が表示されます。

次に例を示します。

SQL> COLUMN REALTIME_APPLY FORMAT a15
SQL> COLUMN STATE FORMAT a16
SQL> SELECT * FROM V$LOGSTDBY_STATE;

PRIMARY_DBID SESSION_ID REALTIME_APPLY  STATE
------------ ---------- --------------- ----------------
  1562626987          1 Y               APPLYING

この出力は、SQL Applyがリアルタイム適用モードで実行中で、現在はプライマリ・データベースから受信したREDOデータを適用中であり、プライマリ・データベースのDBIDが1562626987で、SQL Applyセッションに関連付けられているLogMinerセッションIDが1であることを示しています。

関連項目

出力例は10.4.1項「SQL Applyの進捗の監視」を参照してください。 

10.3.7 V$LOGSTDBY_STATSビュー

V$LOGSTDBY_STATSビューには、SQL Applyに関連する統計、現行の状態およびステータス情報が表示されます。SQL Applyが実行されていない場合、このビューからは1行も戻されません。このビューは、ロジカル・スタンバイ・データベースの下でのみ意味があります。

次に例を示します。

 SQL> ALTER SESSION SET_NLS_DATE_FORMAT='dd-mm-yyyy hh24:mi:ss';
Session altered

SQL> SELECT SUBSTR(name, 1, 40) AS NAME, SUBSTR(value,1,32) AS VALUE FROM V$LOGSTDBY_STATS;

NAME VALUE
---------------------------------------- --------------------------------
logminer session id 1
number of preparers 1
number of appliers 5
server processes in use 9
maximum SGA for LCR cache (MB) 30
maximum events recorded 10000
preserve commit order TRUE
transaction consistency FULL
record skipped errors Y
record skipped DDLs Y
record applied DDLs N
record unsupported operations N
realtime apply Y
apply delay (minutes) 0
coordinator state APPLYING
coordinator startup time 19-06-2007 09:55:47
coordinator uptime (seconds) 3593
txns received from logminer 56
txns assigned to apply 23
txns applied 22
txns discarded during restart 33
large txns waiting to be assigned 2
rolled back txns mined 4
DDL txns mined 40
CTAS txns mined 0
bytes of redo mined 60164040
bytes paged out 0
pageout time (seconds) 0
bytes checkpointed 4845
checkpoint time (seconds) 0
system idle time (seconds) 2921
standby redo logs mined 0
archived logs mined 5
gap fetched logs mined 0
standby redo log reuse detected 1
logfile open failures 0
current logfile wait (seconds) 0
total logfile wait (seconds) 2910
thread enable mined 0
thread disable mined 0
.
40 rows selected.

10.4 ロジカル・スタンバイ・データベースの監視

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

10.4.1 SQL Applyの進捗の監視

SQL Applyには、6つの進捗状況があります。SQL Applyの初期化、ディクショナリ・ログの待機、LogMinerディクショナリのロード、(REDOデータの)適用、アーカイブ・ギャップの解決の待機およびアイドルです。図10-2に、これらの状態の流れを示します。

図10-2    SQL Apply処理中の進捗状態


画像の説明

次の各項では、それぞれの状態を詳細に説明します。

初期化中状態

ALTER DATABASE START LOGICAL STANDBY APPLY文を発行してSQL Applyを開始すると、初期化中状態になります。

SQL Applyの現在の状態を判断するには、V$LOGSTDBY_STATEビューを問い合せます。次に例を示します。

SQL> SELECT SESSION_ID, STATE FROM V$LOGSTDBY_STATE;

SESSION_ID    STATE
----------    -------------
1             INITIALIZING

SESSION_ID列は、SQL Applyにより作成された永続LogMinerセッションを示します。このセッションで、プライマリ・データベースで生成されたアーカイブREDOログ・ファイルがマイニングされます。

ディクショナリ・ログ待機中

SQL Applyは、初回の開始時に、REDOログ・ファイルで取得されたLogMinerディクショナリをロードする必要があります。SQL Applyは、LogMinerディクショナリのロードに必要なREDOデータをすべて受信するまで、WAITING FOR DICTIONARY LOGS状態にとどまります。

ディクショナリ・ロード中状態

ディクショナリ・ロード中状態は、しばらく継続する場合があります。大規模データベースでLogMinerディクショナリをロードするには、長時間かかることがあります。V$LOGSTDBY_STATEビューを問い合せると、ディクショナリのロード中は次の出力が戻されます。

SQL> SELECT SESSION_ID, STATE FROM V$LOGSTDBY_STATE;

SESSION_ID    STATE
----------    ------------------
1             LOADING DICTIONARY

LogMinerディクショナリが完全にロードされるまでに起動されるのは、COORDINATORプロセスとマイニング・プロセスのみです。したがって、この時点でV$LOGSTDBY_PROCESSを問い合せると、APPLIERプロセスは表示されません。次に例を示します。

SQL> SELECT SID, SERIAL#, SPID, TYPE FROM V$LOGSTDBY_PROCESS;

SID     SERIAL#     SPID       TYPE
------  ---------   ---------  ---------------------
47      3           11438      COORDINATOR
50      7           11334      READER
45      1           11336      BUILDER
44      2           11338      PREPARER
43      2           11340      PREPARER

V$LOGMNR_DICTIONARY_LOADビューを問い合せると、ディクショナリ・ロードの進捗に関する詳細情報を取得できます。ディクショナリ・ロードは、次の3つのフェーズで発生します。

  1. LogMinerディクショナリのロードに関連するREDO変更を収集するために、関連アーカイブREDOログ・ファイルまたはスタンバイREDOログ・ファイルがマイニングされます。

  2. 変更が処理され、データベース内のステージング表にロードされます。

  3. 一連のDDL文が発行されて、LogMinerディクショナリ表がロードされます。

次に例を示します。

SQL> SELECT PERCENT_DONE, COMMAND
     FROM   V$LOGMNR_DICTIONARY_LOAD
     WHERE  SESSION_ID = (SELECT SESSION_ID FROM V$LOGSTDBY_STATE);

PERCENT_DONE     COMMAND
-------------    -------------------------------
40               alter table SYSTEM.LOGMNR_CCOL$ exchange partition 
                 P101 with table SYS.LOGMNRLT_101_CCOL$ excluding
                 indexes without validation

PERCENT_DONEまたはCOMMAND列が長時間変化しない場合は、V$SESSION_LONGOPSビューを問い合せ、問題のDDLトランザクションの進捗を監視してください。

適用中状態

この状態では、SQL ApplyはLogMinerディクショナリの初期スナップショットを正常にロードしており、現在はロジカル・スタンバイ・データベースにREDOデータを適用中です。

SQL Applyの進捗の詳細情報を確認するには、次のようにV$LOGSTDBY_PROGRESSビューを問い合せます。

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SQL> SELECT APPLIED_TIME, APPLIED_SCN, MINING_TIME, MINING_SCN,
     FROM V$LOGSTDBY_PROGRESS;

APPLIED_TIME            APPLIED_SCN   MINING_TIME           MINING_SCN
--------------------    -----------   --------------------  -----------
10-JAN-2005 12:00:05    346791023     10-JAN-2005 12:10:05  3468810134

プライマリ・データベース上でAPPLIED_SCN(またはAPPLIED_TIME)以前に表示されるコミット済トランザクションは、すべてロジカル・スタンバイ・データベースに適用されています。マイニング・エンジンは、プライマリ・データベースでMINING_SCN(およびMINING_TIME)以前に生成されたREDOレコードをすべて処理しています。安定状態では、MINING_SCN(およびMINING_TIME)は常にAPPLIED_SCN(およびAPPLIED_TIME)よりも前の値を示します。

ギャップ待機中状態

この状態が発生するのは、SQL Applyが使用可能な全REDOレコードのマイニングと適用を完了し、RFSプロセスによる新規ログ・ファイル(または欠落しているログ・ファイル)のアーカイブを待機している場合です。

SQL> SELECT STATUS FROM V$LOGSTDBY_PROCESS WHERE TYPE = 'READER';

STATUS
------------------------------------------------------------------------
ORA:01291 Waiting for logfile
アイドル状態

SQL Applyは、プライマリ・データベースで生成されたREDOをすべて適用し終わると、この状態になります。

10.4.2 ログ・ファイルの自動削除

外部アーカイブ・ログには、プライマリ・データベースから送信されたREDOが含まれています。外部アーカイブ・ログの格納には次の2つの方法があります。

フラッシュ・リカバリ領域内に格納される外部アーカイブ・ログは、必ずSQL Applyによって管理されます。ログに含まれるすべてのREDOレコードは、ロジカル・スタンバイ・データベースでの適用後、DB_FLASHBACK_RETENTION_TARGETパラメータで指定された期間(DB_FLASHBACK_RETENTION_TARGETが指定されていない場合は1440分間)保持されます。フラッシュ・リカバリ領域内に格納されている外部アーカイブ・ログの自動管理は上書きできません。

フラッシュ・リカバリ領域内に格納されない外部アーカイブ・ログは、デフォルトではSQL Applyによって管理されます。自動管理下では、フラッシュ・リカバリ領域内に格納されない外部アーカイブ・ログは、ログに含まれるすべてのREDOレコードがロジカル・スタンバイ・データベースで適用された後、LOG_AUTO_DEL_RETENTION_TARGETパラメータで指定された期間保持されます。フラッシュ・リカバリ領域内に格納されない外部アーカイブ・ログの自動管理は、次のPL/SQLプロシージャを実行すると上書きできます。

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('LOG_AUTO_DELETE', FALSE);


注意

DBMS_LOGTSDBY.APPLY_SETプロシージャは、このパラメータの設定に使用します。LOG_AUTO_DEL_RETENTION_TARGETを明示的に指定しないと、ロジカル・スタンバイ・データベースに設定されたDB_FLASHBACK_RETENTION_TARGETにデフォルトで設定されます。DB_FLASHBACK_RETENTION_TARGETが設定されていない場合は、1440分に設定されます。 


デフォルトの自動ログ削除機能を上書きする場合は、定期的に次の手順を実行してSQL Applyで不要になったアーカイブREDOログ・ファイルを識別し、削除します。

  1. 不要になったメタデータのロジカル・スタンバイ・セッションを消去するには、次のPL/SQL文を入力します。

    SQL> EXECUTE DBMS_LOGSTDBY.PURGE_SESSION;
    
    

    この文では、不要になったアーカイブREDOログ・ファイルを表示するDBA_LOGMNR_PURGED_LOGビューも更新されます。

  2. DBA_LOGMNR_PURGED_LOGビューを問い合せて、削除できるアーカイブREDOログ・ファイルのリストを表示します。

    SQL> SELECT * FROM DBA_LOGMNR_PURGED_LOG;
    
       FILE_NAME
       ------------------------------------
       /boston/arc_dest/arc_1_40_509538672.log
       /boston/arc_dest/arc_1_41_509538672.log
       /boston/arc_dest/arc_1_42_509538672.log
       /boston/arc_dest/arc_1_43_509538672.log
       /boston/arc_dest/arc_1_44_509538672.log
       /boston/arc_dest/arc_1_45_509538672.log
       /boston/arc_dest/arc_1_46_509538672.log
       /boston/arc_dest/arc_1_47_509538672.log
    
    
  3. オペレーティング・システム固有のコマンドを使用して、問合せにより表示されたアーカイブREDOログ・ファイルを削除します。

10.5 ロジカル・スタンバイ・データベースのカスタマイズ

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

10.5.1 DBA_LOGSTDBY_EVENTSビューでのイベントのロギングのカスタマイズ

DBA_LOGSTDBY_EVENTSビューは、SQL Applyの下で発生する重要な最新イベントを含む循環型ログとみなすことができます。デフォルトでは、最新の10,000イベントがイベント・ビューに記録されます。ログに記録されるイベント数は、DBMS_LOGSTDBY.APPLY_SETプロシージャを起動して変更できます。たとえば、最新の100,000イベントを確実に記録するには、次の文を発行できます。

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET ('MAX_EVENTS_RECORDED', '100000');

SQL Applyの停止原因となったエラーは、SYSTEM表領域に十分な領域があるかぎり、必ずDBA_LOGSTDBY_EVENTSビューに記録されます。これらのイベントは常にアラート・ファイルにも格納され、テキストにはLOGSTDBYというキーワードが含まれます。このビューを問い合せるときは、EVENT_TIMECOMMIT_SCNCURRENT_SCNの順に列を選択してください。この順序によって、停止障害がビューの最後に表示されます。

次の例では、ビューに記録されるイベントを指定するDBMS_LOGSTDBYサブプログラムを示します。

例1    DDL文が適用されたかどうかを判断する

たとえば、適用済DDLトランザクションをDBA_LOGSTDBY_EVENTSビューに記録するには、次の文を発行します。

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET ('RECORD_APPLIED_DDL', 'TRUE');
例2    サポートされない操作がないかDBA_LOGSTDBY_EVENTSビューをチェックする

プライマリ・データベースで実行されていて、ロジカル・スタンバイ・データベースでサポートされないトランザクションに関する情報を取得するには、次の文を発行します。

SQL> EXEC DBMS_LOGSTDBY.APPLY_SET('RECORD_UNSUPPORTED_OPERATIONS', 'TRUE'); 

次に、サポートされない操作がないかDBA_LOGSTDBY_EVENTSビューをチェックします。通常、サポートされない表に対する操作は、SQL Applyによって警告なしで無視されます。しかし、ローリング・アップグレード中(スタンバイ・データベースが上位バージョンであり、下位バージョンのプライマリ・データベースによって生成されたREDOをマイニングしているとき)に、サポートされない操作をプライマリ・データベースに対して実行した場合、ロジカル・スタンバイ・データベースにスイッチオーバーされない可能性があります。Data Guardは、表ごとに1つ以上のサポートされない操作をDBA_LOGSTDBY_EVENTSビューに記録します。ローリング・アップグレードの詳細は、第12章「SQL Applyを使用したOracle Databaseのアップグレード」を参照してください。

10.5.2 DBMS_LOGSTDBY.SKIPによる特定のスキーマ・オブジェクトに対する変更の防止

デフォルトでは、プライマリ・データベース内でサポートされる表は、すべてロジカル・スタンバイ・データベースで複製されます。このデフォルト動作は、特定の表に対する変更の適用をスキップするルールを指定することで変更できます。たとえば、HR.EMPLOYEES表に対する変更を省略するには、特定の表に対するDML変更とDDL変更の適用を防止するルールを指定できます。次に例を示します。

  1. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    
    
  2. SKIPルールを登録します。

    SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'DML', schema_name => 'HR', -
               object_name => 'EMPLOYEES');
    SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'SCHEMA_DDL', schema_name => 'HR', -
               object_name => 'EMPLOYEES');
    
    
  3. SQL Applyを開始します。

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    

10.5.3 DDL文のスキップ・ハンドラの設定

特定のDDL文をインターセプトして元のDDL文を別のDDL文で置き換えるプロシージャを作成できます。たとえば、ロジカル・スタンバイ・データベース内のファイル・システムの編成がプライマリ・データベースとは異なる場合、DBMS_LOGSTDBY.SKIPプロシージャを作成し、ファイルを指定してDDLトランザクションを透過的に処理できます。

次のプロシージャでは、ファイル指定文字列に特定のネーミング規則を使用するかぎり、プライマリ・データベースとスタンバイ・データベース間で異なるファイル・システム編成を処理できます。

  1. 次のように、表領域のDDLトランザクションを処理するスキップ・プロシージャを作成します。

    CREATE OR REPLACE PROCEDURE SYS.HANDLE_TBS_DDL ( 
      OLD_STMT  IN  VARCHAR2, 
      STMT_TYP  IN  VARCHAR2, 
      SCHEMA    IN  VARCHAR2, 
      NAME      IN  VARCHAR2, 
      XIDUSN    IN  NUMBER, 
      XIDSLT    IN  NUMBER, 
      XIDSQN    IN  NUMBER, 
      ACTION    OUT NUMBER, 
      NEW_STMT  OUT VARCHAR2 
    ) AS 
    BEGIN 
      
    -- All primary file specification that contains a directory 
    -- /usr/orcl/primary/dbs 
    -- should go to /usr/orcl/stdby directory specification
     
     
      NEW_STMT := REPLACE(OLD_STMT, 
                         '/usr/orcl/primary/dbs', 
                         '/usr/orcl/stdby');
     
      ACTION := DBMS_LOGSTDBY.SKIP_ACTION_REPLACE;
     
    EXCEPTION
      WHEN OTHERS THEN
        ACTION := DBMS_LOGSTDBY.SKIP_ACTION_ERROR;
        NEW_STMT := NULL;
    END HANDLE_TBS_DDL; 
    
    
  2. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    
    
  3. スキップ・プロシージャをSQL Applyに登録します。

    SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'TABLESPACE', -
                 proc_name => 'sys.handle_tbs_ddl');
    
  4. SQL Applyを開始します。

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    

10.5.4 ロジカル・スタンバイ・データベースの変更

ロジカル・スタンバイ・データベースは、SQL文が適用されている間でもレポート・アクティビティに使用できます。データベース・ガードはロジカル・スタンバイ・データベース内の表に対するユーザー・アクセスを制御し、ALTER SESSION DISABLE GUARD文はデータベース・ガードをバイパスしてロジカル・スタンバイ・データベース内の表に対する変更を可能にするために使用します。


注意

ロジカル・スタンバイ・データベースを使用して、独自に他の表を作成すると同時にプライマリ・データベースからレプリケートされるデータを処理する他のアプリケーションをホスト管理するには、データベース・ガードをSTANDBYに設定する必要があります。このようなアプリケーションがシームレスに動作するには、PRESERVE_COMMIT_ORDERTRUE(SQL Applyのデフォルト設定)に設定して実行する必要があります。(DBMS_LOGSTDBY PL/SQLパッケージのPRESERVE_COMMIT_ORDERパラメータの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。)

次のSQL文を発行して、データベース・ガードをSTANDBYに設定します。

SQL> ALTER DATABASE GUARD STANDBY;

このガード設定では、プライマリ・データベースからレプリケートされる表は、ユーザーによる変更から保護されますが、スタンバイ・データベースに作成された表は、ロジカル・スタンバイで実行されているアプリケーションで変更できます。 


デフォルトでは、ロジカル・スタンバイ・データベースはデータベース・ガードがALL(最も限定的な設定)に設定されている状態で作動し、ユーザーはデータベースに対して変更を実行できません。データベース・ガードを無視して、ロジカル・スタンバイ・データベースを変更可能にするには、ALTER SESSION DISABLE GUARD文を実行します。権限を付与されているユーザーは、この文を発行して、現行のセッションでデータベース・ガードをオフにできます。

次の各項で、例を示します。これらの例では、データベース・ガードがALLまたはSTANDBYに設定されていると仮定しています。

10.5.4.1 ロジカル・スタンバイ・データベースでのDDLの実行

この項では、SQL Applyを介してメンテナンスされている表に制約を追加する方法を説明します。

デフォルトでは、SYS権限を持つアカウントのみがデータベースを変更でき、データベース・ガードはALLまたはSTANDBYに設定されています。SYSTEMまたは権限を付与されている別のアカウントでログインした場合、最初はセッションに対するデータベース・ガードをバイパスしていないので、ロジカル・スタンバイ・データベースではDDL文を発行できません。

次の例は、SQL Applyを停止し、データベース・ガードをバイパスしてロジカル・スタンバイ・データベースでSQL文を実行した後、データベース・ガードを再び使用可能にする方法を示しています。この例では、部分一致の問合せを高速化するために、soundex索引がSCOTT.EMPのsurname列に追加されます。soundex索引をプライマリ・サーバーで保持すると、非常に高コストになる場合があります。

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
Database altered.

SQL> ALTER SESSION DISABLE GUARD;
PL/SQL procedure successfully completed.

SQL> CREATE INDEX EMP_SOUNDEX ON SCOTT.EMP(SOUNDEX(ENAME));
Table altered.

SQL> ALTER SESSION ENABLE GUARD;
PL/SQL procedure successfully completed.

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

SQL> SELECT ENAME,MGR FROM SCOTT.EMP WHERE SOUNDEX(ENAME) = SOUNDEX('CLARKE');

ENAME            MGR
----------       ----------
CLARK             7839

オラクル社では、データベース・ガードのバイパスが使用可能になっている間は、SQL Applyにより保守される表に対してDML操作を実行しないことをお薦めします。DML操作を実行すると、プライマリ・データベースとスタンバイ・データベース間で違いが生じ、ロジカル・スタンバイ・データベースをメンテナンスできないようになります。

10.5.4.2 SQL Applyでメンテナンスされていない表の変更

場合によっては、レポート生成アプリケーションが、要約した結果を収集してその結果を一時的に格納したり、レポートが実行された回数を追跡する必要があります。アプリケーションの主な目的はレポート・アクティビティを実行することですが、ロジカル・スタンバイ・データベースに対してDML(挿入、更新および削除)操作の発行が必要な場合があります。さらに、アプリケーションで表の作成や削除が必要になることもあります。

データがSQL Applyを介してメンテナンスされていない場合は、レポート生成操作でデータを変更できるように、データベース・ガードを設定できます。次の設定を行う必要があります。

次の例では、レポートによって書込みが行われる表がプライマリ・データベース上にあると仮定しています。

この例では、SQL Applyを停止し、表をスキップした後、SQL Applyを再開しています。この操作によって、レポート生成アプリケーションは、HRTESTEMP%に書込みができるようになります。スキップされた表は、SQL Applyでメンテナンスされません。

SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
Database altered.

SQL> EXECUTE DBMS_LOGSTDBY.SKIP(stmt => 'SCHEMA_DDL',-
     schema_name => 'HR', -
     object_name => 'TESTEMP%');
PL/SQL procedure successfully completed.

SQL> EXECUTE DBMS_LOGSTDBY.SKIP('DML','HR','TESTEMP%');
PL/SQL procedure successfully completed.

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

SQL Applyでは、開始後に、新しく指定されてスキップ・ルールに追加された表について、スタンバイ・データベースのメタデータを更新する必要があります。SQL Applyによりメタデータが更新される前に、新しくスキップされる表を変更しようとすると失敗します。追加したばかりのSKIPルールがSQL Applyで正常に考慮されたかどうかは、次の問合せを発行すると確認できます。

SQL> SELECT VALUE FROM DBA_LOGSDTBY_PARAMETERS 
     WHERE NAME = 'GUARD_STANDBY';

VALUE
---------------
Ready  

VALUE列にReadyと表示される場合、SQL Applyではスキップされる表の関連メタデータがすべて正常に更新されており、その表を変更しても安全です。

関連項目

C.11項「ロジカル・スタンバイ・データベースでサポートされるDDL文」および『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOGSTDBYパッケージに関する項 

10.5.5 ロジカル・スタンバイ・データベースでの表の追加または再作成

通常、リカバリ不能な操作の後に表を再作成するには、DBMS_LOGSTDBY.INSTANTIATE_TABLEプロシージャを使用します。また、このプロシージャを使用して、以前はスキップしていた表に対してSQL Applyを使用可能にすることもできます。

表を作成する前に、4.1.2項「プライマリ・データベース内の表の行が一意に識別できることの確認」に記載されている要件を満たす必要があります。その後、次の手順に従って表HR.EMPLOYEESを再作成し、SQL Applyを再開できます。この手順は、プライマリ・データベースにアクセスするデータベース・リンクBOSTONが定義済であることを前提としています。

次のリストは、表を再作成し、その表に対してSQL Applyを再開する方法を示しています。

  1. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    
    
  2. DBA_LOGSTDBY_SKIPビューを問い合せ、問題の表で操作がスキップされていないことを確認します。

    SQL> SELECT * FROM DBA_LOGSTDBY_SKIP;
    ERROR  STATEMENT_OPT        OWNER          NAME                PROC
    -----  -------------------  -------------  ----------------    -----
    N      SCHEMA_DDL           HR             EMPLOYEES
    N      DML                  HR             EMPLOYEES
    N      SCHEMA_DDL           OE             TEST_ORDER
    N      DML                  OE             TEST_ORDER
    
    

    ロジカル・スタンバイ・データベース上で再作成する表には、すでにスキップ・ルールが関連付けられているため、最初にそのルールを削除する必要があります。そのためには、DBMS_LOGSTDBY.UNSKIPプロシージャをコールします。次に例を示します。

    SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP(stmt => 'DML', -
         schema_name => 'HR', -
         object_name => 'EMPLOYEES');
    
    SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP(stmt => 'SCHEMA_DDL', -
         schema_name => 'HR', -
         object_name => 'EMPLOYEES');
    
    
  3. DBMS_LOGSTDBY.INSTANTIATE_TABLEプロシージャを使用し、ロジカル・スタンバイ・データベースの全データを使用して表HR.EMPLOYEESを再作成します。次に例を示します。

    SQL> EXECUTE DBMS_LOGSTDBY.INSTANTIATE_TABLE(schema_name => 'HR', -
         object_name => 'EMPLOYEES', -
         dblink => 'BOSTON');
    
    
  4. SQL Applyを開始します。

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    
    

    関連項目

    DBMS_LOGSTDBY.UNSKIPおよびDBMS_LOGSTDBY.INSTANTIATE_TABLEプロシージャの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 

新規にインスタンス化された表とデータベースの残りの部分にまたがってビューの一貫性が得られるように、SQL Applyがプライマリ・データベースと一致するまで待機してから、この表を問い合せます。手順は次のとおりです。

  1. プライマリ・データベースで、V$DATABASEビューを問い合せて現在のSCNを判別します。

    SQL> SELECT CURRENT_SCN FROM V$DATABASE@BOSTON;
    CURRENT_SCN
    ---------------------
    345162788
    
    
  2. 前の問合せで戻されたCURRENT_SCNより前のコミット済のトランザクションがすべて、SQL Applyにより適用されていることを確認します。

    SQL> SELECT APPLIED_SCN FROM V$LOGSTDBY_PROGRESS;
    
    APPLIED_SCN
    --------------------------
    345161345
    
    

    この問合せで戻されたAPPLIED_SCNが最初の問合せで戻されたCURRENT_SCNよりも大きい場合は、新規に再作成された表を問い合せても安全です。

10.6 ロジカル・スタンバイ・データベースの下での特定のワークロードの管理

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

10.6.1 プライマリ・データベースへのトランスポータブル表領域のインポート

表領域をプライマリ・データベースにインポートする手順は、次のとおりです。

  1. ロジカル・スタンバイ・データベースを変更できるように、ガード設定を無効にします。

    SQL> ALTER DATABASE GUARD STANDBY;
    
    
  2. ロジカル・スタンバイ・データベースで表領域をインポートします。

  3. データベース・ガード設定を有効にします。

    SQL> ALTER DATABASE GUARD ALL;
    
    
  4. プライマリ・データベースで表領域をインポートします。

10.6.2 マテリアライズド・ビューの使用

ロジカル・スタンバイでは、マテリアライズド・ビューに関連した次のDDL文を自動的にスキップします。

ロジカル・スタンバイ・データベースの作成後にプライマリ・データベースで作成、変更または削除された新規マテリアライズド・ビューは、ロジカル・スタンバイ・データベースには反映されません。ただし、ロジカル・スタンバイ・データベースの作成前にプライマリ・データベースで作成されたマテリアライズド・ビューは、ロジカル・スタンバイ・データベースに存在します。

ロジカル・スタンバイでは、他の種類の補助データ構造に加えて、ロジカル・スタンバイ・データベースでの新規マテリアライズド・ビューのローカルな作成およびメンテナンスをサポートしています。たとえば、オンライン・トランザクション処理(OLTP)システムでは、高度に正規化された表を更新パフォーマンスに頻繁に使用しますが、これらの表により、複雑な意思決定支援の問合せに対するレスポンス時間が長くなることがあります。ロジカル・スタンバイ・データベースでより効率的な問合せが作成できるように、次のようにして、レプリケートされたデータを非正規化するマテリアライズド・ビューを作成できます。

SQL> ALTER SESSION DISABLE GUARD; 
 
SQL> ALTER TABLE DEPT ADD (CONSTRAINT DEPT_PK PRIMARY KEY (DEPTNO)); 
 
SQL> ALTER TABLE  EMP ADD (CONSTRAINT EMP_FK FOREIGN KEY (DEPTNO) 
  2  REFERENCES DEPT(DEPTNO)); 
 
SQL> CREATE MATERIALIZED VIEW LOG ON EMP 
  2  WITH ROWID (EMPNO, ENAME, MGR, DEPTNO) INCLUDING NEW VALUES; 
 
SQL> CREATE MATERIALIZED VIEW LOG ON DEPT 
  2  WITH ROWID (DEPTNO, DNAME) INCLUDING NEW VALUES; 
 
SQL> CREATE MATERIALIZED VIEW MANAGED_BY 
  2  REFRESH ON DEMAND 
  3  ENABLE QUERY REWRITE 
  4  AS SELECT  E.ENAME, M.ENAME AS MANAGER 
  5  FROM EMP E, EMP M WHERE E.MGR=M.EMPNO; 
 
SQL> CREATE MATERIALIZED VIEW IN_DEPT 
  2  REFRESH FAST ON COMMIT 
  3  ENABLE QUERY REWRITE 
  4  AS SELECT E.ROWID AS ERID, D.ROWID AS DRID, E.ENAME, D.DNAME 
  5  FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO;

ロジカル・スタンバイ・データベースの場合

たとえば、次のコマンドを発行すると、前の例で作成されたON-DEMANDマテリアライズド・ビューがリフレッシュされます。

SQL> ALTER SESSION DISABLE GUARD; 
 
SQL> EXECUTE DBMS_MVIEW.REFRESH (LIST => 'SCOTT.MANAGED_BY', METHOD => 'C');

DBMS_SCHEDULERジョブを使用してON-DEMANDマテリアライズド・ビューを定期的にリフレッシュする場合は、データベース・ガードをSTANDBYに設定する必要があります。(ALTER SESSION DISABLE GUARD文をPL/SQLブロック内で使用して有効にすることはできません。)

10.6.3 ロジカル・スタンバイ・データベースでのトリガーと制約の処理方法

デフォルトでは、トリガーと制約はロジカル・スタンバイ・データベースで自動的に使用可能になり、処理されます。

SQL Applyでメンテナンスされる表にトリガーおよび制約がある場合:

SQL Applyでメンテナンスされない表にトリガーおよび制約がある場合:

10.6.4 サポートされていない表のレプリケートでのトリガーの使用

単純なオブジェクト型の列のためにサポートされていない表を、Fire_Once_Onlyではないトリガーを使用してレプリケートできます。通常のDMLトリガーをプライマリで使用して、オブジェクト型を、サポート可能な表にフラット化できます。Fire_Once_Onlyではないトリガーをロジカル・スタンバイで使用して、オブジェクト型を再作成し、サポートされていない表をトランザクション方式で更新できます。

関連項目

  • BMS_DDL.SET_TRIGGER_FIRING_PROPERTYプロシージャおよびDBMS_LOGSTDBY.IS_APPLY_SERVERファンクションの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

 

次の例は、トリガーを使用して単純なオブジェクト・タイプをレプリケートする方法を示しています。この例では、挿入処理の方法を示します。同じ原則を更新および削除に適用できます。ネストした表およびVARRAYも、ネストしたデータの正規化ループという追加手順でこの方法を使用して、レプリケートできます。

-- simple object type
create or replace type Person as object
(
  FirstName    varchar2(50),
  LastName     varchar2(50),
  BirthDate    Date
)
 
-- unsupported object table
create table employees
(
  IdNumber     varchar2(10) ,
  Department   varchar2(50),
  Info         Person
)
 
-- supported table populated via trigger
create table employees_transfer
(
  t_IdNumber   varchar2(10),
  t_Department varchar2(50),
  t_FirstName  varchar2(50),
  t_LastName   varchar2(50),
  t_BirthDate  Date
)
--
-- create this trigger to flatten object table on the primary
-- this trigger will not fire on the standby
--
create or replace trigger flatten_employees
  after insert on employees for each row
declare
begin
  insert into employees_transfer
    (t_IdNumber, t_Department, t_FirstName, t_LastName, t_BirthDate)
  values
    (:new.IdNumber, :new.Department,
 :new.Info.FirstName,:new.Info.LastName, :new.Info.BirthDate);
end
 
--
-- create this trigger at the logical standby database
-- to populate object table on the standby
-- this trigger only fires when apply replicates rows to the standby
--
create or replace trigger reconstruct_employees
  after insert on employees_transfer for each row
begin
  if dbms_logstdby.is_apply_server() then
    insert into employees (IdNumber, Department, Info)
    values (:new.t_IdNumber, :new.t_Department,
          Person(:new.t_FirstName, :new.t_LastName, :new.t_BirthDate));
  end if;
end
 
-- set this trigger to fire from the apply server
execute dbms_ddl.set_trigger_firing_property(trig_owner=> 'scott', trig_name=>
'reconstruct_employees', fire_once => FALSE);

10.6.5 プライマリでのPoint-in-Timeリカバリの実行によるリカバリ

ロジカル・スタンバイ・データベースがREDOデータの新規ブランチを受信すると、SQL Applyではそれが自動的に使用されます。ロジカル・スタンバイ・データベースの場合、スタンバイ・データベースにより新規リセットログのSCNより後(REDOデータの新規ブランチの開始より後)のREDOデータが適用されていなければ、手動による介入は必要ありません。

次の表に、スタンバイ・データベースとプライマリ・データベースのブランチを再同期化する方法を示します。

スタンバイ・データベースの状態  操作  実行する手順 

新規リセットログのSCNの後(REDOデータの新規ブランチの開始より後)のREDOデータが適用されていない場合 

SQL Applyは、自動的にREDOデータの新規ブランチを使用します。 

手動による介入は必要ありません。SQL Applyは、自動的にスタンバイ・データベースをREDOデータの新規ブランチと再同期化します。 

新規リセットログのSCNの後(REDOデータの新規ブランチの開始より後)のREDOデータが適用され、スタンバイ・データベースでフラッシュバック・データベースが使用可能になっている場合 

スタンバイ・データベースは、REDOデータの将来の新規ブランチでリカバリされます。 

  1. 13.3.2項「特定時点へのロジカル・スタンバイ・データベースのフラッシュバック」の手順に従ってロジカル・スタンバイ・データベースをフラッシュ・バックします。

  2. SQL Applyを再開し、新規リセットログ・ブランチへのREDOの適用を続行します。

SQL Applyは、自動的にスタンバイ・データベースを新規ブランチと再同期化します。 

新規リセットログのSCNの後(REDOデータの新規ブランチの開始より後)のREDOデータが適用され、スタンバイ・データベースでフラッシュバック・データベースが使用可能になっていない場合 

指定のプライマリ・データベース・ブランチで、プライマリ・データベースとスタンバイの内容にずれが生じます。 

第4章「ロジカル・スタンバイ・データベースの作成」の手順に従ってロジカル・スタンバイ・データベースを再作成します。 

REDOデータの前のブランチの終わりからアーカイブREDOログ・ファイルが欠落している場合 

SQL Applyは欠落しているログ・ファイルが取得されるまで続行できません。  

前のブランチから欠落しているアーカイブREDOログ・ファイルを検索して登録します。 

データベース・インカネーション、OPEN RESETLOGS操作を使用したリカバリおよびフラッシュバック・データベースの詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。

10.7 ロジカル・スタンバイ・データベースのチューニング

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

10.7.1 主キーRELY制約の作成

プライマリ・データベースで、表に主キーまたは一意索引がなく、実際には一意である行がわかっている場合は、主キーのRELY制約を作成します。ロジカル・スタンバイ・データベースでは、主キーを構成する列に索引を作成します。次の問合せは、ロジカル・スタンバイ・データベースで行を一意に識別するために適用できる索引情報がない表のリストを生成します。次の表に索引を作成することによって、パフォーマンスが大幅に向上する可能性があります。

SQL> SELECT OWNER, TABLE_NAME FROM DBA_TABLES
  2> WHERE OWNER NOT IN (SELECT OWNER FROM DBA_LOGSTDBY_SKIP 
  3> WHERE STATEMENT_OPT = 'INTERNAL SCHEMA')
  4> MINUS
  5> SELECT DISTINCT TABLE_OWNER, TABLE_NAME FROM DBA_INDEXES
  6> WHERE INDEX_TYPE NOT LIKE ('FUNCTION-BASED%')
  7> MINUS
  8> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED;

プライマリ・データベースの表に主キーのRELY制約を追加する手順は、次のとおりです。

  1. プライマリ・データベースで主キーのRELY制約を追加します。

    SQL> ALTER TABLE HR.TEST_EMPLOYEES ADD PRIMARY KEY (EMPNO) RELY DISABLE;
    
    

    これにより、HR.TEST_EMPLOYEES表の各行を一意に識別するために使用可能なEMPNO列が、その表に対して実行される更新の一部としてサプリメンタル・ロギングで確実に記録されるようになります。

    HR.TEST_EMPLOYEES表には、ロジカル・スタンバイ・データベースで指定された一意索引がまだないことに注意してください。このため、UPDATE文ではロジカル・スタンバイ・データベースに対して全表スキャンが実行される場合があります。これを避けるには、ロジカル・スタンバイ・データベースでEMPNO列に一意索引を追加します。

    RELY制約の詳細は、4.1.2項「プライマリ・データベース内の表の行が一意に識別できることの確認」および『Oracle Database SQL言語リファレンス』を参照してください。

    残りの手順をロジカル・スタンバイ・データベースで実行します。

  2. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    
    
  3. ロジカル・スタンバイ・データベースでメンテナンスされる表を変更できるように、ガードを無効にします。

    SQL> ALTER SESSION DISABLE GUARD;
    
    
  4. EMPNO列に一意索引を追加します。

    SQL> CREATE UNIQUE INDEX UI_TEST_EMP ON HR.TEST_EMPLOYEES (EMPNO);
    
    
  5. ガードを有効にします。

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

    SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
    

10.7.2 コストベース・オプティマイザの統計の収集

コストベース・オプティマイザ(CBO)で最適の問合せ実行パスを判別するために使用されるため、スタンバイ・データベースで統計を収集する必要があります。以前の統計情報が正確でなくなるような変更をスキーマ・オブジェクトのデータまたは構造に対して実行した場合は、その後に新しい統計を収集してください。たとえば、多数の行を表に挿入または削除した後は、行数に関する新しい統計を収集します。

プライマリ・データベースでのDMLおよびDDL操作はワークロードの機能として実行されるため、統計はスタンバイ・データベースで収集してください。スタンバイ・データベースがプライマリ・データベースと論理的に等しい場合、SQL Applyではワークロードを異なる方法で実行する場合があります。そのため、ロジカル・スタンバイ・データベースでSTATSパッケージおよびV$SYSSTATビューを使用すると、リソースおよび表スキャンを最も多く使用している表を判断する際に役立ちます。

関連項目

 

10.7.3 プロセス数の調整

次の各項で、次の内容を説明します。

SQL Applyに割り当てられるプロセス数を制御するために変更できるパラメータには、MAX_SERVERS、APPLY_SERVERSおよびPREPARE_SERVERSの3つがあります。常に、次の関係に該当する必要があります。

10.7.3.1 APPLIERプロセス数の調整

APPLIERプロセスの数を調整することでスループットを改善できるかどうかを判断する手順は、次のとおりです。

  1. 次の問合せを発行して、APPLIERプロセスがビジーかどうかを判断します。

    SQL> SELECT COUNT(*) AS IDLE_APPLIER
         FROM V$LOGSTDBY_PROCESS 
         WHERE TYPE = 'APPLIER' and status_code = 16166;
    
    IDLE_APPLIER
    -------------------------
    0
    
    
  2. アイドル状態のAPPLIERプロセスがないことを確認した後、次の問合せを発行し、APPLIERの数を調整した場合に追加分のAPPLIERプロセスに十分な作業が使用可能かどうかを確認します。

    SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME LIKE
    'transactions%';
    
    

    この2つの統計では、APPLIERプロセスによる適用準備が完了しているトランザクション数とすでに適用済のトランザクション数の累計が維持されます。

    この数値(transactions mined - transactions applied)が使用可能なAPPLIERプロセス数の2倍を超えている場合は、APPLIERプロセス数を増やすことでスループットを改善できます。


    注意

    この数値は準備作業の概算です。ワークロードによっては、準備が完了したトランザクション間の依存性が、使用可能な追加のAPPLIERプロセスによる適用の妨げになる場合があります。たとえば、適用準備の完了しているトランザクションの大多数がDDLトランザクションの場合は、さらにAPPLIERプロセスを追加してもスループットは改善されません。 


    APPLIERプロセス数をデフォルト値の5から20に調整し、PREPARERプロセス数は1のままとします。これは、次の等式を満たす必要があるためです。

    APPLY_SERVERS + PREPARE_SERVERS = MAX_SERVERS - 3
    
    

    まず、MAX_SERVERSを24に設定する必要があります。設定したら、次のようにして、APPLY_SERVERSの数を20に設定できます。

    SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('MAX_SERVERS', 24);
    SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('APPLY_SERVERS', 20);
    

10.7.3.2 PREPARERプロセス数の調整

PREPARERプロセスの数の調整が必要になることは、ほとんどありません。PREPARERプロセスの数を増やす前に、次の条件に該当しているかどうかを確認してください。

前述の条件に該当しているかどうかを判断する手順は、次のとおりです。

  1. すべてのPREPARERプロセスがビジーであることを確認します。

    SQL> SELECT COUNT(*) AS IDLE_PREPARER
         FROM V$LOGSTDBY_PROCESS
         WHERE TYPE = 'PREPARER' and status_code = 16166;
    IDLE_PREPARER
    -------------
    0
    
    
  2. 適用準備が完了しているトランザクションの数がAPPLIERプロセスの数よりも少ないことを確認します。

    SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS
         WHERE NAME LIKE 'transactions%';
    NAME                          VALUE
    ---------------------         -------
    transactions ready             27896
    transactions applied           27892
    
    SQL> SELECT COUNT(*) AS APPLIER_COUNT 
         FROM V$LOGSTDBY_PROCESS WHERE TYPE = 'APPLIER';
    APPLIER_COUNT
    -------------
    20
    
    

    注意: これが一時イベントでないことを確認するために、この問合せは数回発行してください。

  3. アイドル状態のAPPLIERプロセスがあることを確認します。

    SQL> SELECT COUNT(*) AS IDLE_APPLIER
         FROM V$LOGSTDBY_PROCESS 
         WHERE TYPE = 'APPLIER' and status_code = 16166;
    IDLE_APPLIER
    -------------------------
    19
    
    

この例では、PREPARERプロセス数の増加に必要な3つの条件がすべて満たされています。APPLIERプロセス数の設定を20のままにし、PREPARERプロセス数を1から3に増やすとします。これは、常に次の等式を満たす必要があるためです。

APPLY_SERVERS + PREPARE_SERVERS = MAX_SERVERS - 3

まず、増加後のPREPARERプロセス数に対応するように、MAX_SERVERSの数を24から26に増やす必要があります。次に、PREPARERプロセス数を次のようにして増やすことができます。

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('MAX_SERVERS', 26);
SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('PREPARE_SERVERS', 3);

10.7.4 LCRキャッシュ用メモリーの調整

ある程度のワークロードの場合、SQL Applyは多数のページアウト操作を使用することがあるため、システム全体のスループットが低下します。LCRキャッシュに割当済のメモリーを増やした場合にスループットを改善できるかどうかを判断する手順は、次のとおりです。

  1. 次の問合せを発行して、ページアウト・アクティビティのスナップショットを取得します。

    SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME LIKE '%page%' 
    OR NAME LIKE '%uptime%' OR NAME LIKE '%idle%';
    
    NAME                           VALUE
    --------------------------     ---------------
    coordinator uptime in secs              894856
    bytes paged out                          20000
    seconds spent in pageout                     2
    system idle time in secs                  1000
    
    
  2. この問合せを5分以内に再発行します。

    SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME LIKE '%page%' 
    OR NAME LIKE '%uptime%' OR NAME LIKE '%idle%';
    
    NAME                           VALUE
    --------------------------     ---------------
    coordinator uptime in secs              895156
    bytes paged out                        1020000
    seconds spent in pageout                   100
    system idle time in secs                  1000
    
    
  3. 正規化されたページアウト・アクティビティを計算します。次に例を示します。

    Change in coordinator uptime (C)= (895156 - 894856) = 300 secs
    Amount of additional idle time (I)= (1000 - 1000) = 0
    Change in time spent in pageout (P) = (100 - 2) = 98 secs
    Pageout time in comparison to uptime = P/(C-I) = 98/300 ~ 32.67%
    
    

ページアウト・アクティビティによる消費量が稼働時間全体の5%以下であれば理想的です。間隔を長くして引き続きスナップショットを取得し、ページアウト・アクティビティが引き続き適用時間の大部分を占めていることがわかった場合は、メモリー・サイズを大きくするとスループットが改善される可能性があります。SQL Applyに割当済のメモリーは、LCRキャッシュに割り当てられるメモリーを設定する(この例ではSGAを1GBに設定)と増やすことができます。

SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('MAX_SGA', 1024);
PL/SQL procedure successfully completed

10.7.5 ロジカル・スタンバイ・データベースにおけるトランザクションの適用方法の調整

デフォルトでは、トランザクションは、プライマリ・データベースでコミットされた順序に正確に従って、ロジカル・スタンバイ・データベースに適用されます。厳密なデフォルト順序でのトランザクションのコミットにより、アプリケーションをロジカル・スタンバイ・データベースで透過的に実行できます。

ただし、多くのアプリケーションでは、すべてのトランザクションの間でそのような厳密な順序が必要なわけではありません。そのようなアプリケーションでは、オーバーラップしない一連の行を含むトランザクションを、プライマリ・データベースでコミットしたときと同じ順序でコミットする必要がありません。一般に、厳密でない順序により、ロジカル・スタンバイ・データベースでの適用率は高くなります。次の手順で、トランザクションをコミットするデフォルトの順序を変更できます。

  1. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    Database altered
    
    
  2. 次の文を発行して、プライマリ・データベースでコミットされた順序と異なる順序でトランザクションを適用できるようにします。

    SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('PRESERVE_COMMIT_ORDER', 'FALSE');
    PL/SQL procedure successfully completed
    
    
  3. SQL Applyを開始します。

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

プライマリ・データベースと一致し(V$LOGSTDBY_STATSビューを問い合せて確認し)、ロジカル・スタンバイ・データベースをレポート・アプリケーションに対してオープンする準備が完了した時点で、次のように適用モードを変更できます。

  1. SQL Applyを停止します。

    SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
    Database altered
    
    
  2. PRESERVE_COMMIT_ORDERパラメータのデフォルト値をリストアします。

    SQL> EXECUTE DBMS_LOGSTDBY.APPLY_UNSET('PRESERVE_COMMIT_ORDER');
    PL/SQL procedure successfully completed
    
    
  3. SQL Applyを開始します。

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

一般的なオンライン・トランザクション処理(OLTP)のワークロードでは、デフォルト以外のモードにすると、デフォルトの適用モードに比べてスループットを50%以上改善できます。

10.8 ロジカル・スタンバイ・データベースの下でのバックアップおよびリカバリ

ロジカル・スタンバイ・データベースは、従来の方法を使用してバックアップでき、データベース・バックアップをリストアしてアーカイブ・ログに対してメディア・リカバリを実行すると、バックアップと同時にリカバリができます。次の各項目は、ロジカル・スタンバイ・データベースの場合に該当します。

Recovery Managerのローカル・リカバリ・カタログの作成および使用時の考慮事項

Recovery Managerのリカバリ・カタログを作成する、またはカタログを変更するRecovery Managerのアクティビティを実行する場合、ロジカル・スタンバイ・データベースでは、GUARDSTANDBYに設定して実行する必要があります。

ローカル・リカバリ・カタログがロジカル・スタンバイ制御ファイルにのみ保持されている場合は、GUARDALLに設定したままにできます。

制御ファイルのバックアップに関する考慮事項

ロジカル・スタンバイ・データベースのインスタンス化の直後に、制御ファイルのバックアップを取得することをお薦めします。

Point-in-Timeリカバリに関する考慮事項

Point-in-Timeリカバリの後に初めてSQL Applyが開始されるとき、必要なアーカイブ・ログをローカル・システムで検出するか、プライマリ・データベースからフェッチできる必要があります。V$LOGSTDBY_PROCESSビューを使用して、アーカイブ・ログをプライマリ・データベースでリストアする必要があるかどうかを判断します。

表領域のPoint-in-Timeリカバリに関する考慮事項

ロジカル・スタンバイ・データベースの表領域に対してPoint-in-Timeリカバリを実行する場合、次のいずれかを実行する必要があります。


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

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