てきとーにのんびりだらだら

毎日更新目標!SEブログ!

今日はたんまり勉強デー!目標は6章まで勉強完了へ!

おつおつー^^
今日はきっちり7時半に起きました←
勉強は8時半からスタートしております。
午前は本屋に行って金曜日に更新しようとした記事更新のために調べものをして、午後から勉強でちょっと怠けたところもあったけど気づいたら21時半です...
この後は金曜日の記事更新もして22時半くらいになるかなーやること終わるのは...
今日は結構勉強突っ走ったせいで何も記事になるようなものありませんでした!
余力があったら22時半以降に何か追加でこの記事更新して書ければなーなんて思っています!
では残りの記事はすべて勉強した内容です!

ラクインスタンスの管理


インスタンスの起動停止

インスタンスを起動してからデータベースを使えるようにするまで4つのステップが存在します。
それぞれのステップを以下の表にまとめました。

ステップ 説明
SHUTDOWN インスタンス停止し、データベースが稼働していない状態
NOMOUNT 初期パラメータファイルを読み込み、インスタンスが起動される。インスタンスのみ起動された状態。 バッググラウンドプロセスも起動
MOUNT 初期パラメータ情報をもとに制御ファイルを読み込む。制御ファイルが読み書き可能な状態(オープン)
OPEN 制御ファイルの情報をもとにREDOログファイル、データファイルを利用可能にする。データベースがオープンの状態で一般ユーザーも利用可能に

※補足ですが、NOMOUNTからMOUNT状態へ移る際、初期化パラメータファイルにあるCONTROL_FILESを取得し、ここに格納されているファイル名を持つすべての制御ファイルがオープンとなります。
また、制御ファイルのオープンに失敗した場合はMOUNT状態にはなりません。
OPENの説明でも書きましたが、OPEN状態を除くステップではsysDBA権限などを持つユーザーでのみoracleデータベースに接続可能です。
各ステップにおいて読み込むファイルに障害が起きていた場合、次のステップに遷移せずインスタンス起動処理は停止します。

SQL*plusによるインスタンス起動

インスタンス起動にはSQL*PlusでsysDBA権限など管理権限を持つユーザーで接続し、「startup」とコマンドで実行する必要があります。
startupではOPEN状態までインスタンスを起動するものの、「startup」の後ろには「nomount」「mount」「open」を引数のようにして実行することでその状態までもっていくことができます。
データベースの手動作成、制御ファイルの再作成時にnomountを引数としたコマンド、データベースファイルの改名/削除やデータベースの復旧時にmountを引数としたコマンドを実行するそうです。

初期化パラメータ

初期化パラメータは各メモリー領域のサイズや各機能のON/OFF、プロセスの動作設定などインスタンスの動作特性を決定するパラメータです。
ラクルのバージョンによって個数に差がありますが、数百もの初期化パラメータ―が用意されています。 以下にパラメータをまとめました。

パラメータ 説明 起動中の変更
CONTROL_FIlES 制御ファイルのファイル名。複数指定可能 ×
DISPATCHERS ディスパッチャプロセスの構成
MEMORY_MAX_TARGET MEMORY_TARGET初期化パラメータの上限値
MEMORY_TARGET すべてのSGAコンポーネントと全プロセスのPGAの合計サイズ。自動メモリー管理使用時に設定する ×
PGA_AGGREGATE_TARGET 全プロセスのPGAの合計サイズの目標値。自動PGAモリー管理使用時に設定する
SHARED_POOL_SIZE 共有プールのサイズ
SGA_MAX_SIZE すべてのSGAコンポーネントの合計サイズの上限値 ×
SGA_TARGET すべてのSGAコンポーネントと全プロセスのPGAの合計サイズ。自動共有メモリー管理使用時に設定する
UNDO_RETENTION UNDO保存の下限値(秒)

起動中に初期化パラメータを変更できるものを動的パラメータといい、変更できないものを静的初期化パラメータといいます。
静的初期化パラメータは「SCOPE=SPFILE」コマンドを使用して起動時に変更ができますが、変更した値はインスタンス再起動後に変更できます。

