Oracleマスター Silver 12ｃ データベース記憶域構造の管理

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

※用語はなるべく、Oracle® Databaseリファレンス　12c リリース1 (12.1) より抜粋しております。

■公式チェックリストより出題範囲
データベース記憶域構造の管理
－表の行データをブロックに格納する方法について説明する
－表領域を作成および管理する

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－

####要点
■データベース記憶域構造の管理
Bronzeと内容は同じなので割愛

■表の行データをブロックに格納する方法について説明する
頻出。

■表領域を作成および管理する
試験では、画面ショットではなくコマンド構文で出題されるためコマンド構文を覚えること。
表領域の役割、表領域の削除を押させておくこと

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###データベース記憶域構造
　Bronzeと内容は同じなので割愛

－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
###表の行データをブロックに格納する方法について説明する
PCTFREEぐらいしか出題されないだろう（多分）

PCTFREE
UPDATE文によって行サイズが長くなると行断片（行移行／行連鎖）が発生する可能性があります。
行移行：更新などにより行サイズが大きくなった時に、別のブロックにデータを格納すること。
行連鎖：収まらなかった場合は、複数のブロックにまたがって格納されます。

オブジェクトの行を将来更新するために確保しておく領域の割合。この割合を超えるとブロックに挿入不可能になる。
・PCTFREEを適切に設定することで「行移行」を防げます。
・**データ挿入後、列値の更新によって平均行長が増える（頻繁に更新される）場合に設定する**
・データ挿入後、そのデータが更新されることがない場合は0に設定すればよい（コード値のマスタ表など）
___
###表領域を作成および管理する
表領域は**表や索引などのオブジェクトを格納する入れ物**です。

事前構成済みの表領域

| 表領域名   | 説明 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　| 
|:----------|:---------------------------------------------------------------------------------:|
| **SYSTEM**|データベースの管理情報や**データベースディクショナリ**が格納されている。SYSスキーマに属する|
| **SYSAUX**|**SYSTEM表領域の補助領域**。SYSTEM表領域の負荷を軽減する。　　　　　　　　　　　　　　　　|
| **TEMP**  |**一時表領域**。大規模なソートや索引の作成などPGAのメモリ内で処理できない場合に使用される。|
| UNDOTBS1  |**UNDO表領域**　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　|
| **USERS** |**SYS、SYSTEMユーザー以外のデフォルト表領域**　　　　　　　　　　　　　　　　　　　　　　|
| EXSAMPLE  |サンプルスキーマに属するオブジェクト　　　　　　　　　　　　　　　　　　　　　　　　　　　　|

SYSTEM、SYSAUX、TEMP、USERS表がどのような時に使用されるかを把握しておくこと。

**表領域とデータファイル**
<FONT COLOR=red>表領域は、複数のデータファイルと対応付けることができる</FONT>
<FONT COLOR=red>データファイルは、1つの表領域にのみ属することができる</FONT>

####表領域の作成
■エクステント管理方法
　●ローカル管理表領域　：EXTENT MANAGEMENT LOCAL　（デフォルト）
　　－**エクステント**の割当や解放を表領域の各データファイルヘッダーにある**ビットマップ**で管理する
　　　※ビットマップで管理していることが出題される。

一緒に押さえておきたい所：ローカル管理表の利点
・データディクショナリ管理表領域よりも早く空きエクステントを検索できる。
・データディクショナリに対するアクセス競合を低減できる。
・ローカル管理表領域では、ビットマップを更新してもUNDOが生成されないため、データベースに対する負荷が低くなる。
・エクステントサイズをOracleが自動的に決定する。
・**UNIFORM句を設定するとユーザーが指定したサイズでエクステントが割り当てられる**
・自動的に決定・制御したい場合はAUTOALLOCATE句（デフォルト）
→これは異なるエクステント・サイズのエクステントが多数必要と予測される場合に指定する。

　●ディクショナリ管理表：EXTEN MANAGEMENT DICTINARY
　　－下位互換用の管理方法、エクステントの割当や解放を、SYSTEM表領域にある**データディクショナリ**で管理する。
　　　※空きリストでブロックの使用状況を管理している

#####セグメント領域管理方法
　ローカル管理表領域では、表にデータを挿入する際にその表に割り当てられているすべてのエクステント（セグメント）内で、どのブロックが空いているかを探す方法に「自動」「手動」の2種類がある。

