TimesTenデータベースのデフラグ

一部の状況では、TimesTenデータベースではメモリー・フラグメンテーションが進行しているため、大量の空きメモリーが既存の表の部分的に埋まったページに割り当てられていることがあります。これにより、空きメモリーが不足するため、他のユーザーにメモリーを割り当てられなくなることがあります(他の表用の新しいページなど)。このような状況では、メモリーを他のユーザーが利用できるようにするために、データベースをデフラグする必要があります。

表がALTER TABLE ADD SQL文で変更されてから、2番目の表パーティションが作成されます。デフラグメンテーションにより、2番目の表パーティションを削除し、すべての表の列を含む1つの表パーティションを作成できます。2番目の表パーティションが作成された場合、領域の利用およびパフォーマンスを向上するために、データベースを定期的にデフラグすることをお薦めします。

次のプロシージャは、様々なタイプのデータベース断片化に対応します。

TimesTen Scaleoutデータベースのオフライン・デフラグメンテーション

TimesTen Scaleoutデータベースは、エクスポート処理およびインポート処理の一部としてデフラグされます。

そのため、TimesTen Scaleoutデータベースをデフラグするには、ttGridAdmin dbExportコマンドおよびdbImportコマンドを使用します。『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』データベースのエクスポートとインポートを参照してください。

TimesTen Classicデータベースのオフライン・デフラグメンテーション

TimesTen Classicデータベースをデフラグするには、ttMigrateユーティリティを使用します。

  1. データベースへのすべての接続を停止します。
  2. ttMigrateを使用してデータベースのコピーを保存します。
    ttMigrate -c ttdb ttdb.dat
  3. 管理ユーザーとして、ttdbデータベースを再構築します。
    ttMigrate -r -relaxedUpgrade -connstr "dsn=ttdb" ttdb.dat

    ノート:

    ttMigrate -r -relaxedUpgradeコマンドを使用して、最大表のデフラグメンテーションを実現できます。-relaxedUpgradeオプションも表パーティションを圧縮します。表パーティションを圧縮しない場合は、ttMigrate -r -relaxedUpgradeコマンドから-relaxedUpgradeオプションを削除します。

このとき:

  • すべてのユーザー、キャッシュ・グループおよびアクティブ・スタンバイ・ペアはttdbにリストアされています。

  • キャッシュ・グループは、AUTOREFRESH STATE = OFF状態にあります。

  • キャッシュ・エージェントおよびレプリケーション・エージェントは実行されていません。

ALTER TABLE ADD SQL文を使用して表に列を追加するときに表パーティションを追加できます。Oracle TimesTen In-Memory Database SQLリファレンスALTER TABLEのノートを参照してください。パフォーマンス上の考慮事項については、ALTER TABLEの回避を参照してください。

Oracle TimesTen In-Memory DatabaseリファレンスttMigrateを参照してください。

アクティブ・スタンバイ・ペアのレプリケーション・スキーム内のTimesTen Classicデータベースのオンライン・デフラグメンテーション

(最小の総サービス・ダウンタイムで) TimesTen Classicデータベースをデフラグするには、ttMigrate -relaxedUpgradeおよびttRepAdmin -duplicateユーティリティを組み合せて使用します。これらのデータベースは、TABLE DEFINITION CHECKINGRELAXEDに設定されているレプリケーション・スキームに関係しています。また、ttMigrate -relaxedUpgradeオプションによってパーティションを圧縮します。

ノート:

TimesTen Classicデータベースでアクティブ・スタンバイ・ペアのレプリケーション・スキームが使用されている場合に、アクティブ・スタンバイ・ペアのレプリケーション・スキームにいずれのキャッシュ・グループも含まれていないか、またはREADONLYキャッシュ・グループのみが含まれている場合は、これらのデータベースのみをデフラグできます。

次の項では、アクティブ・スタンバイ・ペアのレプリケーション・スキームに関係しているTimesTen Classicデータベースをデフラグする方法について説明します。

