CHAPTER 8: シェアードメモリ


8.1 はじめに

シェアードメモリ機能は、システムのシェアードメモリを利用を通じて、 Empress RDBMSのパフォーマンスを向上するための機能を提供します。

通常、各プロセスは、自身のメモリ空間を持ち、他のプロセスのメモリ空間を アクセスすることができませんが、シェアードメモリは、複数のプロセスで 共有する特別なメモリセクションでオペレーティングシステムの構成要素です。 シェアードメモリを利用することで、ファイルI/O を減らし、 データベースのパフォーマンスを向上することができます。

Empressは、パフォーマンス向上のために ロックマネージャグローバルバッファマップファイルの シェアードメモリを使用した3つ方法を提供します。



図 8-1: Empress シェアードメモリ



8.1.1 ロックマネージャ

データベースへのアクセスが行われた場合にその情報が正しいことを保証するために Empressではロックが使用されます。 ロックによって、2人のユーザー(またはプロセス)が同時に同じデータを修正することを 防ぐことができます。また、データが修正されている間に読み込まれることも防ぎます。

通常、ロック情報はファイルに格納され、データベースの操作の間、頻繁にアクセスされます。 システムメモリへのアクセスは、ディスクI/Oよりかなり速いため、 データベースのパフォーマンスを向上する意味でシェアードメモリに このロック情報を置く事で改善することができます。

ロックマネージャは、シェアードメモリ内に各プロセスがアクセス可能な ロック情報を正確に置くことを行います。 Empressは、ロックマネージャのタイプ(シェアードメモリまたはファイル) がテーブル単位で定義することできるため、あるテーブルはシェアードメモリを 使用し、またあるテーブルはロックファイルを使用する定義が可能です。

8.1.2 グローバルバッファ

プロセスがファイルからデータを取得しようとするたびにそのファイルを 読む必要がありますが、Empressではグローバルバッファ によって、1つのファイルの1部分か全部、また、多くのファイルを シェアードメモリ内に保存することができます。 これによりアクセス速度が短縮され、性能が向上します。

グローバルバッファは、メモリブロックに分割されます。 グローバルバッファへのファイルの関連付けにより ブロックの一部、あるいはすべてのファイルの一部が動的に割り当てられます。 指定されたグローバルバッファの関連付けられたファイルのデータが バッファに格納可能なデータ量より多い場合、 バッファブロックの一部は必要に応じて新しいデータに上書きされます。 この上書きは、least-recently-used (lru)アルゴリズムによって管理されます。 lru アルゴリズムは、最近、最も使われていないバッファブロックを 上書きの対象ブロックであることを決定します。

グローバルバッファを持つファイルにデータが書き込まれた場合、 データはグローバルバッファとファイルに同時に書き込まれます。 このことから、グローバルバッファは、write-through バッファと呼ばれます。 また、グローバルバッファ内のデータは常にファイル内のデータを確実に 反映することも意味しています。

8.1.3 マップファイル

マップファイル は、ファイルのデータをシェアードメモリに格納する点では グローバルバッファと同じですが、シェアードメモリにマップするファイルの関係おいては、 マップできるファイルは1つのファイルだけになります。 また、マップファイルはブロックに分割されません。 その代わりにファイルの指定セクションと直接、関連付けられる1つの大きなメモリブロックに なっています。 そのことから、マップファイルは実質的には指定ファイルへのウィンドウと考えることができます。 このウィンドウはファイル全体、あるいはファイルの最初から始まるファイルの一部、 またはユーザーが示す位置で開始、終了するセクションになります。

マップファイルは、関係付けられたファイルと常に1対1の関係を持つことが必要です。 同じマップファイルに複数のファイルを関連付けようとしてもファイルへのアクセス時に エラーが起こります。



8.2 シェアードメモリを使用する上での一般的なガイドライン

シェアードメモリは、他の多くのリソースと同様にシステム上の貴重なリソースです。 通常、データベースの性能を最適化するためにシェアードメモリに大容量のメモリを 割り当て、さらにCPUとすべてのプロセスがそれぞれのタスクを実行できるように 十分なメモリを残すためには考慮すべき点があります。 データベースでシェアードメモリを使用するための一般的なガイドラインと助言を 以下に示します。

  1. シェアードメモリ上にロック情報を置くことで大きな性能向上が得られます。 これはレコードレベルロックまたはグループレベルロックが設定され、 テーブルに頻繁にアクセスされている場合には特に顕著に示されます。 注意としてアクセス頻度が低いテーブルへのロックはメモリの消費を抑えるため、 ディスク上で行うのがよいかもしれません。

  2. 読み込みだけ、または読み込みがほとんどのファイルはシェアードメモリを利用する最適な テーブルになります。 更新がシェアードメモリに対応するファイルに行われる場合は、 インメモリイメージもオンディスクイメージと共に更新されることが必要になります。 これはライトスルーメモリと呼ばれます。 ディスクへのアクセスは、常にファイルへの更新が要求されるため、更新のシェアードメモリを 用いて作成する利点はなく、シェアードメモリとディスク更新のオーバーヘッドによって引き起こされる 損失ばかりが存在します。

    従って、最も適応するものは頻繁に読み込まれるファイル、または大きく変更されない ファイルになります。参照チェック用のテーブル、あるいは参照のみに使用されるテーブルが メモリ内配置の考慮の対象となります。

    読み込み率 50%が、シェアードメモリ内へのファイル配置のおおよそのガイドラインになります。 empadm database shminfoからの出力リストは、マップファイルおよびグローバル バッファに対する読み込み率を表示します。

  3. マップファイルに対して選択されたブロックサイズは、システムのEmpressブロック サイズより小さくすべきではありません。(通常は1024バイト) これは、例えばそのブロックの一部がシェアードメモリ内にある場合、 Empressが取得する必要があるデータブロックより、 メモリ内ブロックが小さい場合、毎回、ディスクへのアクセスが Empressに強制されるためです。

  4. インデックスが大量に使用される場合、そのインデックスが小さいとき(継続的に更新されない時)は、 マップファイル内に配置され、大きいときはグローバルファイル内に配置されます。 グローバルバッファへマップされた場合は、インデックスセクションは常時にシェアードメモリ内に 存在するわけではありませんが、場合により有効になります。 ほとんどのユーザーがインデックスの一部分を必要とする場合、 例えば、以前の日付と最近の日付などの検索では読み込みヒット率は特に向上します。

    これはファイルにも適用されます。大きなファイルの読み込みヒット率は、 ファイルの特定部分が一度に使用される場合に向上します。 例えば、テーブルの終わりへの最新の追加などです。

  5. Empresssys_dictionaryテーブルは、 すべてのテーブルがアクセスされるたびにアクセスされるため、 そのsys_dictionaryのすべてのファイル (メインテーブル、インデックスおよびオーバーフローファイル) をグローバルバッファ内に配置することはパフォーマンスの向上になります。 他のEmpressのシステムテーブルは通常、シェアードメモリ内には置きません。

  6. オーバーフローファイル上でのシェアードメモリの使用は、レコード長が大きく変化するため、 予測が難しいところがあります。 グローバルバッファが特に大きくないのであれば、読み込みヒット率は非常に低くなります。

  7. インデックスオーバーフローファイルは、そのプライマリインデックスファイルが シェアードメモリ内に存在しない場合は、配置しないでください。 これは、プライマリファイルへのアクセスが、 オーバーファイルセグメントを見つけるためで、 常に最初に必要とされているためです。 プライマリファイル内で0バイトで構成されるインデックスファイルについてもこのことは 当てはまります。

  8. グローバルバッファのパラメータMSPARTGBUFMAXFILESは、 そのグローバルバッファ内部で要求されるすべてのファイルを処理するために 十分な大きさを常に指定する必要があります。 グローバルバッファ内で参照しているファイルが あまりにも多すぎる場合、システムエラーになります。 デフォルトセクションが、パラメータファイル内に含まれている場合は 特にこの点には注意する必要があります。 デフォルトセクションが設定されている場合、テーブルと関連付けられているすべてのファイルは グローバルバッファを通してアクセスされます。 データベース管理者は、ファイルの最大数を計算し、変数を設定しなければなりません。

  9. ネットワーク環境内では、データベースの存在するマシン上にシェアードメモリの 設定をする必要があります。

  10. empadm database shminfoの出力リストからの統計情報によって、 シェアードメモリのチューニング情報が提供されます。

    マップファイル内部においての論理書き込みに対する論理読み込みの割合は、 ファイルで発生する書き込みに対する読み込みの割合と同じと言えます。 読み込みの割合が高い場合、このファイルはシェアードメモリに適した候補と言えます。 読み込み率は、グローバルバッファとマップファイルの両方について計算されます。

    読み込みヒット率は、ディスクからではなく、マップファイルまたはグローバルバッファから 発生する読み込みの割合で決定されます。 この数字が低い場合はグローバルバッファまたはマップファイルのサイズを大きくするか、 あるいはマップファイルへの開始オフセットを変更するか、またこのファイルからの シェアードメモリを削除する必要があります。



