# CHAPTER 8: シェアードメモリ

## 8.1 はじめに

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

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

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

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

### 8.1.1 ロックマネージャ

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

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

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

### 8.1.2 グローバルバッファ

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

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

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

### 8.1.3 マップファイル

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

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

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

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

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

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

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

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

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

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

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

5. Empressの`sys_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: リファレンスマニュアルの データ定義コマンド を参照してください。

   - `DISPLAY TABLE` - インデックスが名前付けされているかどうかをチェック
   - `DROP INDEX` - インデックスが名前付けされていない場合は、インデックスの削除
   - `CREATE INDEX` - 名前付きでインデックスを再作成

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

          empshm params param_file

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

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

          empadm database_name coordinfo

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

          empclrlk database_name

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

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

          empadm database_name dbamode

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

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

6. システムのエディタを使用して`tabzero`ファイルの終わりに パーティションファイルの内容を追加します。 異なったシェアードメモリセグメントを記述されているいくつかのパーティションファイルを １つの`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`が、シェアードメモリにマップするテーブルの１つである場合は そのパラメータファイルを`tabzero`の末尾に追加する必要があります。 これは、`sys_dictionary`自体へアクセスするために必要です。 システムエディタを使用して、`tabzero`ファイルを更新します。 追加する情報は以下の順序で指定してください。

   - `MSDBDICTPARAMS`を挿入します。
   - `sys_dictionary`のパラメータファイルの内容を挿入します。
   - `MSDBDICTPARAMSEND`を挿入します。

   例

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

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

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

       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

       このグローバルバッファのブロックサイズ（５１２バイトの倍数）は？ 2

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

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

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

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

       パーティション名は？ Global2

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

       このグローバルバッファのブロックサイズ（５１２バイトの倍数）は？ 2

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

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

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

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

       パーティション名は？  Mapped1

       このマップファイルのサイズ（５１２バイトの倍数）は？2

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

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

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

       パーティション名は？ Mapped2

       このマップファイルのサイズ（５１２バイトの倍数）は？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`は、自動的にパーティションのサイズを計算します。 選択可能な３つのパーティションタイプは、ロックマネージャ、グローバルバッファ、 およびマップファイルで、それに対し`LOCK`, `GBUF`, `MAPF` を選択することができます。 パーティションタイプの設定例は、以下のようになります。

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

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

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

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

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

       MSPARTLOCKNLOCKS=500

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

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

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

       MSPARTGBUFMAXFILES=15

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

       MSPARTGBUFBLOCKSIZE=1024

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

       MSPARTGBUFNBLOCKS=20

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

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

       MSPARTMAPFSTART=0

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

       MSPARTMAPFSIZE=1024

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

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

       MSPARTEND

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

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

       MSSHMEND

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

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

データベース内の異なるテーブルについて、同一のマッピングパラメータファイルを 使用することは可能ですが、マップファイルと実際のデータベースファイルは 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 つのセクションが含まれている必要があります。 また、メインデータ、可変長データオーバーフローとインデックスセクションは 複数指定することができますが、 デフォルトセクションとロックセクションの指定はパラメータファイル内に １つだけしか指定することはできません。

### 8.5.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`ユーティリティを提供します。 このユーティリティは以下の目的のために使用されます。

- シェアードメモリパーティションの作成
- データベースファイルのマッピングとシェアードメモリへのロック
- シェアードメモリの削除
- プロセスIDによる選択または全体でのシェアードメモリ内容のクリーニング
- シェアードメモリのパフォーマンスのモニタリング
- シェアードメモリ使用の統計情報の収集

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

- データベースへの他のユーザーからのアクセスを無効化
- ロックのクリア

### 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`のオプションの`shmremove`と`shmclear`によって クリアされることを防ぐことができるのとは対照的です。

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

### 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`コマンドは、データベースが削除されたときに自動的に シェアードメモリパーティションを削除します。