この項の例では、アクティブ・データベースがttdb1でスタンバイ・データベースがttdb2のアクティブ・スタンバイ・ペア・レプリケーション・スキームによるオンライン・デフラグメンテーションの実行方法を示しています。

ノート:

各項で示す例は、ユーザーがレプリケーション・スキームの構成および管理に精通していることを前提としています。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』はじめにを参照してください。

スタンバイ・データベースの移行および再構築

この項では、スタンバイTimesTenデータベースに対するレプリケーションを停止しそのスタンバイ・データベースのコピーを保存してからそのスタンバイ・データベースをデフラグする方法を示します。

ノート:

スタンバイ・データベースをデフラグしている間、アプリケーション処理をアクティブ・データベースで続行できます。

スタンバイ・データベースのコピーを保存するには、次の手順を実行します。

  1. スタンバイ・データベース(ttdb2)でレプリケーション・エージェントを停止します。
    ttAdmin –repStop ttdb2
  2. サブスクライバがある場合、アクティブ・データベースでttRepStateSaveを実行し、スタンバイのステータスを失敗に設定します。スタンバイ・データベースが使用できない間は、アクティブ・データベースへの更新は、サブスクライバ・データベースに直接レプリケートされます。
    call ttRepStateSave('FAILED', 'ttdb2', 'ttsrv2');
  3. ttMigrateを使用してスタンバイ・データベースのコピーを保存します。
    ttMigrate -c ttdb2 ttdb2.dat
  4. キャッシュ・エージェントを停止し、キャッシュ・グループを削除し、スタンバイを廃棄します。
    ttAdmin –cacheStop ttdb2

    ttIsqlでキャッシュ・マネージャ・ユーザーとして接続されている間に、すべてのキャッシュ・グループを削除します。

    DROP CACHE GROUP t_cg;

    スタンバイ・データベースを破棄します。

    ttDestroy ttdb2
  5. スタンバイ・データベースを再構築します。インスタンス管理者として、スタンバイに次のことを実行します。
    ttIsql ttdb2
  6. キャッシュ・マネージャ・ユーザーを作成し、このユーザーにADMIN権限を付与します。ttIsqlを使用して次を実行します:
    CREATE USER cacheadmin IDENTIFIED BY cadminpwd;
    GRANT CREATE SESSION, CACHE_MANAGER, CREATE ANY TABLE, DROP ANY TABLE TO cacheadmin;
    GRANT ADMIN TO cacheadmin;

    ノート:

    ttMigrate –rを実行するには、キャッシュ・マネージャ・ユーザーにはADMIN権限が必要です。移行が完了したら、希望する場合は、このユーザーからADMIN権限を取り消します。

    Oracle TimesTen In-Memory DatabaseリファレンスttMigrateを参照してください。

  7. キャッシュ・マネージャ・ユーザーとして、ttdb2データベースを再構築します。
    ttMigrate -r -relaxedUpgrade -cacheuid cacheadmin -cachepwd cadminpwd 
    -connstr "dsn=ttdb2;uid=cacheadmin;pwd=cadminpwd;oraclepwd=oraclepwd" ttdb2.dat
    

    このとき:

    • すべてのユーザー、キャッシュ・グループおよびアクティブ・スタンバイ・ペアはttdb2にリストアされています。

    • キャッシュ・グループは、AUTOREFRESH STATE = OFF状態にあります。

    • キャッシュ・エージェントおよびレプリケーション・エージェントは実行されていません。

  8. キャッシュ・マネージャ・ユーザーとして、スタンバイでキャッシュ・エージェントを起動します。
    ttAdmin –cacheStart ttdb2
  9. キャッシュ・グループをロードします。
    ALTER CACHE GROUP t_cg SET AUTOREFRESH STATE PAUSED;
    LOAD CACHE GROUP t_cg COMMIT EVERY 256 ROWS PARALLEL <nThreads>;

    ノート:

    • このロード操作の場合に、TimesTenにデータを挿入するために使用するCPUコアの数に基づいてnThreadsを選択します。

    • 複数の読取り専用キャッシュ・グループがある場合、TimesTenおよびOracle Databaseリソースが使用可能なときは、複数のLOAD操作を別々のセッションでパラレルで実行することをお薦めします。

  10. 完了したら、キャッシュ・グループの状態を確認します。
    Command> cacheGroups;
    Cache Group CACHEADMIN.T_CG:
      Cache Group Type: Read Only
      Autorefresh: Yes
      Autorefresh Mode: Incremental
      Autorefresh State: On
      Autorefresh Interval: 10 Seconds
      
      Autorefresh Status: ok
      Aging: No aging defined
     
      Root Table: SALES.T
      Table Type: Read Only
     
    1 cache group found.
    
  11. スタンバイ・データベースでレプリケーション・エージェントを起動します。
    ttAdmin -repStart ttdb2
  12. スタンバイでレプリケーションの状態を確認します。
    % ttIsql ttdb2
    Command> call ttRepStateGet;
    < STANDBY >
    1 row found.
    