8.3 シェアードメモリをセットアップするためのリファレンスガイド

このセクションは、定義、作成、コンフィグレーションおよび シェアードメモリパーティションへのデータベーステーブルの関連付けを おこなうためのクイックリファレンスです。 デフォルトのシェアードメモリパーティションを使用し、 新規に作成したデータベースにシェアードメモリをマップするための empmkdbのオプションも提供されます。 詳しくは データベースのデフォルトシェアードメモリのマップ のセクションを参照してください。

シェアードメモリをセットアップするためのステップ

  1. Empressユーティリティempshmを使用して、 パーティションファイルを作成することによりシェアードメモリパーティションを定義します。

       empshm partitions partition_file
    
    

    このユーティリティは情報を設定するために対話形式で行います。 結果として、シェアードメモリパーティション情報(ASCII テキスト)を 格納したファイルが作成されます。 このパーティションファイルはテンポラリファイルで、その内容を システムエディタを使用して、tabzeroの終わりに 手動で追加します。(ステップ 6) このシェアードメモリパーティション情報は、tabzeroに記述する必要があります。

    詳細な情報および例は シェアードメモリパーティションの定義 のセクションを参照してください。

  2. シェアードメモリにインデックス情報を配置する場合、 必ずすべてのインデックスに名前付けしなくてはなりません。 名前付けされていない場合、SQLの DROP INDEXおよび CREATE INDEXコマンドを使用して、インデックスの 削除と再作成をする必要があります。

    詳しくは Empress SQL: リファレンスマニュアルの データ定義コマンド を参照してください。

  3. 特別なシェアードメモリパーティションへのファイル、インデックスおよび各テーブルのロック情報を マップするためのパラメータファイルを作成します。 オペレーションシステムのプロンプト上で以下のコマンドを実行します。

       empshm params param_file
    
    

    詳細はこの章の シェアードメモリへのマッピングパラメータの定義 を参照してください。

  4. 対象となるデータベース上で他のユーザー(プロセス)が作業していないことを 確認するためにオペレーションシステムのプロンプト上で以下のコマンドを実行します。

       empadm database_name coordinfo
    
    

    データベース上に作業中のユーザーが存在しないのであれば、 以下のコマンドで未解決のロックをすべてクリアします。

       empclrlk database_name
    
    

    empclrlk ユーティリティの詳細は、このマニュアルの マニュアルページ を参照してください。

  5. ここまででデータベースのシェアードメモリパーティションを作成するための 準備が整いましたが、他のユーザーがそのデータベースにアクセスできないように しなくてはなりません。これは以下のコマンドを実行します。

       empadm database_name dbamode
    
    

    このコマンドは、データベースをシングルユーザーモードでアクセスするための データベース管理者(DBA)にだけ許可されたコマンドです。 empadmユーティリティの詳細は、このマニュアルの マニュアルページ を参照してください。

    empclrlkは、 dbamodeのロックを含むすべてのロックをクリアするため ステップ4、ステップ5に戻ることができないことに注意してください。

  6. システムのエディタを使用してtabzeroファイルの終わりに パーティションファイルの内容を追加します。 異なったシェアードメモリセグメントを記述されているいくつかのパーティションファイルを 1つのtabzeroファイルへ追加しても構いません。

  7. 以下のコマンドによりシェアードメモリパーティションを作成します。

       empadm database_name shmcreate
    
    
  8. シェアードメモリパーティションが正しく作成されたかどうかを以下のコマンドで確認します。

       empadm database_name shminfo
    
    

    また、UNIXコマンドを使用する場合は次のコマンドになります。

       ipcs -m
    
    
  9. メモリ内にsys_dictionaryのロックファイルをマップすることを除いて、 すべてのマップを作成することが可能です。

       MSPARTLOCKNAME=lock_manager_name
    
    

    上記のMSPARTLOCKNAMEのlock_manager_nameに ロックマネージャ名である行が sys_dictionaryのパラメータファイル内にある場合、 行の先頭の位置に":"を置くことでコメントアウトします。

    コメントアウトしたsys_dictionaryのパラメータファイルの例は 以下のとおりです。

       MSPARTGBUFNAME=gbuf2
    
       MSPARAMLOCK
       :  MSPARTLOCKNAME=lockmgr2
       MSPARAMLOCKEND
    
    

    sys_dictionaryが、シェアードメモリにマップするテーブルの1つである場合は そのパラメータファイルをtabzeroの末尾に追加する必要があります。 これは、sys_dictionary自体へアクセスするために必要です。 システムエディタを使用して、tabzeroファイルを更新します。 追加する情報は以下の順序で指定してください。

       MSDBDICTPARAMS
          MSPARTGBUFNAME=gbuf2
    
          MSPARAMLOCK
          MSPARAMLOCKEND
       MSDBDICTPARAMSEND
    
    

    sys_dictionary同様にロックファイルをメモリ内に置く場合は、 例のように設定します。

       MSDBDICTPARAMS
          MSPARTGBUFNAME=gbuf2
    
          MSPARAMLOCK
       :        MSPARTLOCKNAME=lockmgr2
          MSPARAMLOCKEND
       MSDBDICTPARAMSEND
    
    

    sys_dictionaryのロックは、 "マッピング"のセクション間でコメントアウトされている場合、 後のステップ13までtabzero内のコメントアウトは残す 必要があることに注意してください。

  10. 適用するテーブルへパラメータファイルをマップするコマンドは以下になります。

       empadm database_name params param_file table {table}
    
    
  11. 以下のSQLコマンドを使用して、データベース内へ関連付けが正しく行われたかどうかを確認します。

       DISPLAY table ALL;
    
    

    このコマンドは、テーブルに関連付けられたシェアードメモリ情報を表示します。

  12. dbamodeからログアウトし、データベースを使用可能にします。

  13. sys_dictionaryロックをシェアードメモリ内で処理する必要がある場合は、 ステップ9 でコメントアウトされた行のコメントをはずします。

    ロックを含むシェアードメモリへのsys_dictionaryの新しいマッピングは 以下のように実行することができます。

       empadm database params param_file sys_dictionary
    
    

    sys_dictionaryロックをマッピングする場合は、dbamodeを起動しないでください。 これはdbamodeによって、sys_dictionaryによってロックが掛けられ、 データベースが抑制されるためです。 dbamodeの間にこのロックの関連付けが修正された場合、 データベースのアンロックは正しく実行することができません。

  14. シェアードメモリのセットアップのプロセスは完了し、 データベースは使用可能になります。

  15. オペレーティングシステムのプロンプト上から以下のコマンドを発行することで シェアードメモリのステータスをチェックすることができます。

    empadm database_name |shminfo
    |shmstats
    |
    |

    問題が起こった場合、以下のコマンドを使用して シェアードメモリパーティションをクリアし、 初期値にリセットすることができます。

       empadm database_name shmclear
    
    

    シェアードメモリパーティションを削除します。 このコマンドはデータベースにアクセスがないことを確かめ実行します。

       empadm database_name shmremove
    
    

    このコマンドはtabzeroファイル内のシェアードメモリ定義が変更された場合、 またtabzeroファイルが修正される前に実行しなくてはなりません。