CREATE TABLESPACEにオプション句として宣言します。
自動：**SEGMENT SPACE MANAGEMENT AUTO**句
　セグメント内の空き領域の管理に**ビットマップ**が使用される
　<font color="SlateGray">利点：</font>手動セグメント領域管理と比べてパフォーマンスがいい。

手動：**SEGMENT SPACE MANAGEMENT MANUEL**句
　セグメント内の空き領域の管理に**空きリスト**が使用される

■データファイル
 『BIGFILE表領域』
bigfile表領域は、単一で非常に大きい(最大40億ブロック)データファイルを持つ可能性がある表領域です。
→**BIGFILE表領域**には、1つのデータファイルまたは一時ファイルのみが含まれる。
bigfile表領域を使用してデータベースの記憶域容量を増やし、多数のデータファイルと一時ファイルを管理する負荷を減らすことができます。

注意点：
→bigfile表領域は、自動セグメント領域管理を指定したローカル管理表領域でのみサポートされます。
→ただし、ローカル管理のUNDO表領域、一時表領域およびSYSTEM表領域の3つは例外。（bigfile表領域にすることはできません)

『smallfile表領域』
SMALLFILE表領域はOracle従来の表領域であり、1022個のデータファイルまたは一時ファイルを含めることができる。

■UNDO表領域
　UNDO情報を格納する表領域。データベースには複数のUNDO表領域を作成できるが、<FONT COLOR=red>1つのインスタンスに対してアクティブにできるUNDO表領域は1つのみ</FONT>
詳細は別の章で。

■表領域のステータス
読取り／書込み　：読取り、書込み操作が行える
読取り専用　　　：**「SYSTEM」「SYSAUX」「UNDO」「一時表」領域は読取り専用にはできない**
オフライン　　　：表領域にアクセスできない。

■領域の管理
 表領域の作成時に指定した項目のうち、以下のものは作成後に変更できる。
　・表領域名
　・ステータス
　・**データファイルの追加、サイズ変更**
　・圧縮オプション
　・ロギングの有効化・無効化の切替え
　・しきい値の変更

####表領域の削除
■コマンドによる表領域の削除
　DROP TABLESPACE 表領域名；
　　<FONT COLOR=red>**オプション句を覚えておくこと**</FONT>
　　・INCLUDING CONTENTS：表領域内のオブジェクトと表領域の定義が削除される　　　　
　　・INCLUDING CONTENTS AND DATAFILES：上記に加え、データファイルが削除される。
**※オブジェクトが使用中の表領域や、コミットされていないトランザクションをロールバックするためのUNDOデータを持つUNDOセグメントが含まれる表領域の場合は削除できない点に注意**

■表の切り捨て
　表内のすべての行データを削除することです。
構文：`TRUNCATE TABLE [ スキーマ名. ]表名`
TRUNCATE文はDDLのためUNDOを生成しません。そのため、DELETE文よりも高速に表内のすべての行データを削除できます。

<font color="Blue">注意点：</font>
・同時に索引と表構造（トリガー、依存オブジェクトなど）も切り捨てられます。
→11ｇ白本によると索引は削除できるが、索引構造は削除できないらしい。公式ドキュメントからはその旨を見つけることができなかった。
・TRUNCATE TABLE文はロールバックできません。
・FLASHBACK TABLE文を使用して、切り捨てられた表の内容を取得することはできません。
・CASCADE句を指定するとON DELETE CASCADE参照制約が有効化されていて、tableを参照する子表は、すべて切り捨てられます。そのため影響する子表がすべて自分のスキーマであるか、DROP ANY TABLEシステム権限が付与されている必要があります。

おまけ：ここまでは出題されないと思う。
<font color="SlateGray">索引構成表や一時表も切り捨てることができます。</font>
<font color="SlateGray">外部キー制約の親である表は、切り捨てることはできません。その表を切り捨てる場合、制約を無効にしておく必要があります。</font>
___
###データベースの拡大
・新規表領域の作成
・既存表領域の拡大
　　・データファイルの追加
　　・データファイルのサイズの拡大
　　・データファイルの動的拡張の設定

**構文：データファイルの追加**
ALTER TABLESPACE 表領域名
ADD DATAFILE 'データファイル名' SIZE [K | M]

