Oracle Master Silver DBA(Oracle Database Administration I)の要点まとめ

# 記事の内容

Oracle Master Silver DBAの要点をまとめます。下記書籍の内容となっております。

https://www.shoeisha.co.jp/book/detail/9784798172033

具体の勉強方法については下記の記事を参照ください

https://qiita.com/yamayamaKo/items/0d8f9bc54a19100e4add

# 要点
※図をデジタルで作る良い術が分からず、基本手書きです笑。ご容赦ください。

## 1章 Oracle Databaseの基本

#### REDO
紛らわしい2つ
- UNDO：実行したことを無かったことにする（ロールバック等）
- REDO：1回実行したことを再度実行する（ロールフォワード等）

REDOログファイルは、Oracle DBの変更履歴を記録するファイルです。REDOログファイルの再実行をロールフォワードと呼びます。

REDOログファイルは多重化でき、多重化したログファイルの集まりをグループと呼び、現在データが書き込まれるグループとカレントグループと呼びます。

カレントグループが一杯になり、別グループに切り替えることをログスイッチと呼びます。
通常、古いREDOデータはいずれ上書きされます。古いREDOデータを残したい場合は、ARCHIVELOGモードをONに変えると、ログスイッチ時にARCnプロセスがアーカイブログを吐くようになります。

![IMG_0742.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/21565ee1-cbfa-b97e-ba02-2564e9eed203.jpeg)

#### データベースバッファキャッシュ
データブロックの書き込み/読み込みの性能向上のためにデータベースバッファキャッシュなるものが存在します。

![IMG_0745.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/b6bd87e4-d6e3-0d7d-aaad-6da73306d90c.jpeg)

- キャッシュ：2回目以降のデータ読み出しはキャッシュから読むため、ストレージとのI/Oが減る。
- バッファ：遅延書き込みを行うため、ストレージとのI/Oが減る。

といった具合に性能向上してくれます。

#### REDOログバッファ
バッファキャッシュにより性能向上するのは有り難いのですが、REDOデータも同様に扱ってしまうとコミット後にバッファが消えると復旧できなくなります。

そのため、REDOログバッファはコミット確定時にREDOログファイルへ書き込みます。この書き込みはLGWRプロセスが実行します。

![IMG_0746.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/0838d630-f26c-b97b-a562-6c7fdb0eacb1.jpeg)

## 3章：インスタンスの管理
Oracleのインスタンスには以下の4つの状態があります。
- SHUTDOWN
- NOMOUNT
- MOUNT
- OPEN

![IMG_0743.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/7c3132a1-9f96-81c0-e859-c571cb0d3ba8.jpeg)

起動はSTARTUPコマンド、変更はALTER DATABASEコマンドで行います。

#### インスタンス停止方法
インスタンスの停止はSHUTDOWNコマンドで行いますが、以下の4つがあります
1. NORMAL（デフォルト）：全ての接続が切れてから停止
1. TRANSACTIONAL：実行中トランザクションが終わったら停止。接続は切る。
1. IMMEDIATE：実行中トランザクションをロールバックしてから停止。接続は切る。
1. ABORT：ロールバックもせず、ぶっちぎる。

NORMAL, TRANSACTIONAL, IMMEDIATEはチェックポイント処理が実行されますが、ABORTは実行されないです。ABORTは危険なので通常使いません。

## 6章：表領域
表領域には
- 永続表領域
- UNDO表領域（UNDOセグメント）
- 一時表領域（一時セグメント）

の3つがある。永続表領域とUNDO表領域はデータファイルに格納され、一時表領域は一時ファイルに格納される。

#### エクステント管理方式
エクステントの管理方式はローカル管理方式（デフォルト）、ディクショナリ管理方式の2種類ある。ローカル管理方式は自動で管理する方式であり、推奨されている。ローカル管理方式の場合のみ以下の機能が使える。

- エクステント割り当ての自動化（エクステントサイズを自動で決めてくれる）
- 自動セグメント領域管理
- bigfile表領域
- 遅延セグメント作成（CREATE TABLE時にセグメント割り当てないで後で割り当てる）
- セグメントの縮小

#### 表領域の定義
以下のように表領域を定義できる。この場合、hoge.dbfとpiyo.dbfの2つのデータファイルを持つ。AUTOEXTEND ONにすると、表領域の空き領域が不足すると自動でデータファイルのサイズが拡張される。

```sql
CREATE TABLESPACE tbs
    DATAFILE 'hoge.dbf'
    SIZE 100M
    AUTOEXTEND OFF,
    'piyo.dbf'
    SIZE 100M
    AUTOEXTEND ON
```

表領域の拡張は、デーファイルをリサイズして大きくする方法と新しいデータファイルを追加する方法の2つがある。

#### データファイルの移動
データファイルの移動はオフライン移動とオンライン移動の2種類がある。

オフライン移動は、以下のように表領域をアクセス不可にしてから移動する。
1. ALTER TABLESPACE ~ OFFLINE
1. OSのmvコマンド等でファイル移動
1. ALTER TABLESPACE ~ RENAME DATAFILE
1. ALTER TABLESPACE ~ ONLINE

オンライン移動は、アクセス可能なまま移動する。一時的に移動前後の両方のパスでデータファイル分の容量を消費することに注意が必要。
1. ALTER DATABASE MOVE DATAFILE '移動前のデータファイルのパス' TO '移動後のデータファイルのパス';

#### Oracle Managed Files(OMF)
データファイルを自分で管理するのめんどくさすぎない？という問題を解消してくれる機能。Oracleが自動でデータファイルの命名、作成、削除をしてくれる。

- DB_CREATE_FILE_DEST: データファイル、一時ファイル、制御ファイル、REDOログファイルが対象
- DB_CREATE_ONLINE_LOG_DEST_n: 制御ファイル、REDOログファイルが対象
- DB_RECOVERY_FILE_DEST: リカバリ関連ファイルが対象

上記3つのパラメータを指定し、データファイル名を未指定で表領域を作成するとOMF管理のデータファイルが自動で作成される。

## 7章：領域管理
#### セグメント縮小
HWM（High Water Mark）：そのセグメントでどこまでデータが格納されたことがあるかを示す。

HWMにより、HWM以降にはデータが存在しないことを保証され、読み出し範囲を絞ることができる。ただ、データの削除が繰り返されるとHWMとセグメントのデータ格納状況がズレることがある。

![IMG_0744.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/de789557-7689-f3f9-c110-f8931a359608.jpeg)

このような場合に、`ALTER TABLE SHRINK SPACE`文を実行するとセグメントを縮小して格納効率を高めたり、HWMの位置を正しい位置に補正したりできる。

COMPACTを付けると、セグメント内のデータ再編成のみを行い、不要セグメントの解放やHWMの引き下げはしない。COMPACT句が無い場合、全て行ってくれる。

![IMG_0747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/c9bf0e01-3f73-6e13-fa44-8db7471a5928.jpeg)