8.4 シェアードメモリパーティションの定義

シェアードメモリはパーティションに分割され、 パーティションには、ロックマネージャ、グローバルバッファ、マップファイルの 3つのタイプがあります。 シェアードメモリ内ではそれぞれのタイプが複数存在しても関係なく、 またすべてのタイプが揃っている必要はありません。 例えば、シェアードメモリに1つだけロックマネージャのパーティションを 置くだけでもよく、また3つのロックマネージャパーティションと2つの グローバルバッファ、4つのマップファイルを置いても構いません。 唯一の制限として、個々のパーティションの数とサイズが、 シェアードメモリで有効なシステムメモリ量に収まる必要があります。

パーティションファイルは、特別なレイアウトを持っているため、 empshmユーティリティにより自動的にファイルを設定します。 以下の例は、このユーティリティの使用方法に関して示します。 (ユーザー入力は、ボールドフォントで示されます。)

この例では、シェアードメモリセグメントは、2つのグローバルバッファと 2つのマップファイル、1つのロックマネージャを含んだ定義を行います。 このパーティションファイルを作成するコマンドは以下になります。

   empshm partitions part_file

empshmは、以下のようにそれぞれのパラメータの入力を促す メッセージを出力します。

   キー番号を入力してください。: 123456

   このパーティションはsys_dictionaryで使用しますか?n

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   LOCK

   パーティション名は?Lock1

   このロックマネージャの最大ロック数は?500
        MSPARTNAME=Lock1
        MSPARTTYPE=LOCK
                MSPARTLOCKNLOCKS500
        MSPARTEND

   以上の設定でよろしいですか?   yes

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   GBUF

   パーティション名は? Global1

   このグローバルバッファのファイル最大数は? 15

   このグローバルバッファのブロックサイズ(512バイトの倍数)は? 2

   このグローバルバッファのブロック数は? 20

         MSPARTNAME=Global1
         MSPARTTYPE=GBUF
               MSPARTGBUFMAXFILES=15
               MSPARTGBUFBLOCKSIZE=1024
               MSPARTGBUFNBLOCKS=20
         MSPARTEND

   以上の設定でよろしいですか?  yes

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   GBUF

   パーティション名は? Global2

   このグローバルバッファのファイル最大数は? 15

   このグローバルバッファのブロックサイズ(512バイトの倍数)は? 2

   このグローバルバッファのブロック数は? 20

         MSPARTNAME=Global2
         MSPARTTYPE=GBUF
               MSPARTGBUFMAXFILES=15
               MSPARTGBUFBLOCKSIZE=1024
               MSPARTGBUFNBLOCKS=20
         MSPARTEND

   以上の設定でよろしいですか?  yes

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   MAPF

   パーティション名は?  Mapped1

   このマップファイルのサイズ(512バイトの倍数)は?2

   このマップファイルへのオフセット開始位置は?0
         MSPARTNAME=Mapped1
         MSPARTTYPE=MAPF
               MSPARTMAPFSTART=0
               MSPARTMAPFSIZE=1024
         MSPARTEND

   以上の設定でよろしいですか?  yes

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   MAPF

   パーティション名は? Mapped2

   このマップファイルのサイズ(512バイトの倍数)は?2

   このマップファイルへのオフセット開始位置は?0

         MSPARTNAME=Mapped2
         MSPARTTYPE=MAPF
               MSPARTMAPFSTART=0
               MSPARTMAPFSIZE=1024
         MSPARTEND

   以上の設定でよろしいですか?  yes

   どのパーティションタイプにしますか?
           ロックマネージャの場合、LOCK
           グローバルバッファ、GBUF
           マップファイルの場合、MAPF
           終了の場合、END
   >   END


