この章では、キャッシュ・グループをレプリケートしないアクティブ・スタンバイ・ペアを管理する方法について説明します。キャッシュ・グループをレプリケートするアクティブ・スタンバイ・ペアの管理については、第6章「キャッシュ・グループが構成されたアクティブ・スタンバイ・ペアの管理」を参照してください。
フェイルオーバーとリカバリの自動管理については、第8章「Oracle Clusterwareを使用したアクティブ・スタンバイ・ペアの管理」を参照してください。
この章の内容は次のとおりです。
アクティブ・スタンバイ・ペアを設定するには、この項のタスクを実行します。例については、「1つのサブスクライバを持つアクティブ・スタンバイ・ペアの構成」を参照してください。
注意: 読取り専用キャッシュ・グループまたはASYNCHRONOUS WRITETHROUGH (AWT)キャッシュ・グループをレプリケートする場合は、第6章「キャッシュ・グループが構成されたアクティブ・スタンバイ・ペアの管理」を参照してください。 |
データベースを作成する前に、次の項の情報を参照してください。
データベースを作成します。『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のTimesTenデータベースの管理に関する説明を参照してください。
CREATE ACTIVE STANDBY PAIR
文を使用して、レプリケーション・スキームを作成します。第3章「アクティブ・スタンバイ・ペアのレプリケーション・スキームの定義」を参照してください。
アクティブ・データベースでttRepStateSet
('ACTIVE')
をコールします。
レプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
アクティブ・データベースでユーザーを作成し、そのユーザーにADMIN
権限を付与します。
アクティブ・データベースをスタンバイ・データベースに複製します。
スタンバイ・データベースでレプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
スタンバイ・データベースがSTANDBY
状態になるまで待機します。ttRepStateGet
組込みプロシージャを使用して、スタンバイ・データベースの状態を確認します。
スタンバイ・データベースからすべてのサブスクライバを複製します。詳細は、「サブスクライバへのマスター・データベースの複製」を参照してください。
レプリケーション・エージェント・ポリシーを設定し、各サブスクライバ・データベースでレプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
この項の内容は次のとおりです。
この項では、スタンバイ・データベースが使用可能で、アクティブ・データベースと同期されている場合にアクティブ・データベースをリカバリする方法について説明します。次のトピックが含まれています。
次のタスクを実行します。
障害が発生したデータベースで、レプリケーション・エージェントがまだ停止されていない場合は停止します。
スタンバイ・データベースでttRepStateSet
('ACTIVE')
をコールします。これによって、データベースの役割がSTANDBY
からACTIVE
に変更されます。
新しいアクティブ・データベースで、ttRepStateSave
('FAILED', '
failed_database
','
host_name
')
をコールします(ここで、failed_database
は、障害が発生する前のアクティブ・データベースです)。この手順は、新しいアクティブ・データベースがサブスクライバ・データベースに直接レプリケートされるようにするために必要です。通常動作時は、スタンバイ・データベースのみがサブスクライバにレプリケートされます。
障害が発生したデータベースを破棄します。
新しいアクティブ・データベースを新しいスタンバイ・データベースに複製します。
レプリケーション・エージェント・ポリシーを設定し、新しいスタンバイ・データベースでレプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
スタンバイ・データベースは、アクティブ・データベースに通信します。アクティブ・データベースは、サブスクライバへの更新の送信を停止します。スタンバイ・データベースがアクティブ・データベースと完全に同期している場合、スタンバイ・データベースはSTANDBY
状態になり、サブスクライバへの更新の送信を開始します。
注意: スタンバイ・データベースがSTANDBY 状態になったことは、ttRepStateGet 組込みプロシージャを使用して確認できます。 |
次のタスクを実行します。
スタンバイ・データベースでttRepStateSet
('ACTIVE')
をコールします。これによって、データベースの役割がSTANDBY
からACTIVE
に変更されます。
新しいアクティブ・データベースで、ttRepStateSave
('FAILED', '
failed_database
','
host_name
')
をコールします(ここで、failed_database
は、障害が発生する前のアクティブ・データベースです)。この手順は、新しいアクティブ・データベースがサブスクライバ・データベースに直接レプリケートされるようにするために必要です。通常動作時は、スタンバイ・データベースのみがサブスクライバにレプリケートされます。
障害が発生したデータベースに接続します。これによって、ローカル・トランザクション・ログからのリカバリがトリガーされます。データベースのリカバリが正常に行われなかったときは、レプリケーションがRETURN RECEIPTまたは非同期の場合のリカバリ方法の手順5から処理を続けてください。詳細は、「レプリケーションがRETURN RECEIPTまたは非同期の場合」を参照してください。
障害が発生したデータベースのレプリケーション・エージェントが再起動されたことを確認します。再起動されていない場合は起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
スタンバイ・データベースと完全に同期されているとアクティブ・データベースで判断された場合、スタンバイ・データベースはSTANDBY
状態になり、サブスクライバへの更新の送信を開始します。
注意: スタンバイ・データベースがSTANDBY 状態になったことは、ttRepStateSet 組込みプロシージャを使用して確認できます。 |
フェイルオーバーに成功した後、アクティブ・データベースおよびスタンバイ・データベースが元のノードに存在するようにフェイルバックする必要がある場合があります。詳細は、「アクティブ・データベースとスタンバイ・データベースの役割の入替え」を参照してください。
スタンバイ・データベースの障害からリカバリするには、次のタスクを実行します。
スタンバイ・データベースの障害を検出します。
RETURN TWOSAFEサービスが有効になっている場合にスタンバイ・データベースで障害が発生すると、処理中のトランザクションはアクティブ・データベースでコミットされなくなり、エラー8170「Receipt or commit acknowledgement not returned in the specified timeout interval」が発生します。その場合は、localAction
パラメータを2
(COMMIT
)に設定してttRepSyncSet
組込みプロシージャをコールし、トランザクションを再度コミットします。次に例を示します。
Command> call ttRepSyncSet( null, null, 2); Command> commit;
アクティブ・データベースで、ttRepStateSave
('FAILED','
standby_database
','
host_name
')
をコールします。それ以後、スタンバイ・データベースが使用できない間は、アクティブ・データベースへの更新は、サブスクライバ・データベースに直接レプリケートされます。サブスクライバ・データベースは、アクティブから直接複製することもできます。
スタンバイ・データベースのレプリケーション・エージェントが自動的に再起動された場合は、レプリケーション・エージェントを停止します。「レプリケーション・エージェントの起動および停止」を参照してください。
次のいずれかの方法で、スタンバイ・データベースをリカバリします。
スタンバイ・データベースに接続します。これによって、ローカル・トランザクション・ログからのリカバリがトリガーされます。
アクティブ・データベースからスタンバイ・データベースを複製します。
スタンバイ・データベースが停止していた時間、およびアクティブ・データベースから適用する必要があるトランザクション・ログの量によって、使用するリカバリの方法が決まります。
レプリケーション・エージェント・ポリシーを設定し、新しいスタンバイ・データベースでレプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
アクティブ・データベースで2つのマスター・データベースが同期していると判断し、サブスクライバへの更新の送信を停止すると、スタンバイ・データベースはSTANDBY
状態になり、サブスクライバへの更新の送信を開始します。
注意: スタンバイ・データベースがSTANDBY 状態になったことは、ttRepStateGet 組込みプロシージャを使用して確認できます。 |
次の例を考えてみます。
スタンバイ・データベースで障害が発生しました。次に、スタンバイが再起動する前、またはスタンバイがアクティブ・データベースと同期される前に、アクティブ・データベースで障害が発生しました。
アクティブ・データベースで障害が発生しました。スタンバイ・データベースがACTIVE
になり、リカバリ・プロセスの残りが開始されます。(「アクティブ・データベースの障害からのリカバリ」を参照してください。)新しいスタンバイ・データベースが新しいアクティブ・データベースと完全に同期される前に、そのアクティブ・データベースで障害が発生しました。
両方の例で、スタンバイ・データベースの場合より多くの変更がサブスクライバに適用されている可能性があります。
アクティブ・データベースで障害が発生し、アクティブ・データベースから最後に送信された変更の一部のみがスタンバイ・データベースで適用された場合、リカバリの方法として次の2つの方法があります。
ローカル・トランザクション・ログからアクティブ・データベースをリカバリする方法。
ローカル・トランザクション・ログからスタンバイ・データベースをリカバリする方法。
いずれのデータベースが使用可能かまたはいずれのデータベースがより新しいかに応じて、使用する方法を選択します。
障害が発生したアクティブ・データベースに接続します。これによって、ローカル・トランザクション・ログからのリカバリがトリガーされます。
障害が発生したアクティブ・データベースのレプリケーション・エージェントが再起動されたことを確認します。再起動されていない場合は起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
新しくリカバリされたデータベースで、ttRepStateSet
('ACTIVE')
をコールします。
「キャッシュ・グループが構成されていないアクティブ・スタンバイ・ペアの設定」の手順6を実行します。
障害が発生したスタンバイ・データベースに接続します。これによって、ローカル・トランザクション・ログからのリカバリがトリガーされます。
スタンバイ・データベースのレプリケーション・エージェントが自動的に再起動された場合は、そのレプリケーション・エージェントを停止する必要があります。「レプリケーション・エージェントの起動および停止」を参照してください。
DROP ACTIVE STANDBY PAIR
文を使用して、レプリケーション構成を削除します。
CREATE ACTIVE STANDBY PAIR
文を使用して、レプリケーション構成を再作成します。
マスター・データベースで、ttRepStateSet
('ACTIVE')
をコールして、そのデータベースにACTIVE
の役割を割り当てます。
レプリケーション・エージェント・ポリシーを設定し、新しいスタンバイ・データベースでレプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
「キャッシュ・グループが構成されていないアクティブ・スタンバイ・ペアの設定」の手順6から実行します。
サブスクライバ・データベースで障害が発生した場合は、次のいずれかの方法を使用してリカバリすることができます。
障害が発生したサブスクライバに接続します。これによって、ローカル・トランザクション・ログからのリカバリがトリガーされます。レプリケーション・エージェントを起動し、サブスクライバによるキャッチアップを可能にします。
スタンバイ・データベースからサブスクライバを複製します。
スタンバイ・データベースが停止しているか、またはリカバリ中の場合は、アクティブ・データベースからサブスクライバを複製します。
サブスクライバ・データベースがリカバリされた後、レプリケーション・エージェント・ポリシーを設定し、レプリケーション・エージェントを起動します。「レプリケーション・エージェントの起動および停止」を参照してください。
アクティブ・データベースの役割をスタンバイ・データベースに変更する場合、およびその逆の変更を実行する場合は、次の手順を実行します。
現行のアクティブ・データベースで更新を生成しているすべてのアプリケーションを一時停止します。
現行のスタンバイ・データベースのDSNおよびホストを入力パラメータとして使用して、アクティブ・データベースでttRepSubscriberWait
をコールします。成功すると<00>
が返されます。これによって、すべての更新が現行のスタンバイ・データベースに送信されます。
現行のアクティブ・データベースでレプリケーション・エージェントを停止します。「レプリケーション・エージェントの起動および停止」を参照してください。
現在のアクティブ・データベースでttRepDeactivate
をコールします。これによって、このデータベースはIDLE
状態になります。
現在のスタンバイ・データベースで、ttRepStateSet
('ACTIVE')
をコールします。これによって、このデータベースがアクティブ・スタンバイ・ペアのアクティブ・データベースとして機能するようになります。
レプリケーション・エージェント・ポリシーを設定し、元のアクティブ・データベースでレプリケーション・エージェントを起動します。
ttRepStateGet
組込みプロシージャを使用して、データベースの状態がIDLE
からSTANDBY
に変更されたタイミングを確認します。これによって、このデータベースがアクティブ・スタンバイ・ペアのスタンバイ・データベースとして機能するようになります。
手順1で一時停止したアプリケーションを再開します。
通常、アクティブ・スタンバイ・ペアのアクティブ・データベースおよびスタンバイ・データベースの指定は、ユーザーによって明示的に制御されます。ただし、状況によっては、スタンバイ・データベースの役割をアクティブ・データベースに変更するときに、ユーザーがアクティブ・データベースとスタンバイ・データベースの両方を変更できない場合があります。
たとえば、アクティブ・データベースのサイトへのネットワーク通信が中断された場合、異なるサイトのスタンバイ・データベースがアクティブ・データベースの役割を引き継ぐ必要があるが、現行のアクティブ・データベースでのレプリケーションの停止やその役割の手動での変更ができないことがあります。最初にアクティブ・データベースでレプリケーションを停止せずにスタンバイ・データベースをアクティブに変更すると、両方のマスター・データベースがACTIVE
状態となり、トランザクションを受け入れる状況となります。このような例では、TimesTenは、データベース間のネットワーク通信がリストアされたときに、マスター・データベースのアクティブ/スタンバイの役割を自動的に決定できます。
データベース間の初期ハンドシェイク中に、TimesTenでアクティブ・スタンバイ・ペアのレプリケーション・スキームのマスター・データベースが両方ともACTIVE
状態であると判別された場合、自動的に次の処理が実行されます。
ACTIVE
状態に最後に設定されたデータベースはACTIVE
状態のままにされ、アプリケーションへの接続状態が続き、アプリケーションによる更新も継続されます。
最初にACTIVE
状態にされたデータベースは、無効化されます。すべてのアプリケーションの接続が切断されます。
無効化されたデータベースが再起動されると、TimesTenでは、他のマスター・データベースにレプリケートされていないトランザクションがデータベースで発生したかどうかが判別されます。このようなトランザクションが発生していた場合、それらのトランザクションはトラップされ、データベースはIDLE
状態のままにされます。データベースをスタンバイ・データベースにするには、アクティブ・データベースから複製する必要があります。トラップされたトランザクションがない場合、データベースはスタンバイ・データベースとして使用でき、自動的にSTANDBY
状態に設定されます。