ALTER SYSTEM SET パラメータ名 = 値;  
ALTER SYSTEM SET パラメータ名 = 値 SCOPE=SPFILE;

初期化パラメータファイルについてですが、初期化パラメータファイルはサーバーパラメータファイル(SPFILE)とテキスト形式の初期化パラメータファイル(PFILE)の2種類あります。
主流はSPFILEとなっており、相違点としてはSPFILEはバイナリ形式でユーザーが直接編集できないためSQLを使用し、PFILEはテキスト形式て直接変更可能(SQLでは変更不可)な点です。
SPFILEとPFILEどちらも存在する場合SPFILEが優先的に使用されます。 インスタンス再起動後も有効にするにはSPFILEの設定を変更する必要があります。また設定値はSQL(ALTER SYSTEMコマンド)で変更できます。

インスタンスの停止

OSの再起動やメンテナンス作業をする際はインスタンスを停止する必要があります。
インスタンスを停止するにはSQL*Plusでshutdownコマンドを使用しますが、SYSDBA権限などの管理権限がないと実行できません。 shutdownコマンドを以下の表にまとめました。

オプション 説明 既存接続の扱い 実行中SQL
NORMAL インスタンスの停止処理を行う。オプション未指定時のデフォルト ユーザーが接続を終了するまで待機 何もしない
TRANSCTIONAL インスタンスの停止処理を行う。 トランザクション終了時に切断される トランザクション終了を待機
IMMEDIATE インスタンスの停止処理を行う。 切断される 取り消す(ロールバック
ABORT インスタンスを強制終了する 切断される 強制終了(取り消し処理を実行しない)

shutdown abortはosレベルでのプロセスkillと同等なので、日々の運用での使用はしないでください。
使用した場合はデータベースファイル整合性は取れてない状態となり、次回インスタンス起動時に自動回復となります。
ちなみに、その他のオプションの場合は整合性は取れた状態となります。

メモリコンポーネントの自動調整機能と各メモリー管理について

モリー領域に必要なサイズはoralceデータベースで実行される処理内容や処理の曜日や時間帯によって変化するため、oracleにはSGAとPGAのメモリーサイズを自動調整する機能があります。
REDOログバッファのサイズは自動調整の対象外です。
自動メモリー管理により、SGAとPGAのサイズを自動調整し、さらにその中でSGAを対象とした自動共有メモリー管理やPGAを対象とした自動PGAモリー管理が自動調整します。
自動メモリ―管理はMEMORY_TARGETをもとに合計サイズを超えないよう調整しますが、MEMORY_TARGETの値を設定しないか0にすることで自動メモリー管理を無効化することができます。
自動メモリー管理でのSGAとPGAのサイズ下限値はそれぞれの初期化パラメータであるtargetに基づき、それを下回ることはありません。
自動共有メモリー管理ではSGA全体のメモリーサイズはSGA_TARGETの設定値となり、固定です。各コンポーネントのサイズを自動調整を行います。
自動共有メモリー管理を無効化するには自動メモリー管理を無効化したうえでSGA_TARGETに何も設定しないか0を設定します、このことを手動共有メモリー管理といいます。
手動共有メモリー管理とした場合、次の初期化パラメータで設定したサイズに各コンポーネントは固定されます。
「LOG_BUFFER」「DB_CACHE_SIZE」「SHARED_POOL_SIZE」「JAVA_POOL_SIZE」「LARGE_POOL_SIZE」
自動PGAモリー管理も自動共有メモリー管理と同様の仕様です。自動共有メモリー管理の有効/無効にかかわらず有効にできます。

データベース記憶域構造の管理


データベースファイルについて

oracleデータベースが読み書きするファイルを表にまとめました。以下のファイルは記憶域(ストレージ)にあります。

ファイル 説明
データファイル 表や索引などのデータが格納
REDOログファイル(オンラインREDOログファイル) データベースに対して行われた更新情報すべてが記録
制御ファイル データファイル名やREDOログファイル名を含むデータベースの構成情報及び管理情報が格納
初期化パラメータファイル 初期化パラメータのリストおよび各パラメータの値が格納
パスワードファイル SYSDBAなどの管理権限を持つユーザーのパスワードを管理する
アーカイブログファイル REDOログファイルのコピー

今回はREDOログファイルと制御ファイルについて詳しく説明していきます。
REDOログファイルはインスタンスが異常終了した場合やデータファイルが破損した際に障害復旧するのですが、記録された更新履歴をもとに更新処理を再実行することをロールフォワードと呼ぶことがあります。(インスタンス回復やクラッシュリカバリと呼ばれることも)
インスタンス異常終了によって、データベースファイルは一貫性がとれてない不整合な状態になり、また更新されていない状態となります。その際に復旧させることをインスタンスリカバリといいます。
REDOログファイルは多重化されています。多重化構成におけるREDOログファイルをメンバー、多重化されたメンバーの集合をグループ(ロググループ)と呼び、グループを複数用意された状態で複数グループでログスイッチを順次行っています。ログスイッチの基準は「カレントグループにいっぱいまで書き込んだら」でグループ内のメンバーに書き込まれるREDOデータは同一になります。これらはローテーション形式といえます。
REDOログファイルのサイズは自動的に拡張されません。 制御ファイルでは先ほどでもあったログファイルの構成(グループ数、メンバーのファイル名など)も記録されているため重要なものです。多重化は推奨でされており、またデフォルトで制御ファイルも多重化されています。

表領域について

oracleデータベースに表や索引などのデータを格納するときに指定するのが表領域です。表領域の仕組みを全く理解していないためより詳しく見ていきます。
表領域にも種類がありますが、1つ以上のデータファイルをグループ化されてできています。表や索引などの記憶域は、指定された表領域を構成するデータファイルから割り当てられます。
割り当てについて、基本的にオブジェクトとセグメント(記憶域)は1対1で対応しますが、データを保持しないオブジェクトであるビューを例にすべてのオブジェクトにセグメントが対応されるわけではありません。
データファイルは固定サイズ(2KB~32KB)に分割して使用されており、この分割されたものをデータブロックといいます。
データブロックの中にオブジェクトのデータが入ります。例えば、表の行データはセグメントのデータブロックの中に保管されます。
データブロックは小さいため、エクステント(連続したデータブロック)で構成としてまとめてセグメントに割り当てをする。
セグメントの空き容量が不足した場合は、セグメントにエクステントを追加することが可能です。
少し自分自身で分かりにくかったため整理しますと、データベースには表領域が複数存在します。また、表領域には、1つ以上のデータファイルで構成でき且つ1つ以上のセグメントで格納されます。(オブジェクトもセグメントで対応しているが表領域ではありません)
これから特殊な役割の表領域ですが、動作に必要なものであるためoracleデータベース作成時に自動的に作成されます。
SYSTEM表領域
データディクショナリが格納され、表領域名は変えることができない表領域となっています。
SYSTEM表領域は常に使用可能な状態(オンライン)である必要があり、SYSTEM表領域を構成するデータファイルが破損してSYSTEM表領域が使用できなくなった場合はインスタンスは異常終了します。
SYSAUX表領域
SYSTEM表領域の補助的な役割でデータベースの動作を補助する様々な管理情報が格納されています。
AWRと呼ばれる表の集合もSYSAUX表領域に格納されています。表領域名はSYSTEM表領域同様変更できません。 UNDO表領域 UNDOセグメントという特殊なセグメントを格納するための表領域で、表や索引などの通常オブジェクトのセグメントは格納できません。
表領域名は変更可能であり、またDBCAでデータベース作成した場合「UNDOTBS1」という表領域名となります。
また、データファイルから構成されます。 一時表領域 一時セグメントという特殊なセグメントを格納するための表領域で、UNDO同様通常オブジェクトのセグメントは格納できません。
表領域名は変更可能であり、またDBCAでデータベース作成した場合「TEMP」という表領域名となります。
また、一時ファイルから構成されます。

表領域の作成・拡張・削除

SQL*Plusを用いた表領域作成手順やサイズ拡張、削除について説明していきます。
まず前提として、データベース作成したところでアプリケーション用の表領域はないため作成が必要です。
作成する際、CREATE TAVLESPACEコマンドを使うのですが一旦以下に2つのデータファイルで構成される表領域のコマンドの例を記載します。

CREATE TABELESPACE 表領域名  
 DATAFILE ファイルパス  
 SIZE 初期サイズ  
 AUTOEXTEND 自動拡張(ONorOFF)  
 ファイルパス(2番目のデータファイル)  
 SIZE 初期サイズ(2番目のデータファイル)  
 AUTOEXTEND ON;(2番目のデータファイル)

比較対象によってはここで作成した表領域を永続表領域と呼ばれることやsmallfile表領域と呼ばれることがあります。

次に表領域の拡張についてですが、表領域のデータファイルをリサイズしてデータファイルのサイズを大きくするかもしくは表領域に新しいデータファイルを追加することで拡張できます。
先ほどコードとして記載したAUTOEXTENDがONに設定されている場合、表領域の空き領域が不足した場合自動でサイズが拡張されます。

ALTER TABLESPACE 表領域  
 ADDDATAFILE ファイルパス SIZE 値;
or
ALTER TABLESPACE 表領域  
 ADDDATAFILE ファイルパス
 RESIZE 値;

最後に表領域の削除ですが「空の表領域の削除」、「表領域に格納されているオブジェクトと表領域を削除」、また「表領域に格納されているオブジェクトと表領域およびデータファイルを削除」でコマンドが異なります。

DROP TABLESPACE 表領域 ;
DROP TABLESPACE 表領域 INCLUDING CONTENTS;
DROP TABLESPACE 表領域 INCLUDING CONTENTS AND DATAFILES;

表領域の作成に関係することで、先ほど話したsmallfile表領域の対となるbigfile表領域なるものが存在します。
oracle Database 10gで導入されたものですが、smallfile表領域はデータファイルサイズが32GB(データブロックが8KBの場合)であり、数TBを超える表領域を作成しようとするとデータファイルが多くなり管理しづらくなります。begfile表領域は32TB(データブロックが8KBの場合)であるため問題を回避できます。bigfile表領域は1つのデータファイルだけでしか構成できずまた、ファイル追加もできません。

UNDO表領域と一時表領域

UNDO表領域は先ほど説明したとおり、UNDOデータを保管するUNDOセグメントのみ格納できる表領域です。
oralceによりUNDOセグメントおよびUNDOデータ管理が自動的に行われており自動的に削除されます。 1つのデータベースに複数のUNDO表領域を作成することができますが、稼働中のデータベースは最低1つのUNDO表領域が使用可能な状態である必要があり、また使用可能にできるのは1つだけとなっています。
UNDOデータの用途ですが、
トランザクションロールバック
読取り一貫性の保証
一部のフラッシュバック機能 となっています。
一部のフラッシュバック機能とは表データを過去の状態に戻す機能になります。
読取り一貫性の保証とは、selectコマンド実行中にほかのユーザーがデータを変更した場合でも、select時点のデータをUNDO表領域から読み込むことで一貫性を保証できるということです。
ただ、大量更新であった場合UNDO表領域で保管できるUNDOデータには制限があるため読取り一貫性エラー(ORA-01555スナップショットが古すぎます)が発生する可能性があります。
解決する方法としては、一応初期パラメータのUNDO_RETENTIONに想定される問い合わせ時間よりも大きな時間(単位:秒)で設定することです。また、UNDO表領域を構成するデータファイルの自動拡張を有効にすることも有効となります。

一時表領域はメモリー上で処理ができない大量データを処理する場合に使用される表領域です。
ソート処理などを行う場合、データをPGAに展開できる場合は、PGAすなわちメモリー上で処理が実行されますが、PGAに展開できないほど大きいデータサイズとなった場合は一時セグメントに展開され、ストレージを使って処理が実行されます。ただ、処理速度は低下されます。
UNDO表領域同様自動的に実行されるためPGAを使用するか一時セグメントを使用するかの判断はできません。