以下の情報を含んだ指定されたpart_fileが作成されます。

   MSSHMKEY=123456
   MSSHMPROTECTION=

         MSPARTNAME=Lock1
         MSPARTTYPE=LOCK
               MSPARTLOCKNLOCKS=500
         MSPARTEND

         MSPARTNAME=Global1
         MSPARTTYPE=GBUF
               MSPARTGBUFMAXFILES=15
               MSPARTGBUFBLOCKSIZE=1024
               MSPARTGBUFNBLOCKS=20
         MSPARTEND

         MSPARTNAME=Global2
         MSPARTTYPE=GBUF
               MSPARTGBUFMAXFILES=15
               MSPARTGBUFBLOCKSIZE=1024
               MSPARTGBUFNBLOCKS=20
         MSPARTEND

         MSPARTNAME=Mapped1
         MSPARTTYPE=MAPF
               MSPARTMAPFSTART=0
               MSPARTMAPFSIZE=1024
         MSPARTEND

         MSPARTNAME=Mapped2
         MSPARTTYPE=MAPF
               MSPARTMAPFSTART=0
               MSPARTMAPFSIZE=1024
         MSPARTEND

   MSSHMEND


パーティションファイルは以下のフォーマットになります。

   シェアードメモリーキー
   データ辞書パーティションの指示子

      パーティション名 -----------------------v
      ロックマネージャパーティション          |
         最大ロック数                         |
      ロックマネージャ定義の終了タグ          |
            .                                        
            . (定義なしか繰り返し)                       
            .                                        
      パーティション名                        |  パーティション
      グローバルバッファパーティション        |      定義
         最大ファイル数                       |
         ブロックサイズ                       |
         最大ブロック数                       |
      グローバルバッファ定義の終了タグ        |
            .                                        
            . (定義なしか繰り返し)                       
            .                                        
      パーティション名                        |
      マップファイルパーティション            |
         オフセット                           |
         サイズ                               |
      マップファイル定義の終了タグ -----------^

   シェアードメモリ定義の終了タグ


以下にこのファイルの内容について説明します。

8.4.1 シェアードメモリーキー

パーティションファイルの最初のエントリはシェアードメモリーキーになります。 このキーは、指定のシェアードメモリブロックの識別にシステムが使用する ユーザー定義の番号です。 この番号は任意ですが、それぞれのサイトにキーを割り当てるためのプロシージャが必要になります。 同一のシェアードメモリブロックの使用を希望するすべてのデータベースは、識別用に同一のキーを 使用する必要があります。

   MSSHMKEY=123456

8.4.2 データ辞書パーティションの指示子

次にEmpress変数MSSHMPROTECTIONが指定されます。 このパーティションがsys_dictionaryによって利用される場合は、 シェアードメモリパーティションを特別に保護するため、この変数は "on"に設定する必要があります。 sys_dictionaryによって使用されない場合は、この変数はセットされません。 設定は以下のように行います。

   MSSHMPROTECTION=on

8.4.3 パーティション定義

パーティションの定義は、複数のパーティションをどのような順番でも 定義できます。 すべてのパーティションの定義は、最初の2行が同じです。 この2行とは名前とタイプでその順序になります。 パーティション名は、長さが32文字より小さくどのような文字列でも 構いません。(32文字より多い場合は切り詰められます。) パーティション名の設定例は、以下のようになります。

   MSPARTNAME=Lock1
   MSPARTNAME=Global1
   MSPARTNAME=Global2
   MSPARTNAME=Mapped1
   MSPARTNAME=Mapped2

empshm partitionsは、自動的にパーティションのサイズを計算します。 選択可能な3つのパーティションタイプは、ロックマネージャ、グローバルバッファ、 およびマップファイルで、それに対しLOCK, GBUF, MAPF を選択することができます。 パーティションタイプの設定例は、以下のようになります。

   MSPARTTYPE=LOCK
   MSPARTTYPE=GBUF
   MSPARTTYPE=GBUF
   MSPARTTYPE=MAPF
   MSPARTTYPE=MAPF

各パーティションタイプは一意のパラメータを定義する必要があります。

8.4.3.1 ロックマネージャのパラメータ

ロックマネージャのパラメータは、ロック数を指定します。

ロックマネージャが操作可能なロックの最大数で、 この値以上にロックしようとするとエラーメッセージを出力し、 プロセスは停止します。 この数を決めるにあたり経験則を上げると、この数はデータベースユーザー数に 比例し、データベース内頻繁に使用されるレコード総数に比例します。 設定例は以下のとおりです。

   MSPARTLOCKNLOCKS=500

8.4.3.2 グローバルバッファのパラメータ

グローバルバッファの固有なパラメータとして、最大ファイル数、ブロックサイズおよびブロック数があります。

ファイルの最大数は、グローバルバッファを使用するアクセス可能なファイルの数の上限になります。 例では、Global1Global2のエントリは以下のように設定されます。

   MSPARTGBUFMAXFILES=15

ブロックサイズはグローバルバッファ内の個々のバッファサイズを決定します。 最適な入出力を行うためのブロックサイズは、ファイルシステムのブロックサイズの 倍数にすべきで 512 バイトの倍数が適当です。 例では、Global1Global2のエントリは以下のように設定されます。

   MSPARTGBUFBLOCKSIZE=1024

ブロック数はグローバルバッファ内のブロック数になります。 これは、グローバルバッファ内で頻繁に使用されるデータを保存するために 選択しなければなりません。 このパラメータはチューニングを必要とする場合があり、 シェアードメモリ管理プログラムempadmは、 チューニングを手助けする統計情報を提供します。 例では、Global1Global2のエントリは以下のように設定されます。

   MSPARTGBUFNBLOCKS=20

8.4.3.3 マップファイルのパラメータ

マップファイルパーティションは、スタートオフセットとサイズの 2 つの固有のパラメータを持ちます。 スタートオフセットは、マップされるファイルの開始からのオフセットです。 (つまりファイルウィンドウの開始) 例では、Mapped1Mapped2のエントリは以下のように設定されます。

   MSPARTMAPFSTART=0

サイズは最も頻繁に使用されるデータを保存するため、 また、ファイルが小さい場合はファイル全体を保存するために 指定する必要があります。 例では、Mapped1Mapped2のエントリは以下のように設定されます。

   MSPARTMAPFSIZE=1024

8.4.3.4 パーティション定義の終了

各パーティションの終了は、以下の行で指示されます。

   MSPARTEND

8.4.4 シェアードメモリ定義の終了指示子

シェアードメモリ定義の終了は以下の行で指示されます。

   MSSHMEND



8.5 シェアードメモリへのマッピングパラメータの定義

シェアードメモリが定義され、セグメントが作成された後、 データベースのファイルおよびロックをシェアードメモリパーティションに関連付ける 必要があります。 1つのテーブルのシェアードメモリへのマップに関しての詳細を保存するために マッピングパラメータファイルを作成しなくてはなりません。 シェアードメモリにマップするデータベース上の各テーブルはマッピングパラメータ ファイルを持ちますが、個々のテーブルは固有のマッピングパラメータファイルを 持つ必要はありません。

データベース内の異なるテーブルについて、同一のマッピングパラメータファイルを 使用することは可能ですが、マップファイルと実際のデータベースファイルは 1対1で関連付け、管理しなければなりません。