スタンバイ・データベース(ttdb2)はデフラグされ、アクティブ・データベースとスタンバイ・データベースの両方は機能しています。

アクティブ・ロールとスタンバイ・ロールの入替え

アクティブ・データベースにデータベース・デフラグメンテーションを実行するには、アクティブ・データベースとスタンバイ・データベースのロールを入れ替えます。

アクティブ(ttdb1)はスタンバイ・データベースになります。元のスタンバイ(ttdb2)はアクティブ・データベースになります。

  1. すべてのアプリケーション処理を停止し、ttAdmin -disconnectコマンドを使用してすべてのアプリケーション接続を切断します。処理中の問合せのみが、ttdb2 TimesTenデータベースで稼働するように移動できます。このマニュアル内の「データベースからの切断」、および『Oracle TimesTen In-Memory Databaseリファレンス』ttAdminを参照してください。
  2. 現行のスタンバイ・データベース(ttdb2)のデータベース名およびホストを入力パラメータとして、現行のアクティブ・データベース(ttdb1)でttRepSubscriberWait組込みプロシージャをコールします。これにより、キューに入れられたすべての更新が現行のスタンバイ・データベースに送信されます。

    ノート:

    waitTime-1に設定した場合、コールは、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまで待機します。

    ただし、waitTimeを任意の値(NULL以外の値にします)に設定する場合、操作を実行する前に、timeOut戻りパラメータの値が0x00であることを確認してください。戻り値が0x01の場合、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまでttRepSubscriberWait組込みプロシージャをコールします。

    ttRepSubscriberWait組込みプロシージャの詳細は、Oracle TimesTen In-Memory DatabaseリファレンスttRepSubscriberWaitを参照してください。

    call ttRepSubscriberWait(NULL,NULL,'ttdb2','ttsrv2', 100);
  3. 現行のアクティブ・データベースでレプリケーション・エージェントを停止します。
    call ttRepStop;
  4. 現行のアクティブ・データベースでttRepDeactivate組込みプロシージャをコールします。これによって、このデータベースはIDLE状態になります。
    call ttRepDeactivate;

    ttRepStateGet組込みプロシージャをコールして、データベースの状態を表示します。

    Command> call ttRepStateGet;
    < IDLE >
    1 row found.
  5. 古いスタンバイ・データベースでttRepStateSet('ACTIVE')組込みプロシージャをコールしてスタンバイをアクティブに昇格します。このデータベースがアクティブ・スタンバイ・ペアのアクティブ・データベースになります。ttRepStateGet組込みプロシージャを使用して、データベースがアクティブになったことを確認します。
    call ttRepStateSet('ACTIVE');
    Command> call ttRepStateGet;
    < ACTIVE >
    1 row found.
    
  6. アクティブ・データベースだったデータベースでレプリケーション・エージェントを停止します。
    ttAdmin -repStop ttdb1
  7. 新しいアクティブ・データベースでttRepStateSaveを実行し、以前のアクティブ・データベースの状態を失敗に設定します。スタンバイ・データベースが使用できない間は、アクティブ・データベースへの更新は、サブスクライバ・データベースに直接レプリケートされます。
    call ttRepStateSave('FAILED', 'ttdb1', 'ttsrv1');
  8. 新しいアクティブ・データベース(ttdb2)でアプリケーションのフル・ワークロードを再起動します。

