シェアードメモリ機能は、システムのシェアードメモリを利用を通じて、 Empress RDBMSのパフォーマンスを向上するための機能を提供します。
通常、各プロセスは、自身のメモリ空間を持ち、他のプロセスのメモリ空間を アクセスすることができませんが、シェアードメモリは、複数のプロセスで 共有する特別なメモリセクションでオペレーティングシステムの構成要素です。 シェアードメモリを利用することで、ファイルI/O を減らし、 データベースのパフォーマンスを向上することができます。
Empressは、パフォーマンス向上のために ロックマネージャ、 グローバルバッファ、 マップファイルの シェアードメモリを使用した3つ方法を提供します。
図 8-1: Empress シェアードメモリ
データベースへのアクセスが行われた場合にその情報が正しいことを保証するために Empressではロックが使用されます。 ロックによって、2人のユーザー(またはプロセス)が同時に同じデータを修正することを 防ぐことができます。また、データが修正されている間に読み込まれることも防ぎます。
通常、ロック情報はファイルに格納され、データベースの操作の間、頻繁にアクセスされます。 システムメモリへのアクセスは、ディスクI/Oよりかなり速いため、 データベースのパフォーマンスを向上する意味でシェアードメモリに このロック情報を置く事で改善することができます。
ロックマネージャは、シェアードメモリ内に各プロセスがアクセス可能な ロック情報を正確に置くことを行います。 Empressは、ロックマネージャのタイプ(シェアードメモリまたはファイル) がテーブル単位で定義することできるため、あるテーブルはシェアードメモリを 使用し、またあるテーブルはロックファイルを使用する定義が可能です。
プロセスがファイルからデータを取得しようとするたびにそのファイルを 読む必要がありますが、Empressではグローバルバッファ によって、1つのファイルの1部分か全部、また、多くのファイルを シェアードメモリ内に保存することができます。 これによりアクセス速度が短縮され、性能が向上します。
グローバルバッファは、メモリブロックに分割されます。 グローバルバッファへのファイルの関連付けにより ブロックの一部、あるいはすべてのファイルの一部が動的に割り当てられます。 指定されたグローバルバッファの関連付けられたファイルのデータが バッファに格納可能なデータ量より多い場合、 バッファブロックの一部は必要に応じて新しいデータに上書きされます。 この上書きは、least-recently-used (lru)アルゴリズムによって管理されます。 lru アルゴリズムは、最近、最も使われていないバッファブロックを 上書きの対象ブロックであることを決定します。
グローバルバッファを持つファイルにデータが書き込まれた場合、 データはグローバルバッファとファイルに同時に書き込まれます。 このことから、グローバルバッファは、write-through バッファと呼ばれます。 また、グローバルバッファ内のデータは常にファイル内のデータを確実に 反映することも意味しています。
マップファイル は、ファイルのデータをシェアードメモリに格納する点では グローバルバッファと同じですが、シェアードメモリにマップするファイルの関係おいては、 マップできるファイルは1つのファイルだけになります。 また、マップファイルはブロックに分割されません。 その代わりにファイルの指定セクションと直接、関連付けられる1つの大きなメモリブロックに なっています。 そのことから、マップファイルは実質的には指定ファイルへのウィンドウと考えることができます。 このウィンドウはファイル全体、あるいはファイルの最初から始まるファイルの一部、 またはユーザーが示す位置で開始、終了するセクションになります。
マップファイルは、関係付けられたファイルと常に1対1の関係を持つことが必要です。 同じマップファイルに複数のファイルを関連付けようとしてもファイルへのアクセス時に エラーが起こります。
シェアードメモリは、他の多くのリソースと同様にシステム上の貴重なリソースです。 通常、データベースの性能を最適化するためにシェアードメモリに大容量のメモリを 割り当て、さらにCPUとすべてのプロセスがそれぞれのタスクを実行できるように 十分なメモリを残すためには考慮すべき点があります。 データベースでシェアードメモリを使用するための一般的なガイドラインと助言を 以下に示します。
シェアードメモリ上にロック情報を置くことで大きな性能向上が得られます。 これはレコードレベルロックまたはグループレベルロックが設定され、 テーブルに頻繁にアクセスされている場合には特に顕著に示されます。 注意としてアクセス頻度が低いテーブルへのロックはメモリの消費を抑えるため、 ディスク上で行うのがよいかもしれません。
読み込みだけ、または読み込みがほとんどのファイルはシェアードメモリを利用する最適な テーブルになります。 更新がシェアードメモリに対応するファイルに行われる場合は、 インメモリイメージもオンディスクイメージと共に更新されることが必要になります。 これはライトスルーメモリと呼ばれます。 ディスクへのアクセスは、常にファイルへの更新が要求されるため、更新のシェアードメモリを 用いて作成する利点はなく、シェアードメモリとディスク更新のオーバーヘッドによって引き起こされる 損失ばかりが存在します。
従って、最も適応するものは頻繁に読み込まれるファイル、または大きく変更されない ファイルになります。参照チェック用のテーブル、あるいは参照のみに使用されるテーブルが メモリ内配置の考慮の対象となります。
読み込み率 50%が、シェアードメモリ内へのファイル配置のおおよそのガイドラインになります。 empadm database shminfoからの出力リストは、マップファイルおよびグローバル バッファに対する読み込み率を表示します。
マップファイルに対して選択されたブロックサイズは、システムのEmpressブロック サイズより小さくすべきではありません。(通常は1024バイト) これは、例えばそのブロックの一部がシェアードメモリ内にある場合、 Empressが取得する必要があるデータブロックより、 メモリ内ブロックが小さい場合、毎回、ディスクへのアクセスが Empressに強制されるためです。
インデックスが大量に使用される場合、そのインデックスが小さいとき(継続的に更新されない時)は、 マップファイル内に配置され、大きいときはグローバルファイル内に配置されます。 グローバルバッファへマップされた場合は、インデックスセクションは常時にシェアードメモリ内に 存在するわけではありませんが、場合により有効になります。 ほとんどのユーザーがインデックスの一部分を必要とする場合、 例えば、以前の日付と最近の日付などの検索では読み込みヒット率は特に向上します。
これはファイルにも適用されます。大きなファイルの読み込みヒット率は、 ファイルの特定部分が一度に使用される場合に向上します。 例えば、テーブルの終わりへの最新の追加などです。
Empressのsys_dictionaryテーブルは、 すべてのテーブルがアクセスされるたびにアクセスされるため、 そのsys_dictionaryのすべてのファイル (メインテーブル、インデックスおよびオーバーフローファイル) をグローバルバッファ内に配置することはパフォーマンスの向上になります。 他のEmpressのシステムテーブルは通常、シェアードメモリ内には置きません。
オーバーフローファイル上でのシェアードメモリの使用は、レコード長が大きく変化するため、 予測が難しいところがあります。 グローバルバッファが特に大きくないのであれば、読み込みヒット率は非常に低くなります。
インデックスオーバーフローファイルは、そのプライマリインデックスファイルが シェアードメモリ内に存在しない場合は、配置しないでください。 これは、プライマリファイルへのアクセスが、 オーバーファイルセグメントを見つけるためで、 常に最初に必要とされているためです。 プライマリファイル内で0バイトで構成されるインデックスファイルについてもこのことは 当てはまります。
グローバルバッファのパラメータMSPARTGBUFMAXFILESは、 そのグローバルバッファ内部で要求されるすべてのファイルを処理するために 十分な大きさを常に指定する必要があります。 グローバルバッファ内で参照しているファイルが あまりにも多すぎる場合、システムエラーになります。 デフォルトセクションが、パラメータファイル内に含まれている場合は 特にこの点には注意する必要があります。 デフォルトセクションが設定されている場合、テーブルと関連付けられているすべてのファイルは グローバルバッファを通してアクセスされます。 データベース管理者は、ファイルの最大数を計算し、変数を設定しなければなりません。
ネットワーク環境内では、データベースの存在するマシン上にシェアードメモリの 設定をする必要があります。
empadm database shminfoの出力リストからの統計情報によって、 シェアードメモリのチューニング情報が提供されます。
マップファイル内部においての論理書き込みに対する論理読み込みの割合は、 ファイルで発生する書き込みに対する読み込みの割合と同じと言えます。 読み込みの割合が高い場合、このファイルはシェアードメモリに適した候補と言えます。 読み込み率は、グローバルバッファとマップファイルの両方について計算されます。
読み込みヒット率は、ディスクからではなく、マップファイルまたはグローバルバッファから 発生する読み込みの割合で決定されます。 この数字が低い場合はグローバルバッファまたはマップファイルのサイズを大きくするか、 あるいはマップファイルへの開始オフセットを変更するか、またこのファイルからの シェアードメモリを削除する必要があります。
このセクションは、定義、作成、コンフィグレーションおよび シェアードメモリパーティションへのデータベーステーブルの関連付けを おこなうためのクイックリファレンスです。 デフォルトのシェアードメモリパーティションを使用し、 新規に作成したデータベースにシェアードメモリをマップするための empmkdbのオプションも提供されます。 詳しくは データベースのデフォルトシェアードメモリのマップ のセクションを参照してください。
シェアードメモリをセットアップするためのステップ
empshm partitions partition_file
このユーティリティは情報を設定するために対話形式で行います。 結果として、シェアードメモリパーティション情報(ASCII テキスト)を 格納したファイルが作成されます。 このパーティションファイルはテンポラリファイルで、その内容を システムエディタを使用して、tabzeroの終わりに 手動で追加します。(ステップ 6) このシェアードメモリパーティション情報は、tabzeroに記述する必要があります。
詳細な情報および例は シェアードメモリパーティションの定義 のセクションを参照してください。
シェアードメモリにインデックス情報を配置する場合、 必ずすべてのインデックスに名前付けしなくてはなりません。 名前付けされていない場合、SQLの DROP INDEXおよび CREATE INDEXコマンドを使用して、インデックスの 削除と再作成をする必要があります。
詳しくは Empress SQL: リファレンスマニュアルの データ定義コマンド を参照してください。
特別なシェアードメモリパーティションへのファイル、インデックスおよび各テーブルのロック情報を マップするためのパラメータファイルを作成します。 オペレーションシステムのプロンプト上で以下のコマンドを実行します。
empshm params param_file
詳細はこの章の シェアードメモリへのマッピングパラメータの定義 を参照してください。
対象となるデータベース上で他のユーザー(プロセス)が作業していないことを 確認するためにオペレーションシステムのプロンプト上で以下のコマンドを実行します。
empadm database_name coordinfo
データベース上に作業中のユーザーが存在しないのであれば、 以下のコマンドで未解決のロックをすべてクリアします。
empclrlk database_name
empclrlk ユーティリティの詳細は、このマニュアルの マニュアルページ を参照してください。
ここまででデータベースのシェアードメモリパーティションを作成するための 準備が整いましたが、他のユーザーがそのデータベースにアクセスできないように しなくてはなりません。これは以下のコマンドを実行します。
empadm database_name dbamode
このコマンドは、データベースをシングルユーザーモードでアクセスするための データベース管理者(DBA)にだけ許可されたコマンドです。 empadmユーティリティの詳細は、このマニュアルの マニュアルページ を参照してください。
empclrlkは、 dbamodeのロックを含むすべてのロックをクリアするため ステップ4、ステップ5に戻ることができないことに注意してください。
システムのエディタを使用してtabzeroファイルの終わりに パーティションファイルの内容を追加します。 異なったシェアードメモリセグメントを記述されているいくつかのパーティションファイルを 1つのtabzeroファイルへ追加しても構いません。
以下のコマンドによりシェアードメモリパーティションを作成します。
empadm database_name shmcreate
シェアードメモリパーティションが正しく作成されたかどうかを以下のコマンドで確認します。
empadm database_name shminfo
また、UNIXコマンドを使用する場合は次のコマンドになります。
ipcs -m
メモリ内に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内のコメントアウトは残す 必要があることに注意してください。
適用するテーブルへパラメータファイルをマップするコマンドは以下になります。
empadm database_name params param_file table {table}
以下のSQLコマンドを使用して、データベース内へ関連付けが正しく行われたかどうかを確認します。
DISPLAY table ALL;
このコマンドは、テーブルに関連付けられたシェアードメモリ情報を表示します。
dbamodeからログアウトし、データベースを使用可能にします。
sys_dictionaryロックをシェアードメモリ内で処理する必要がある場合は、 ステップ9 でコメントアウトされた行のコメントをはずします。
ロックを含むシェアードメモリへのsys_dictionaryの新しいマッピングは 以下のように実行することができます。
empadm database params param_file sys_dictionary
sys_dictionaryロックをマッピングする場合は、dbamodeを起動しないでください。 これはdbamodeによって、sys_dictionaryによってロックが掛けられ、 データベースが抑制されるためです。 dbamodeの間にこのロックの関連付けが修正された場合、 データベースのアンロックは正しく実行することができません。
シェアードメモリのセットアップのプロセスは完了し、 データベースは使用可能になります。
オペレーティングシステムのプロンプト上から以下のコマンドを発行することで シェアードメモリのステータスをチェックすることができます。
empadm database_name | |shminfo |shmstats |
| | |
問題が起こった場合、以下のコマンドを使用して シェアードメモリパーティションをクリアし、 初期値にリセットすることができます。
empadm database_name shmclear
シェアードメモリパーティションを削除します。 このコマンドはデータベースにアクセスがないことを確かめ実行します。
empadm database_name shmremove
このコマンドはtabzeroファイル内のシェアードメモリ定義が変更された場合、 またtabzeroファイルが修正される前に実行しなくてはなりません。
シェアードメモリはパーティションに分割され、 パーティションには、ロックマネージャ、グローバルバッファ、マップファイルの 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 ロックマネージャパーティション | 最大ロック数 | ロックマネージャ定義の終了タグ | . . (定義なしか繰り返し) . パーティション名 | パーティション グローバルバッファパーティション | 定義 最大ファイル数 | ブロックサイズ | 最大ブロック数 | グローバルバッファ定義の終了タグ | . . (定義なしか繰り返し) . パーティション名 | マップファイルパーティション | オフセット | サイズ | マップファイル定義の終了タグ -----------^ シェアードメモリ定義の終了タグ
以下にこのファイルの内容について説明します。
パーティションファイルの最初のエントリはシェアードメモリーキーになります。 このキーは、指定のシェアードメモリブロックの識別にシステムが使用する ユーザー定義の番号です。 この番号は任意ですが、それぞれのサイトにキーを割り当てるためのプロシージャが必要になります。 同一のシェアードメモリブロックの使用を希望するすべてのデータベースは、識別用に同一のキーを 使用する必要があります。
MSSHMKEY=123456
次にEmpress変数MSSHMPROTECTIONが指定されます。 このパーティションがsys_dictionaryによって利用される場合は、 シェアードメモリパーティションを特別に保護するため、この変数は "on"に設定する必要があります。 sys_dictionaryによって使用されない場合は、この変数はセットされません。 設定は以下のように行います。
MSSHMPROTECTION=on
パーティションの定義は、複数のパーティションをどのような順番でも 定義できます。 すべてのパーティションの定義は、最初の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
各パーティションタイプは一意のパラメータを定義する必要があります。
ロックマネージャのパラメータは、ロック数を指定します。
ロックマネージャが操作可能なロックの最大数で、 この値以上にロックしようとするとエラーメッセージを出力し、 プロセスは停止します。 この数を決めるにあたり経験則を上げると、この数はデータベースユーザー数に 比例し、データベース内頻繁に使用されるレコード総数に比例します。 設定例は以下のとおりです。
MSPARTLOCKNLOCKS=500
グローバルバッファの固有なパラメータとして、最大ファイル数、ブロックサイズおよびブロック数があります。
ファイルの最大数は、グローバルバッファを使用するアクセス可能なファイルの数の上限になります。 例では、Global1とGlobal2のエントリは以下のように設定されます。
MSPARTGBUFMAXFILES=15
ブロックサイズはグローバルバッファ内の個々のバッファサイズを決定します。 最適な入出力を行うためのブロックサイズは、ファイルシステムのブロックサイズの 倍数にすべきで 512 バイトの倍数が適当です。 例では、Global1とGlobal2のエントリは以下のように設定されます。
MSPARTGBUFBLOCKSIZE=1024
ブロック数はグローバルバッファ内のブロック数になります。 これは、グローバルバッファ内で頻繁に使用されるデータを保存するために 選択しなければなりません。 このパラメータはチューニングを必要とする場合があり、 シェアードメモリ管理プログラムempadmは、 チューニングを手助けする統計情報を提供します。 例では、Global1とGlobal2のエントリは以下のように設定されます。
MSPARTGBUFNBLOCKS=20
マップファイルパーティションは、スタートオフセットとサイズの 2 つの固有のパラメータを持ちます。 スタートオフセットは、マップされるファイルの開始からのオフセットです。 (つまりファイルウィンドウの開始) 例では、Mapped1 と Mapped2のエントリは以下のように設定されます。
MSPARTMAPFSTART=0
サイズは最も頻繁に使用されるデータを保存するため、 また、ファイルが小さい場合はファイル全体を保存するために 指定する必要があります。 例では、Mapped1 と Mapped2のエントリは以下のように設定されます。
MSPARTMAPFSIZE=1024
各パーティションの終了は、以下の行で指示されます。
MSPARTEND
シェアードメモリ定義の終了は以下の行で指示されます。
MSSHMEND
シェアードメモリが定義され、セグメントが作成された後、 データベースのファイルおよびロックをシェアードメモリパーティションに関連付ける 必要があります。 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つだけしか指定することはできません。
デフォルトとして1つのグローバルバッファ内にテーブルを関連付け、 メインデータファイル、インデックスファイルとオーバーフローファイルの すべてをマップすることができます。
このテーブルのすべてファイルはグローバルバッファを使いますか?(y/n) yes グローバルバッファパーティション名を入力してください。 Global1
ここまでの設定だけを行う場合は、以降はnoと入力します。 この場合のマッピングパラメータファイルの結果は以下になります。
MSPARTGBUFNAME=Global1 MSPARAMLOCK MSPARAMLOCKEND
この設定でロックファイルを除く、 テーブルと関連したすべてのファイルを シェアードメモリにマップすることになります。 ロックマネージャパーティションが定義され、 シェアードメモリ上にロックをマップさせたい場合は、 以下の質問の箇所でyesと入力します。
シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes ロックマネージャパーティション名は?Lock1
これによって、ロックを含むテーブルと関連したすべてのファイルを シェアードメモリ上にマップすることになります。 この場合のマッピングパラメータファイルは以下になります。
MSPARTGBUFNAME=Global1 MSPARAMLOCK MSPARTLOCKNAME=Lock1 MSPARAMLOCKEND
デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 メインデータファイル(可変長データテーブル 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に定義されます。
デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 可変長データテーブル 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に定義されます。
デフォルトマッピングを使用することを選択するか、あるいはしないかに関わらず、 インデックスファイルとシェアードメモリパーティション(グローバルバッファか マップファイルのどちらか)を明確に対応付けることができます。 この設定は、メインデータファイルのデフォルトの設定を上書きします。
インデックスのオーバーフローファイル(.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
デフォルトマッピングの設定に関わらず、ロックマネージャパーティションが定義され、 シェアードメモリにテーブルのロックを持たせる場合は、 以下のプロンプトで"yes" と応える必要があります。
シェアードメモリ内で定義されたロックマネージャパーティションがありますか?(y/n) yes ロックマネージャパーティション名は?Lock1
この設定をした場合のマッピングパラメータファイルは以下のようになります。
MSPARAMLOCK MSPARTLOCKNAME=Lock1 MSPARAMLOCKEND
デフォルトマッピングが使用され、ロックを処理するためにシェアードメモリを 使用しない場合は、パラメータファイルに空のロックセクションを指定する 必要があります。以下はその例になります。
MSPARTGBUFNAME=Global1 MSPARAMLOCK MSPARAMLOCKEND
Empressは、シェアードメモリを管理するためにデータベース管理者を助ける empadmユーティリティを提供します。 このユーティリティは以下の目的のために使用されます。
このユーティリティはさらに以下の目的で使用されます。
データベースへのユーザーアクセスを一時的に無効化するためののコマンドは以下のとおりです。
empadm database singlemode
このコマンドは、データベース管理者(DBA)のみが発行できます。 これによって、データベースロックが掛けられ、DBA以外の人は データベースにアクセスできなくなります。 ロックが掛けられた後にEmpress変数MSSHELLに指定された 別のシェルプロセスが起動されます。 このシェルの間で、データベース管理者はデータベースおよびシェアードメモリの コンフィグレーションの必要な作業をすべて実行する必要があります。 また、バックアップやテーブルの alter などのようなデータベースが抑止されていることが 必要な作業も実行可能となります。
データベースは、単順にsinglemodeシェルプロセスから ログアウトすることによって、データベースロックは解除され、再び利用可能になります。
sys_dictionaryのロックを変更する場合は、singlemodeを 起動しないでください。. これは、singlemode によって、sys_dictionaryにロックが掛けられ、 データベースが無効化されているためです。 sys_dictionaryのロックの関連付けを変更した場合や、 データベースのすべてのロックをクリアした場合、 singlemodeから戻ったときにデータベースロックを正しく解放することができません。
sys_dictionaryのロックのクリア、またはそのロックの関連付けの変更が必要な場合は、 singlemode以外で実行しなくてはなりません。 そのため、データベース管理者はこの作業を行っている間は、 他のユーザーが同じデータベースをアクセスしていないことを 手動で確認する必要があります。
tabzeroファイルから シェアードメモリパーティションを作成するためのコマンドは以下のとおりです。
empadm database shmcreate
データベース管理者のみがこのコマンドを実行できます。
シェアードメモリパーティションの定義は、empshm partitionsユーティリティを使用して 作成します。これによって、データベースのtabzeroファイルに追加する パーティションファイルが作成されます。 パーティション情報は、それぞれのシェアードメモリパーティションの 名前、タイプ(グローバルバッファ、ロックマネージャ、マップファイル)、 サイズ、他のパーティションの特徴などの詳細を指定します。 1つのtabzeroファイルに複数のパーティションを指定しても構いません。
シェアードメモリパーティションの開始アドレスは、パーティションファイル内で指示され、 アドレスの範囲(例えば 8000000 - 18000000)もこのファイルで指定されます。 どの場合においても、システムは正確な指定のアドレス、またはアドレスの範囲の 最も高いアドレスにアタッチを行いますが、アタッチができない場合、 システムは、自動的に1メガバイトづつアドレスを減らしていき、 アタッチが成功するか、空きメモリエリアの範囲がなく、失敗するまでアドレスを 下げつづける動作を行います。
シェアードメモリセグメントに関するパーミションは、すべてのユーザーの読み込み および書き込みを許可するように設定されていますが、今後のバージョンでは変更される 可能性があります。
コマンドによって、指定どおりのシェアードメモリパーティションは作成されますが、 この時点ではまだどのデータベースともマップされていません。 これは、"empadm database params"オプションによって実行されます。
この場合、各データベースはシェアードメモリ内に設定する固有のパーティションを 持つ必要があります。従ってこのコマンドは、固有のパーティション情報によって、 各データベース上でそれぞれ実行しなければなりません。
このコマンドは、システムクラッシュの後、シェアードメモリが消えてしまった場合に 再度、実行する必要があります。
シェアードメモリパーティションが、期待どおりに作成されたかどうかをチェックするためには、 ユーザーは"empadm database shminfo"を実行するか、 シェアードメモリセグメントのリストを表示する標準のUNIXコマンド"ipcs -m -a"を 使用します。
データベースファイルおよびロックを指定したシェアードメモリパーティションにマップするための コマンド構文は以下になります。
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内で行う必要があることに注意してください。
以下のコマンド構文は、データベースのロック情報とシェアードメモリ情報を表示します。
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%以上のヒットパーセンテージを持つバケット番号が表示されます。 これは、ハッシュ機能によって平等に分配されているかどうかを指摘します。 各ハッシュバケットの最大のチェーン長が集計され、チェーンの長さで分類されます。
ロックをクリアするためのコマンド構文は以下になります。
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の間で使用すべきではありません。
シェアードメモリをクリアするコマンド構文は以下になります。
empadm database shmclear
このコマンドの実行は、 ユーザーは、sys_dictionaryへの read アクセス権を持つ必要があり、 データベース管理者でなければなりません。
shmclearオプションは、すべてのシェアードメモリパーティションをクリアします。 このコマンドは、empadm database shmcreateで説明された empadm database shmremoveと似ています。 shmclearオプションは、プログラムがメモリを破壊した場合に使用されます。
MSSHMPROTECTION変数は、shmclearオプションからシェアードメモリパーティションを 保護することができます。 この変数が設定されている場合、shmremoveおよびshmclearはどちらも そのパーティションにアタッチすることはできません。 この変数は、sys_dictionaryに関係するパーティションを保護するために 設定する必要があります。 この変数が設定されている場合、 そのパーティションを削除するためshmrmallオプションを 使用する必要があります。
シェアードメモリの統計情報とロック情報収集のリセットのコマンド構文は以下になります。
empadm database | |lockrststats |shmrststats |
| | |
このコマンドの実行は、 ユーザーは、sys_dictionaryへの read アクセス権を持つ必要があり、 データベース管理者でなければなりません。
lockrststatsオプションは、ロックに関する収集されたすべての情報をクリアします。 (収集されたロック統計情報はshmstats オプションを使用して参照できます。) 統計情報はリセットの後、再び収集が開始されます。
shmrststatsオプションは、マップファイルおよびグローバルバッファの 収集された情報をクリアします。 このオプションは、それ自身のシェアードメモリパーティションを再初期化を行なわず、 統計情報と関連付けをおこなうだけになります。 実行後しばらく後に、empadmのshmstatsオプションを 実行することで新しい統計情報を参照できます。
シェアードメモリパーティションの削除のためのコマンド構文は以下になります。
empadm database | |shmremove |shmrmall |shmzap |
| | | |
データベース管理者だけがこれらのコマンドを実行することができます。
シェアードメモリセグメントはファイルと同様なパーミションが付けられて作成されているため、 ユーザーはそれを削除するためにシェアードメモリセグメントの書き込み許可を持つ必要が あります。
一度、コマンドを実行することでシェアードメモリセグメントは、完全に削除され、 ユニークなパーティションID とそのアドレスのスペースは再利用できるようになります。
データベースを再び利用する前にtabzeroファイルのパーティション情報を 完全に削除しなくてはなりません。 そうしない場合は、Empressはデータベースに関連付けられたシェアードメモリ の使用を試みようとします。
Empress変数MSSHMPROTECTIONは、重要なシェアードメモリパーティションを 不注意で削除してしまうことを防ぐためにtabzeroファイル内で提供されています。 この変数に何かの値が設定されている場合、shmremove オプションは、シェアードメモリ パーティションを削除しません。 値が設定されない場合は、shmremoveはパーティションを削除します。 sys_dictionaryテーブルをシェアードメモリにマップするパーティションが ある場合はこの変数に値を設定することを推奨します。
shmrmallオプションはMSSHMPROTECTIONにかかわらず、 すべてのパーティションを削除するために使用されます。 データベース管理者が、shmrmallコマンドを発行する場合は dbamodeで行うべきではありません。 .
shmzapオプションは、たとえMSSHMPROTECTIONが設定されている場合でも、 すべてのシェアードメモリセグメントを削除します。 これは、tabzeroファイル内のパーティション情報(すべてのシェアードメモリ定義)を 含みます。
新しく作成されたデータベースをシェアードメモリにマップするためのオプションは、 empmkdb によって提供されます。 すべてのロックをシェアードメモリのロックパーティションへマップに切り替え、 コーディネータをシェアードメモリのマップファイルにマップし、 すべてのテーブルをシェアードメモリのグローバルバッファにマップするための tabzeroファイルへのシェアードメモリパーティションの情報を追加します。 使用方法は以下のとおりです。
empmkdb -shmem shm_key database_name
シェアードメモリキーshm_keyは、提供される必要があります。 これはシェアードメモリブロックのユニークな識別子で正の整数です。 シェアードメモリへマップされた各データベースは、ユニークなシェアードメモリキーを 持つ必要があります。
新しく作成されたデータベースにデフォルトでマップされたパーティションの定義は、 $EMPRESSPATH/rdbms/custom/shmzeroファイルで行われ、 使用されるロックマネージャ、マップファイル、グローバルバッファパーティションの 定義がされています。
デフォルトのシェアードメモリのマッピングが不要である場合、 ユーザーは$EMPRESSPATH/rdbms/custom/shmzeroを編集するか、 マッピングファイルを変更するための Empress変数MSSHMZEROを設定することができます。
デフォルトのシェアードメモリマッピングは、 サポート可能である最大同時ロック数(2000)とデータベースファイルの 最大数(500)に関係する上限が含まれていることに注意してください。 これらのどちらかが制限を超えるような場合はデータベースはエラーメッセージを 出力します。この場合、パーティションを削除し、 シェアードメモリのエリアを広げてマップする必要があります。
既にデータベースが存在する場合は、そのデータベースに対して empmkdbでシェアードメモリを追加することはできません。 また、emprmdbコマンドは、データベースが削除されたときに自動的に シェアードメモリパーティションを削除します。