ユーティリティempshmを使用することで自動的にマッピングパラメータファイルを 生成することができます。以下に例を示します。

この例は、パラメータファイルを設定するため 前の例で定義されたパーティションを使用します。 パラメータファイルを生成するコマンドは以下になります。

   empshm params param_file

   このテーブルのすべてファイルはグローバルバッファを使いますか?(y/n) yes

   グローバルバッファパーティション名を入力してください。 Global1

   シェアードメモリを使用しているマスタデータファイルへアクセスしますか? yes

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF と入力して下さい。 GBUF

   'global buffer' パーティション名を入力してください。 Global2

   シェアードメモリを使用している可変長データオーバーフローファイルへアクセスしますか?(y/n) yes

   アトリビュート名は? attribute_1

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF と入力して下さい。 GBUF

   'global buffer' パーティション名を入力してください。 Global2

   他のアトリビュート名を入力しますか? no

   シェアードメモリを使用しているインデックスファイルへアクセスしますか?(y/n) yes

   アクセスするインデックス名は? index_1

   プライマリインデックスは PRIMARY、オーバーフローインデックスは OVERFLOW、プライ
   マリとオーバーフロー両インデックスは BOTH と入力して下さい。PRIMARY

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF
   と入力して下さい。 MAPF

   'mapped file' パーティション名を入力してください。 Mapped1

   シェアードメモリを使用しているオーバーフロー・インデックスへアクセスしますか?(y/n) yes

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF
   と入力して下さい。 MAPF

   'mapped file' パーティション名を入力してください。 Mapped2

   他のインデックス名を入力しますか? no

   シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes

   ロックマネージャパーティション名は?Lock1

以下の情報を含んだ指定したparam_fileファイルが作成されます。

   MSPARTGBUFNAME=Global1

   MSPARAMTABLE
         MSPARTGBUFNAME=Global2
   MSPARAMTABLEND

   MSPARAMATTRNAME=attribute_1
         MSPARTGBUFNAME=Global2
   MSPARAMATTRNAMEND

   MSPARAMINDEXNAME=index_1
         MSPARAMINDEXPRIMARY
               MSPARTMAPFNAME=Mapped1
         MSPARAMINDEXPRIMARYEND
         MSPARAMINDEXOVERFLOW
               MSPARTMAPFNAME= Mapped2
         MSPARAMINDEXOVERFLOWEND
   MSPARAMINDEXNAMEND

   MSPARAMLOCK
         MSPARTLOCKNAME= Lock1
   MSPARAMLOCKEND

パラメータファイルは次の 5 つのパートに分割できます。 デフォルトマッピング、 メインデータ(.rel)ファイルのマッピング、 可変長データオーバーフロー(.dtf)ファイルのマッピング、 インデックス(.ix.ixl)ファイルのマッピング、 ロック(.lck)ファイルのマッピングになります。 これらのセクションは強制的なものではありませんが、順序には決まりがあり、 少なくとも 1 つのセクションが含まれている必要があります。 また、メインデータ、可変長データオーバーフローとインデックスセクションは 複数指定することができますが、 デフォルトセクションとロックセクションの指定はパラメータファイル内に 1つだけしか指定することはできません。

8.5.1 デフォルトマッピング定義

デフォルトとして1つのグローバルバッファ内にテーブルを関連付け、 メインデータファイル、インデックスファイルとオーバーフローファイルの すべてをマップすることができます。

   このテーブルのすべてファイルはグローバルバッファを使いますか?(y/n) yes

   グローバルバッファパーティション名を入力してください。 Global1

ここまでの設定だけを行う場合は、以降はnoと入力します。 この場合のマッピングパラメータファイルの結果は以下になります。

   MSPARTGBUFNAME=Global1

   MSPARAMLOCK
   MSPARAMLOCKEND

この設定でロックファイルを除く、 テーブルと関連したすべてのファイルを シェアードメモリにマップすることになります。 ロックマネージャパーティションが定義され、 シェアードメモリ上にロックをマップさせたい場合は、 以下の質問の箇所でyesと入力します。

   シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes

   ロックマネージャパーティション名は?Lock1

これによって、ロックを含むテーブルと関連したすべてのファイルを シェアードメモリ上にマップすることになります。 この場合のマッピングパラメータファイルは以下になります。

   MSPARTGBUFNAME=Global1

   MSPARAMLOCK
       MSPARTLOCKNAME=Lock1
   MSPARAMLOCKEND

8.5.2 メインデータファイルのマッピング定義

デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 メインデータファイル(可変長データテーブル TEXT,BULK を除くすべてのテーブル) とシェアードメモリパーティション(グローバルバッファかマップファイルのどちらか) を明確に対応付けることができます。 この設定はメインデータファイルのデフォルトの設定を上書きします。 例えば、

   このテーブルのすべてファイルはグローバルバッファを使いますか?(y/n) yes

   グローバルバッファパーティション名を入力してください。 Global1

   シェアードメモリを使用しているマスタデータファイルへアクセスしますか? yes

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF と入力して下さい。 GBUF

   'global buffer' パーティション名を入力してください。 Global2

   シェアードメモリを使用している可変長データオーバーフローファイルへアクセスしますか?(y/n) no

   シェアードメモリを使用しているインデックスファイルへアクセスしますか?(y/n) no

   シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes

   ロックマネージャパーティション名は?Lock1

このように指定した場合のマッピングパラメータファイルは以下になります。

   MSPARTGBUFNAME=Global1

   MSPARAMTABLE
       MSPARTGBUFNAME=Global2
   MSPARAMTABLEND

   MSPARAMLOCK
       MSPARTLOCKNAME=Lock1
   MSPARAMLOCKEND

この設定はグローバルバッファパーティションGlobal2上に テーブルのメインデータファイルを定義し、 ロックマネージャパーティションLock1上にロックファイルを 定義します。 インデックスや可変長データオーバーフローファイルがある場合は グローバルバッファパーティションGlobal1に定義されます。

8.5.3 可変長オーバーフローファイルのマッピング定義

デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 可変長データテーブル TEXT および BULKデータオーバーフローファイル とシェアードメモリパーティション(グローバルバッファかマップファイルのどちらか)を 明確に対応付けることができます。 この設定は、メインデータファイルのデフォルトの設定を上書きします。 例えば、

   このテーブルのすべてファイルはグローバルバッファを使いますか?(y/n) yes

   グローバルバッファパーティション名を入力してください。 Global1

   シェアードメモリを使用しているマスタデータファイルへアクセスしますか? no

   シェアードメモリを使用している可変長データオーバーフローファイルへアクセスしますか?(y/n) yes

   アトリビュート名は? attribute_1

   マップファイルを使用する場合は MAPF を、グローバルバッファを使用する場合は GBUF と入力して下さい。 GBUF

   'global buffer' パーティション名を入力してください。 Global2

   他のアトリビュート名を入力しますか? no

   シェアードメモリを使用しているインデックスファイルへアクセスしますか?(y/n) no

   シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes

   ロックマネージャパーティション名は?Lock1

