新卒から文系エンジニア→人材業界に転職した人のブログ

新卒から文系エンジニア→人材業界に転職。技術・スキルがないためブログを通して勉強。その後、IT業界の業界知識が活かせる人材業界へ。異業種×異職種の転職経験有り。

このエントリーをはてなブックマークに追加

【DBMS入門】DBMSに存在するプロセスやメモリ(SGA)の領域について~oracleのDBMSを参考に~

【今回の内容】

前回まででDBMSの中身でのどのようなことが行われているのかを簡単に記載しました。


過去記事「DBMSが目指している姿」


今回は特にDBMSを限定し、oracleに焦点を当ててみていきたいと思います。



記載内容としては、

 ・クライアントプロセスについて

 ・メモリ(SGA)に存在する領域の分類について

 ・メモリ(SGA)で動いているプロセスについて

 ・DB側に存在するデータにいて



■クライアントプロセス

 ①SQL*PLUS(開発者・管理者)

 ②Webアプリ利用者(ユーザ)

■メモリ(SGA)に存在する領域の分類

 ①共有プール
  ・SQL処理に役立つ情報を保持している領域

  具体的には

    ・どのデータがどこにどれだけあるかなどの統計情報(ディクショナリキャッシュ)

    ・実行計画などの情報(ライブラリキャッシュ)


 ②バッファキャッシュ
  ・参照頻度の高いデータを保持している領域

  ・LRU(最後に参照されたものから)アルゴリズムでデータの入れ替えが行われる

・ここに問い合わせ内容が存在していればディスクを読み込む必要がないため、処理速度向上


 ③REDOログバッファ
  ・いままでの更新内容(SQL)が記録されている領域

  ・DBMSによるが〇秒に一回など決まった頻度でディスクにあるREDOログファイルに書き込みが行われる
   メモリのみであると障害時に保障できないため

  ・長期保存を行うためのアーカイブが用意されている場合は、特定の頻度でアーカイブへ


 ④ラージプール
  ・大きくメモリを使用する処理のために確保されている領域

  ・具体的にはバックアップ・リカバリーを行う際に使用する
  

■メモリ(SGA)で動いているプロセス


 ①サーバプロセス
  ・ユーザプロセスとの接続を継続してくれるもの(接続の初回はリスナーが通信を行う)

  ・ユーザごとに生成される

  ・クライアントからのSQLを処理する(解析する)
   ディスクまたはバッファキャッシュからのデータの読み出しは行うが、
   ディスクファイルへの書き出しは行わない(これはDBRが行う)


 ②バックくラウンドプロセス
  様々な面でサーバープロセスの手助けをする
  
  ①システムモニター管理(SMON)
   電源障害などの時にインスタンスをリカバリーする
 
  ②プロセス管理(PMON)
   クライアントに問題がある時、資源の解放(テーブルやレコードへのロック解除)

  ③データベースライター(DBWR)
   バッファキャッシュ上で更新された内容をディスクファイルに書き込む

  ④チェックポイント(CKPT)
   ある時点でのバッファキャッシュの内容をDBWRに指示を行い、ディスクファイルに書き込む

  ⑤ログライター(LGWR)
   更新処理内容(sql)を記録し、COMMIT時にディスクのREDOファイルに書き込む

■DB側に存在するもの

 ①制御ファイル
  ・REDOログファイルの位置やデータファイルの位置などを保持している

  ・oracle起動時、NOMOUNTからMOUNT移行の際によみこまれる

  
 ②DBファイル

  表領域
   セグメント
    エクリメント
     ブロック
      ブロックは1レコードに相当し、バッファキャッシュに読み込まれる最小単位
 
 ※DBを拡張する際は表領域を拡張するか、表領域を追加するかを行う


 ③REDOログファイル
  ・COMMITされた更新内容(SQL)が保存されているファイル
 
 ・ロールフォワードの際に参照される

  
 ④UNDOファイル
  ・更新処理を行う前のデータを保存しておく
  
  ・読み取り一貫性を保つために使用される。処理開始時点のデータを取得する
  
  ・ロールバック時に参照される

.hatena-module:nth-of-type(10) { background: transparent; } .hatena-module:nth-of-type(10) .hatena-module-title{ display: none; } .hatena-module:nth-of-type(10) .hatena-module-body { padding: 0; }