このデータベースがアクティブ・スタンバイ・ペアのスタンバイ・データベースとして機能するようになります。

スタンバイの廃棄および新しいスタンバイの再作成

ttRepAdmin -duplicateコマンドを使用して新しいアクティブを複製することで、スタンバイを破棄して新しいスタンバイを再作成できます。

これらのステップの間、アクティブ・データベースではアプリケーション処理は続行できます。

  1. 新しいスタンバイ・データベースでキャッシュ・エージェントを停止します。
    ttAdmin –cacheStop ttdb1
  2. キャッシュ・マネージャ・ユーザーとして、ttIsqlを使用してすべてのキャッシュ・グループを削除します。
    DROP CACHE GROUP t_cg;
  3. 次のようにデータベースを破棄します:
    ttDestroy ttdb1
  4. 新しいアクティブを複製して新しいスタンバイ・データベースを再作成します。
    ttRepAdmin -duplicate -from ttdb2 -host ttsrv2 –setMasterRepStart -UID 
    ttAdmin -PWD ttadminpwd -keepCG -cacheUID cacheadmin -cachePWD cadminpwd ttdb1
  5. 新しいスタンバイ・データベースでキャッシュ・エージェントおよびレプリケーション・エージェントを起動します。
    ttAdmin –cacheStart ttdb1
    ttAdmin –repStart ttdb1

このプロセスにより、ごく数秒の間サービスが中断するのみで、アクティブ・データベースとスタンバイ・データベースの両方がデフラグされます。

アクティブ・スタンバイ・ペアではないレプリケーション・スキーム内のTimesTen Classicデータベースのオンライン・デフラグメンテーション

(最小の総サービス・ダウンタイムで) TimesTen Classicデータベースをデフラグするには、ttMigrate -relaxedUpgradeおよびttRepAdmin -duplicateユーティリティを組み合せて使用します。これらのデータベースは、TABLE DEFINITION CHECKINGRELAXEDに設定されているレプリケーション・スキームに関係しています。また、ttMigrate -relaxedUpgradeオプションによってパーティションを圧縮します。

ノート:

各項で示す例は、ユーザーがレプリケーション・スキームの構成および管理に精通していることを前提としています。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』はじめにを参照してください。

次の項では、アクティブ・スタンバイ・ペアではないレプリケーション・スキームに関係しているTimesTen Classicデータベースをデフラグする方法について説明します。

ノート:

次の項では、双方向レプリケーション・スキームに関係しているデータベースをデフラグする方法について説明します。双方向レプリケーション・スキームでは、各データベースはマスターおよびサブスクライバの両方になります。

この項の例では、2つのTimesTenデータベース(それぞれttdb1およびttdb2という名前)で双方向および一方向レプリケーションによるオンライン・デフラグメンテーションを実行する方法を示します。一方向レプリケーションの例では、ttdb1はマスターを表し、ttdb2はサブスクライバを表します。

データベースの移行および再構築

この手順の第1ステップは、TimesTen Classicデータベースの1つでレプリケーションを停止し、このデータベースをデフラグすることです。

ノート:

データベースの1つをデフラグしている間、他のデータベースではアプリケーション処理を続行できます。

データベースのコピーを保存するには、次の手順を実行します。

  1. データベースの1つでレプリケーション・エージェントを停止します。

    ttdb2データベースの場合:

    ttAdmin –repStop ttdb2
  2. ttMigrateを使用してttdb1データベースのコピーを保存します。
    ttMigrate -c ttdb2 ttdb2.dat
  3. 次のようにデータベースを破棄します:
    ttDestroy ttdb2
  4. ADMIN権限のあるTimesTenユーザーとして、ttdb2データベースを再構築します。
    ttMigrate -r -relaxedUpgrade -connstr "dsn=ttdb2;uid=ttadmin;pwd=ttadminpwd" ttdb2.dat

    このとき:

    • すべてのユーザーがttdb2に格納されました。

    • レプリケーション・エージェントは稼働していません。

  5. ttdb2でレプリケーション・エージェントを再起動します。
    ttAdmin -repStart ttdb2