この手順でのマッピングパラメータファイルは以下になります。

   MSPARTGBUFNAME=Global1

   MSPARAMATTRNAME=attribute_1
       MSPARTGBUFNAME=Global2
   MSPARAMATTRNAMEND

   MSPARAMLOCK
       MSPARTLOCKNAME=Lock1
   MSPARAMLOCKEND


この設定はグローバルバッファパーティションGlobal2上に アトリビュート名attribute_1の可変長オーバーフローファイルを定義します。 ロックマネージャパーティションLock1上にロックファイルを 定義します。また、その他のファイル(メインデータファイルやインデックスなど)は グローバルバッファパーティションGlobal1に定義されます。

8.5.4 インデックスファイルのマッピング定義

デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 インデックスファイルとシェアードメモリパーティション(グローバルバッファか マップファイルのどちらか)を明確に対応付けることができます。 この設定は、メインデータファイルのデフォルトの設定を上書きします。

インデックスのオーバーフローファイル(.ixl)は同じグローバルバッファで 共有することができます。またそれぞれをグローバルバッファまたはマップファイルに 関連付けることができます。この設定をするためにはインデックに名前付けを する必要があります。

インデックスファイルにアクセスするためにマップファイルが使用される場合、 インデックスファイルは成長することができるため、ファイルのすべての部分が 対応するマップファイルに適合できなくなることに注意する必要があります。

インデックスのプライマリおよびオーバフローの両方を同じグローバルバッファに割り当てる 場合は以下のような設定になります。

   MSPARAMINDEXNAME=index_1
       MSPARTGBUFNAME= Global1
   MSPARAMINDEXNAMEND

プライマリインデックスのみをグローバルバッファに割り当てる場合は 以下のような設定になります。

   MSPARAMINDEXNAME=index_1
       MSPARAMINDEXPRIMARY
           MSPARTGBUFNAME=Global1
       MSPARAMINDEXPRIMARYEND
   MSPARAMINDEXNAMEND

プライマリインデックスのみをマップファイルに割り当てる場合は 以下のような設定になります。

   MSPARAMINDEXNAME=index_1
       MSPARAMINDEXPRIMARY
           MSPARTMAPFNAME=Mapped1
       MSPARAMINDEXPRIMARYEND
   MSPARAMINDEXNAMEND

オーバーフローインデックスのみをグローバルバッファに割り当てる場合は 以下のような設定になります。

   MSPARAMINDEXNAME=index_1
       MSPARAMINDEXOVERFLOW
           MSPARTGBUFNAME=Global1
       MSPARAMINDEXOVERFLOWEND
   MSPARAMINDEXNAMEND

オーバーフローインデックスのみをマップファイルに割り当てる場合は 以下のような設定になります。

   MSPARAMINDEXNAME=index_1
       MSPARAMINDEXOVERFLOW
           MSPARTMAPFNAME=Mapped1
       MSPARAMINDEXOVERFLOWEND
   MSPARAMINDEXNAMEND

プライマリとオーバーフローインデックスのそれぞれに特定な関連付けをすることができます。

   MSPARAMINDEXNAME=index_1
       MSPARAMINDEXPRIMARY
           MSPARTGBUFNAME=Global1
       MSPARAMINDEXPRIMARYEND
       MSPARAMINDEXOVERFLOW
           MSPARTMAPFNAME=Mapped1
       MSPARAMINDEXOVERFLOWEND
   MSPARAMINDEXNAMEND

8.5.5 ロックファイルのマッピング定義

デフォルトマッピングの設定に関わらず、ロックマネージャパーティションが定義され、 シェアードメモリにテーブルのロックを持たせる場合は、 以下のプロンプトで"yes" と応える必要があります。

   シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes

   ロックマネージャパーティション名は?Lock1

この設定をした場合のマッピングパラメータファイルは以下のようになります。

   MSPARAMLOCK
       MSPARTLOCKNAME=Lock1
   MSPARAMLOCKEND

デフォルトマッピングが使用され、ロックを処理するためにシェアードメモリを 使用しない場合は、パラメータファイルに空のロックセクションを指定する 必要があります。以下はその例になります。

   MSPARTGBUFNAME=Global1

   MSPARAMLOCK
   MSPARAMLOCKEND

8.6 シェアードメモリのマッピング - empadm

Empressは、シェアードメモリを管理するためにデータベース管理者を助ける empadmユーティリティを提供します。 このユーティリティは以下の目的のために使用されます。

このユーティリティはさらに以下の目的で使用されます。

8.6.1 データベースの無効化

データベースへのユーザーアクセスを一時的に無効化するためののコマンドは以下のとおりです。

   empadm database singlemode

このコマンドは、データベース管理者(DBA)のみが発行できます。 これによって、データベースロックが掛けられ、DBA以外の人は データベースにアクセスできなくなります。 ロックが掛けられた後にEmpress変数MSSHELLに指定された 別のシェルプロセスが起動されます。 このシェルの間で、データベース管理者はデータベースおよびシェアードメモリの コンフィグレーションの必要な作業をすべて実行する必要があります。 また、バックアップやテーブルの alter などのようなデータベースが抑止されていることが 必要な作業も実行可能となります。

データベースは、単順にsinglemodeシェルプロセスから ログアウトすることによって、データベースロックは解除され、再び利用可能になります。

sys_dictionaryのロックを変更する場合は、singlemodeを 起動しないでください。. これは、singlemode によって、sys_dictionaryにロックが掛けられ、 データベースが無効化されているためです。 sys_dictionaryのロックの関連付けを変更した場合や、 データベースのすべてのロックをクリアした場合、 singlemodeから戻ったときにデータベースロックを正しく解放することができません。

sys_dictionaryのロックのクリア、またはそのロックの関連付けの変更が必要な場合は、 singlemode以外で実行しなくてはなりません。 そのため、データベース管理者はこの作業を行っている間は、 他のユーザーが同じデータベースをアクセスしていないことを 手動で確認する必要があります。

8.6.2 シェアードメモリの作成

tabzeroファイルから シェアードメモリパーティションを作成するためのコマンドは以下のとおりです。

   empadm database shmcreate

データベース管理者のみがこのコマンドを実行できます。

シェアードメモリパーティションの定義は、empshm partitionsユーティリティを使用して 作成します。これによって、データベースのtabzeroファイルに追加する パーティションファイルが作成されます。 パーティション情報は、それぞれのシェアードメモリパーティションの 名前、タイプ(グローバルバッファ、ロックマネージャ、マップファイル)、 サイズ、他のパーティションの特徴などの詳細を指定します。 1つのtabzeroファイルに複数のパーティションを指定しても構いません。