**構文：データファイルのサイズの拡大および動的拡張**
ALTER TABLESPACE DATAFILE 'データファイル名'
{RESIZE サイズ [K | M] |
  AUTOEXTEND [OFF | ON [NEXT サイズ [K | M]]]　MAXSIZE サイズ [K | M]]
}

データファイルの最高水位標以上の領域に限りデータファイルの縮小することができる。
出来なかった場合　→ORA-03297:ファイルには、リクエストしたRESIZE値を超える使用中のデータが含まれています。



###その他の領域の管理方法
■**OMF(Oracle Managed Files)**
　表領域やREDOログに関連するファイルを自動的に作成・管理する機能。
　初期化パラメータに任意のディレクトリを設定すると、その配下に自動的にファイルが作成される。
※サイズを指定しないデータファイルは、自動拡張が有効な100MBのサイズで作成されます。

●OMFに関連する初期化パラメータ
**DB_CREATE_FILE_DEST**         ：データファイルや一時ファイルを保管するディレクトリを指定する。
**DB_CREATE_ONLINE_LOG_DEST_n** ：REDOログファイルや制御ファイルを保管するディレクトリを指定する。
**DB_RECOVERY_FILE_DEST**       ：**フラッシュバックリカバリ領域として使用するディレクトリを指定する。**
<FONT COLOR=red>DB_RECOVERY_FILE_DEST</FONT>は絶対覚えておくこと。

■**ASM（自動ストレージ管理）**
●ストライピングおよびミラーリングを実現する機能。
　**DBCA**でASMインスタンスを作成する必要がある。
　　・ASMディスクグループと呼ばれるグループに1つ以上のRAWデバイスを含める必要がある。
　　・ASMインスタンスは**主にディスクグループの管理に使用される。**

ASMに関してはコマンドがいくつかあるが出題範囲なのか不明
MD_BACKUP　：md_backupコマンドは、1つ以上のディスク・グループのメタデータを含むバックアップ・ファイルを作成します。
MD_RESTORE　：md_restoreコマンドは、ディスク・グループのメタデータのバックアップをリストアします。
MKDG　　　　：XML構成ファイルに基づいてディスク・グループを作成します。
一応公式ドキュメントのリンク
https://docs.oracle.com/cd/E96517_01/ostmg/asmcmd-diskgroup-commands.html#GUID-E2C4C913-5AA8-45F1-9A05-EE1F69496EB5

出題例：データファイルを削除するため、`ALTER TABLESPACE [表領域名] DROP DATAFILE [データファイル名]`コマンドを使用しました。
データファイルにはエクステントが格納されています。（データが存在します）結果はどうなりますか？
→エクステントが格納されている場合　ORA-03262：ファイルが空ではありません。エラーになる
→1番目のファイルの場合　ORA-03263：[表領域名]の1つめのファイルは削除できません。

出題例：DROP TABLESPACE 表領域名;文を使用し、表領域を削除しました。表領域内のオブジェクトと索引を再利用することはできますか。
→再利用可能です。INCLUDING CONTENTS句を使用していない場合は、表領域内のオブジェクトと索引は残ります。

出題例：TRUNCATE　TABLE文を使用し、表の切り捨てを行った場合に同時に削除されるものを選びなさい。
→索引と表構造（トリガー、依存オブジェクトなど）も切り捨てられる。

出題例：BIGFILE表領域にデータファイルを追加するため、`ALTER TABLESPACE [表領域名] ADD [ディレクトリ名] [SIZE]`コマンドを使用しました。結果はどうなりますか。
→ORA-32771:BIGFILE表領域にファイルを追加できません。

出題例:ORA-01653 エラー（表ｘｘｘを拡張できません）が発生したため、問題を解決するための方法を選択しなさい。
→対象の表領域にデータファイルを追加する
→対象の表領域の既存のデータファイルのサイズを手動で大きくする

出題例：データファイルの移動について正しいものを選択しなさい
→ASMディスクグループとファイルシステム間で移動できる
→OMFファイルを非OMFファイルに移動できる。（逆も可能、ただしKEEP句は無視され元ファイルは削除される）
※オプション句
KEEP：元ファイルを保持し、宛先へコピーする（デフォルト）
REUSE：宛先ファイルが存在している場合、上書きする