ttdb2 TimesTenデータベースがデフラグされました。

レプリケーション・スキームの変更

ttdb1データベースにデータベース・デフラグメンテーションを実行するには、次の操作を実行します。

  1. すべてのアプリケーション処理を停止し、ttAdmin -disconnectコマンドを使用してすべてのアプリケーション接続を切断します。すべての処理をttdb2 TimesTenデータベースで稼働するように移動できます。詳細は、このマニュアル内の「データベースからの切断」、および『Oracle TimesTen In-Memory Databaseリファレンス』ttAdminを参照してください。
  2. デフラグしたデータベース(ttdb2)のデータベース名およびホストを入力パラメータとして、デフラグされていないデータベース(ttdb1)でttRepSubscriberWait組込みプロシージャをコールします。これにより、キューに入れられたすべての更新が両方のデータベースに送信されます。

    ノート:

    waitTime-1に設定した場合、コールは、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまで待機します。

    ただし、waitTimeを任意の値(NULL以外の値)に設定する場合、操作を実行する前に、timeOut戻りパラメータの値が0x00であることを確認してください。戻り値が0x01の場合、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまでttRepSubscriberWait組込みプロシージャをコールします。

    『Oracle TimesTen In-Memory Databaseリファレンス』ttRepSubscriberWaitを参照してください。

    ttdb1でttIsqlを使用して次のようにします。

    call ttRepSubscriberWait(NULL,NULL,'ttdb2','ttsrv2', 100);

    双方向レプリケーション・スキームを使用する場合、ステップ3およびステップ4をスキップしてステップ5に進んでください。

  3. 一方向レプリケーション・スキームの場合(ttdb1がマスターでttdb2がサブスクライバ)、両方のTimesTenデータベースでレプリケーション・スキームを破棄します。

    ttdb1でttIsqlを使用して次のようにします。

    DROP REPLICATION r1;

    ttdb2でttIsqlを使用して次のようにします。

    DROP REPLICATION r1;
  4. 一方向レプリケーション・スキームの場合、マスター(ttdb1)およびサブスクライバ(ttdb2)でレプリケーション・スキームを破棄します。

    ttdb1でttIsqlを使用して次のようにします。

    DROP REPLICATION r1;

    ttdb2でttIsqlを使用して次のようにします。

    DROP REPLICATION r1;
  5. ttdb2でレプリケーション・エージェントを起動します。
    ttAdmin -repStart ttdb2
  6. ttdb1でレプリケーション・エージェントを停止します。
    ttAdmin -repStop ttdb1

一方向レプリケーション・スキームを変更する場合、ttdb2データベースは一方向スキームでマスター・データベースとして稼働しており、ttdb1データベースは一方向レプリケーション・スキームでサブスクライバ・データベースとして稼働しています。

データベースの破棄および再作成

ttRepAdmin -duplicateを使用して、デフラグされていないレプリケーション・スキーム内のTimesTenデータベースを破棄して再作成します。

これらのステップの間、デフラグしたデータベースではアプリケーション処理を続行できます。

  1. 次のようにデータベースを破棄します:
    ttDestroy ttdb1
  2. レプリケーション・スキームに関係したデフラグ済のTimesTen Classicデータベース(ttdb2)を複製して、新しいTimesTen Classicデータベース(ttdb1)を再作成します。
    ttRepAdmin -duplicate -from ttdb2 -host ttsrv2 –setMasterRepStart -UID ttadmin -PWD ttadminpwd ttdb1
  3. 新しいスタンバイ・データベースでレプリケーション・エージェントを起動します。
    ttAdmin –repStart ttdb1

この処理は、一方向レプリケーション・スキームまたは双方向レプリケーション・スキームのいずれに属するTimesTen Classicデータベースも、数秒のサービス停止時間のみでデフラグします。