シェアードメモリパーティションの開始アドレスは、パーティションファイル内で指示され、 アドレスの範囲(例えば 8000000 - 18000000)もこのファイルで指定されます。 どの場合においても、システムは正確な指定のアドレス、またはアドレスの範囲の 最も高いアドレスにアタッチを行いますが、アタッチができない場合、 システムは、自動的に1メガバイトづつアドレスを減らしていき、 アタッチが成功するか、空きメモリエリアの範囲がなく、失敗するまでアドレスを 下げつづける動作を行います。

シェアードメモリセグメントに関するパーミションは、すべてのユーザーの読み込み および書き込みを許可するように設定されていますが、今後のバージョンでは変更される 可能性があります。

コマンドによって、指定どおりのシェアードメモリパーティションは作成されますが、 この時点ではまだどのデータベースともマップされていません。 これは、"empadm database params"オプションによって実行されます。

この場合、各データベースはシェアードメモリ内に設定する固有のパーティションを 持つ必要があります。従ってこのコマンドは、固有のパーティション情報によって、 各データベース上でそれぞれ実行しなければなりません。

このコマンドは、システムクラッシュの後、シェアードメモリが消えてしまった場合に 再度、実行する必要があります。

シェアードメモリパーティションが、期待どおりに作成されたかどうかをチェックするためには、 ユーザーは"empadm database shminfo"を実行するか、 シェアードメモリセグメントのリストを表示する標準のUNIXコマンド"ipcs -m -a"を 使用します。

8.6.3 シェアードメモリへのデータベースとロックのマップ

データベースファイルおよびロックを指定したシェアードメモリパーティションにマップするための コマンド構文は以下になります。

   empadm database params param_file table {table}

このコマンドを実行するためには、ユーザーはsys_dictionaryおよび sys_tablesに対して update 権限を持っている必要があります。 また、データベース管理者でなければなりません。

このコマンドは、特定のファイル(例えばメインインデックスファイルなど)または すべてのファイル(メインデータファイル、オーバーフローファイル、インデックスファイル) およびロックを指定されたシェアードメモリパーティションに関連付けます。 これは、シェアードメモリにファイルやロックをマップしようとする各テーブルごとに 実行する必要があります。 パラメータファイルは、empshm paramsユーティリティによって作成されます。

以下のSQLコマンドを使用してマップの確認ができます。

   DISPLAY TABLE table_name ALL;

パラメータは、各テーブルのデータ辞書内に格納されます。 異なったパラメータファイルでempadmコマンドを再実行することによって 簡単に変更できます。 シェアードメモリへのマップは、スペースと改行のみのパラメータファイルを 使用することによって削除することができます。

sys_dictionaryが、シェアードメモリにマップされている場合、 そのパラメータファイルの内容はtabzeroファイル内に 以下の区切りで囲まれたところに置かなくてはなりません。

   MSDBDICTPARAMS
        :
        : (sys_dictionaryのためのパラメータファイルの全部の内容をここにコピーします。)
        :
   MSDBDICTPARAMSEND

これが必要になる理由として、sys_dictionaryテーブルは、 データベース内のすべてのユーザーテーブルについての情報を持つため、 Empressは、データベース内の他のテーブルより先に sys_dictionaryをアクセスします。 sys_dictionary自体は、データベーステーブルで すべてのロック、インデック、およびこのテーブルに適応されるシェアードメモリの情報を 持ちます。 また、tabzeroは、 sys_dictionaryについての情報を含む ASCII テキストファイルで、 Empressがインデックスファイル、シェアードメモリなどをアクセスするために sys_dictionaryテーブルをアクセスする前に読み込みます。

sys_dictionary のロック以外のすべてのテーブルのマップは 一時的にデータベースを無効化するdbamode内で行う必要があることに注意してください。

8.6.4 データベースのロック情報とシェアードメモリ情報

以下のコマンド構文は、データベースのロック情報とシェアードメモリ情報を表示します。

empadm database |lockbrief
|lockmangers
|lockactive
|lockinfo
|shminfo
|shmstats
|
|
|
|
|
|

これらのコマンドは、現在、使用中のデータベースで実行するができます。

lockinfoオプションは、シェアードメモリまたはファイルにかかわらず、 データベース内の現時点で保持されているすべてのロックの完全なリストを生成します。 それぞれのロックに対しての テーブル名、ロックタイプ、レコード番号、ステータス(read, update, etc.)、 プロセスのEmpress IDを出力します。 また、ユーザー名、プロセスID とホストID と一緒に ロックを保持しているすべてのユーザーのサマリーも出力します。

他のロック情報を出力するオプションは、lockinfoの出力より、短いレポートを 出力します。 lockactiveオプションは、すべてのアクティブロックのみのリストを出力します。 lockbrief オプションは、すべてのアクティブロックと加えてアクティブプロセス情報を出力します。 lockmanagersオプションは、すべてのロックマネージャ情報のリストと加えて すべてのアクティブロックを出力します。

shminfoオプションは、パーティションの設定パラメータについての詳細を提供します。 パーティションの名前とタイプ、ロケーション情報が示されます。 グローバルバッファの場合、読み込みヒット率(ディスクを必要なしに シェアードメモリ内だけの読み込みのパーセンテージ)、 読み込み率(書き込み、読み込みのパーセンテージ)と一緒にサイズが表示されます。 マップファイルの場合は、読み込みヒット率、読み込み率と一緒にサイズと開始アドレスが 示されます。 ロックマネージャは、サイズの詳細が提供されます。

shmstatsオプションは、コンフィグレーションの詳細と 収集した統計情報を表示します。 グローバルバッファの場合、DIN(disk in to shared memory) DOUT (shared memory out to disk)、 PIN (process in to shared memory) 、 POUT (shared memory out to process)の数値が表示されます。 マップファイルの場合は、シェアードメモリから読み込み、シェアードメモリへの書き込み、 およびディスクへの書き込みの統計情報が提供されます。

shmstatsオプションは、またロックパーティションに対応するプロセス数を 含むロック情報を提供します。この情報は、プロセスの最大数、現在のロック数、 ロックの最大数、ロックマネージャが使用するハッシュアルゴリズムの効果の指標です。 バケットごとのヒット数が集計され、ヒット数を基本に分類されます。 それぞれのヒット数ごとに同じヒット数が持つハッシュバケットの数と バケット番号が表示されます。 また、60%以上のヒットパーセンテージを持つバケット番号が表示されます。 これは、ハッシュ機能によって平等に分配されているかどうかを指摘します。 各ハッシュバケットの最大のチェーン長が集計され、チェーンの長さで分類されます。

8.6.5 ロックのクリア

ロックをクリアするためのコマンド構文は以下になります。

   empadm database lockclear [empress_id {empress_id}]

このコマンドは、ユーザーがsys_dictionaryへの read 権限を 持っていることが必要です。 唯一、データベース管理者が、Empress ID なしにこのコマンドを起動できます。 コマンドの引数としてEmpressID のリストが与えられた場合、ユーザーは データベース管理者であるか、あるいはそのIDでアタッチしたプロセスの所有者でなければなりません。

lockclearオプションは、ロックがシェアードメモリ内のロックマネージャ パーティションに格納されているか、あるいはディスク上にあるか関係なくロックの クリアします。 コマンドの引数としてEmpressID のリストが与えられている場合は、 そのプロセスに関連したロックのみをクリアしますが、 Empress ID のリストが与えられない場合は、そのデータベースのシェアードメモリ内、 およびディスク上のすべてのロックがクリアされます。

Empress ID は、lockinfoオプションによって得ることができます。

Empress 変数MSSHMPROTECTIONを設定しても "empadm database lockclear"またはempclrlkコマンドを 実行することによってパーティション内のロックはクリアされることに注意してください。 これは、この変数が設定されたパーティションが empadmのオプションのshmremoveshmclearによって クリアされることを防ぐことができるのとは対照的です。

また、dbamodeの間はデータベースロックが必要であり、 empadm database lockclearおよびempclrlkコマンドを dbamodeの間で使用すべきではありません。

8.6.6 シェアードメモリのクリア

シェアードメモリをクリアするコマンド構文は以下になります。

   empadm database shmclear

このコマンドの実行は、 ユーザーは、sys_dictionaryへの read アクセス権を持つ必要があり、 データベース管理者でなければなりません。

shmclearオプションは、すべてのシェアードメモリパーティションをクリアします。 このコマンドは、empadm database shmcreateで説明された empadm database shmremoveと似ています。 shmclearオプションは、プログラムがメモリを破壊した場合に使用されます。

MSSHMPROTECTION変数は、shmclearオプションからシェアードメモリパーティションを 保護することができます。 この変数が設定されている場合、shmremoveおよびshmclearはどちらも そのパーティションにアタッチすることはできません。 この変数は、sys_dictionaryに関係するパーティションを保護するために 設定する必要があります。 この変数が設定されている場合、 そのパーティションを削除するためshmrmallオプションを 使用する必要があります。

8.6.7 シェアードメモリの統計情報とロック情報収集のリセット

シェアードメモリの統計情報とロック情報収集のリセットのコマンド構文は以下になります。

empadm database |lockrststats
|shmrststats
|
|

このコマンドの実行は、 ユーザーは、sys_dictionaryへの read アクセス権を持つ必要があり、 データベース管理者でなければなりません。

lockrststatsオプションは、ロックに関する収集されたすべての情報をクリアします。 (収集されたロック統計情報はshmstats オプションを使用して参照できます。) 統計情報はリセットの後、再び収集が開始されます。

shmrststatsオプションは、マップファイルおよびグローバルバッファの 収集された情報をクリアします。 このオプションは、それ自身のシェアードメモリパーティションを再初期化を行なわず、 統計情報と関連付けをおこなうだけになります。 実行後しばらく後に、empadmshmstatsオプションを 実行することで新しい統計情報を参照できます。

8.6.8 シェアードメモリの削除

シェアードメモリパーティションの削除のためのコマンド構文は以下になります。

empadm database |shmremove
|shmrmall
|shmzap
|
|
|

データベース管理者だけがこれらのコマンドを実行することができます。

シェアードメモリセグメントはファイルと同様なパーミションが付けられて作成されているため、 ユーザーはそれを削除するためにシェアードメモリセグメントの書き込み許可を持つ必要が あります。

一度、コマンドを実行することでシェアードメモリセグメントは、完全に削除され、 ユニークなパーティションID とそのアドレスのスペースは再利用できるようになります。

データベースを再び利用する前にtabzeroファイルのパーティション情報を 完全に削除しなくてはなりません。 そうしない場合は、Empressはデータベースに関連付けられたシェアードメモリ の使用を試みようとします。

Empress変数MSSHMPROTECTIONは、重要なシェアードメモリパーティションを 不注意で削除してしまうことを防ぐためにtabzeroファイル内で提供されています。 この変数に何かの値が設定されている場合、shmremove オプションは、シェアードメモリ パーティションを削除しません。 値が設定されない場合は、shmremoveはパーティションを削除します。 sys_dictionaryテーブルをシェアードメモリにマップするパーティションが ある場合はこの変数に値を設定することを推奨します。

shmrmallオプションはMSSHMPROTECTIONにかかわらず、 すべてのパーティションを削除するために使用されます。 データベース管理者が、shmrmallコマンドを発行する場合は dbamodeで行うべきではありません。 .

shmzapオプションは、たとえMSSHMPROTECTIONが設定されている場合でも、 すべてのシェアードメモリセグメントを削除します。 これは、tabzeroファイル内のパーティション情報(すべてのシェアードメモリ定義)を 含みます。



8.7 データベースへのシェアードメモリのデフォルトマッピング

新しく作成されたデータベースをシェアードメモリにマップするためのオプションは、 empmkdb によって提供されます。 すべてのロックをシェアードメモリのロックパーティションへマップに切り替え、 コーディネータをシェアードメモリのマップファイルにマップし、 すべてのテーブルをシェアードメモリのグローバルバッファにマップするための tabzeroファイルへのシェアードメモリパーティションの情報を追加します。 使用方法は以下のとおりです。

   empmkdb -shmem shm_key database_name

シェアードメモリキーshm_keyは、提供される必要があります。 これはシェアードメモリブロックのユニークな識別子で正の整数です。 シェアードメモリへマップされた各データベースは、ユニークなシェアードメモリキーを 持つ必要があります。

新しく作成されたデータベースにデフォルトでマップされたパーティションの定義は、 $EMPRESSPATH/rdbms/custom/shmzeroファイルで行われ、 使用されるロックマネージャ、マップファイル、グローバルバッファパーティションの 定義がされています。

デフォルトのシェアードメモリのマッピングが不要である場合、 ユーザーは$EMPRESSPATH/rdbms/custom/shmzeroを編集するか、 マッピングファイルを変更するための Empress変数MSSHMZEROを設定することができます。

デフォルトのシェアードメモリマッピングは、 サポート可能である最大同時ロック数(2000)とデータベースファイルの 最大数(500)に関係する上限が含まれていることに注意してください。 これらのどちらかが制限を超えるような場合はデータベースはエラーメッセージを 出力します。この場合、パーティションを削除し、 シェアードメモリのエリアを広げてマップする必要があります。

既にデータベースが存在する場合は、そのデータベースに対して empmkdbでシェアードメモリを追加することはできません。 また、emprmdbコマンドは、データベースが削除されたときに自動的に シェアードメモリパーティションを削除します。