これまでOracle Databaseを業務で使うシーンは多々あったのですが、改めてDBAとしての役割を求められそうなのでORACLE MASTER Silever DBAをリスキリングしました!合格までの勉強方法と今回学んだことを整理します。
準備期間と結果
ORACLE MASTER Silver DBA(以下,
Oracle Silver)として認定されるためにはOracle Database Administration Ⅰに合格する必要があります。認定資格名と試験名が一致していないので少し分かりにくいですね。 120分の試験で出題数は72問、60%が合格ラインです。
準備期間は2022年12月19日~2023年2月3日と約1.5ヵ月。結果は正解率:89%で合格することができました!
合格までの勉強法
1.問題集(黒本)
翔泳社の「オラクルマスター教科書 Silver DBA Oracle Database Administration Ⅰ」です。2023年1月現在、書籍で勉強しようとするとほぼこれ一択になります。全23章あり、それぞれの章末に10~20問の練習問題と、巻末に全90問の模擬試験があります。合計で300問近いボリュームになりますから、これ1冊をやり抜けば十分合格できると思います。
2.試験内容チェックリスト
Oracle公式の試験内容チェックリスト(リンクはこちら)は、試験日が近づいてきたタイミングで一度目を通しておくとよいと思います。黒本の内容が理解できていればざっと流し見するだけでどんな内容を意味するか理解できると思いますし、「これって何だっけ?」という箇所があればそこは復習しておくべきと気付くことができます。
今回学んだこと
ではここからはOracle Silverの試験範囲を整理していきます。試験範囲の半分はSQLに関するもので、そこは理解している方も多いでしょうし、構文を覚えるだけになっちゃうので今回は割愛します。Oracle Databaseのアーキテクチャを中心にまとめます。
Oracle Databaseアーキテクチャ全体像
まずOracle Databaseがどんなアーキテクチャで動いているか全体像をまとめます。
図1:Oracle Databaseアーキテクチャ全体像
Oracleは大きくインスタンスとデータベースファイルから構成されます。インスタンスとはOracleの処理を担う常駐のメモリ、プロセスです。データベースファイルは表などのデータが格納されたファイル群です。
基本構成はインスタンス:データベースファイルが1:1です(=シングルインスタンス構成)。 一方でインスタンスを複数サーバーで起動させ、データベースファイルは各サーバーの共有ストレージで保管するRAC(Real Application Clusters)構成もあります。この場合、インスタンス:データベースファイルがN:1構成となります。1台のインスタンスがダウンしてもOracle Databaseを利用継続できたり、複数インスタンスで負荷分散できるため、高可用性・高性能を実現できます。また、インスタンス:データべースファイルが1:N構成となるマルチテナント構成もありますが、これはOracle Goldの範囲です。
上の図はOracle Silverの主要要素をぎゅっと詰め込んだため情報量が多いですが、各要素を分解して整理していきます。
ネットワークアーキテクチャ
図2:ネットワークアーキテクチャの範囲
Oracleデータベースにネットワーク越しにリモート接続するにはOracle Net Servicesの構成が必要です。具体的にはクライアント側にOracle Clientのインストールと、データベースサーバー側にリスナーの設定を行います。Oracle ClientはOracle Silverでは問われないので、リスナーについて整理します。
■リスナーの役割と接続モード
クライアントはユーザープロセスを生成し、リスナーに接続要求を送ります(下図①)。リスナーはサーバープロセスを生成し、ユーザープロセスにその接続情報を戻します(下図②)。ユーザープロセスはユーザー名とパスワードをサーバープロセスに送り、正しい場合はセッションが確立します(下図③) 図3:専用サーバー接続
リスナーはあくまでサーバープロセスへの中継役で、その定義情報はサーバー内のlistener.oraファイルに記載されます。サーバープロセスはデータベースバッファキャッシュやREDOログバッファ(インスタンスアーキテクチャで後述)への書き込み・読み取りを担います。このアーキテクチャを専用サーバー接続と呼びます。ユーザープロセスが接続要求する度にサーバープロセスが起動するため、ユーザープロセス:サーバープロセスは1:1になります。
ただ、短い処理を多量なクライアントが実行する場合、都度サーバプロセスを起動することがサーバー側の負荷になるケースがあります。その時は共有サーバー接続に切り替えると、ユーザープロセスはディスパッチャと接続し、あらかじめ起動しておいたサーバープロセスにキューを通じて処理を振り分けます。この場合もリスナーはあくまでディスパッチャへの中継役です。 図4:共有サーバー接続
■サービス登録
同一サーバに複数インスタンスを起動した場合、リスナーはユーザープロセスが希望するインスタンス(に紐づくサーバプロセス、ディスパッチャ)に正しく中継しないといけません。そのためにリスナーは内部にインスタンスの構成情報や起動状態を登録しています。これをサービス登録と呼びます。サービス登録の方法は次の2種類ですが、原則「動的サービス登録」が推奨です。静的サービス登録の場合、リスナーはインスタンスの起動状況が分からないためlsnrctl service
コマンドの結果が「status:UNKNOWN」になることが試験で問われます。
サービス登録の種類 | 概要 |
---|---|
動的サービス登録 | LREGバックグラウンドプロセスがサービスを自動登録。 |
静的サービス登録 | listener.oraにインスタンスの構成情報を手動で記載。 インスタンスの起動状況はリスナーからは分からない。 |
■ネーミングメソッド
クライアントはリスナーに登録されたサービス名を指定してリスナーに接続要求することでセッションを確立します。このサービス名の指定方法がネーミングメソッドと呼ばれるもので、こちらも数パターンあります。
ネーミングメソッドの種類 | 概要 |
---|---|
簡易接続 | 接続時に「@ホスト名:リスナーポート/サービス名」を指定。 |
ローカルネーミング | tnsnames.oraファイルにホスト名、リスナーポート、サービス名を 紐づけた接続識別子を定義し、接続時に「@接続識別子」を指定。 |
ディレクトリネーミング | Active DirectoryのようなLDAPサーバで接続識別子を指定。 |
外部ネーミング | 外部ネーミングサービスを使って接続識別子を指定。 |
インスタンスアーキテクチャ
インスタンスは、メモリ領域とバックグラウンドプロセスで構成されます。
■メモリ(SGAとPGA)
SGAと呼ばれるメモリ領域はOracleデータベース全体で共有され、幾つかのコンポーネントから構成されます。
SGAの主なコンポーネント | 概要 |
---|---|
データベースバッファキャッシュ | データファイルのコピーを一時保持する領域。 ディスクI/Oを減らしレスポンスを向上させる。 |
REDOログバッファ | サーバプロセスがDMLで更新したデータを保持。 データベースリカバリ用の情報。 |
共有プール | 解析済のSQLやPL/SQL、データディクショナリなど 様々なキャッシュを保持するための領域。 |
Javaプール | JVM内のJavaコード、データが格納される領域。 |
ラージプール | 共有プールでは適さない大量のメモリ割り当て用。 |
PGAは各サーバープロセス、バックグラウンドプロセス専用のメモリ領域です。SGAとは異なり、プロセス間で共有されることはありません。
■バックグラウンドプロセス
バックグラウンドプロセスはインスタンス起動と併せて自動起動されるプロセスの総称です。
(※補足)「プロセス」と表現していますが、Windows Serverの場合、実態はORACLE.EXEプロセス中のスレッドです。Linuxの場合は各々のバックグラウンドプロセスがOS上の1つの独立したプロセスとして実行されます。
プロセス名 | 概要 |
---|---|
DBWn(データベースライター) | データベースバッファキャッシュ内のデータをデータファイルに書き込む。 |
LGWR(ログライター) | REDOログバッファ内のデータをREDOログファイルに書き出す。 |
CKPT(チェックポイント) | DBWnが動くタイミングを指示出しする。 制御ファイルにチェックポイント情報を書き込む。 |
SMON(システムモニター) | インスタンス異常終了後、次回起動時にデータベースファイルを復旧する。 未使用の一時セグメントを解放する。 |
PMON(プロセスモニター) | プロセス異常終了時、使用していたデータ・リソースをクリーンアップする。 アイドル時間を超えたセッションを強制終了する。 |
MMON(管理モニター) | 性能分析用の統計情報を定期収集する。 |
ARCn(アーカイバ) | ログスイッチ後、REDOログファイルのデータをアーカイブログとしてコピーする。 |
LREG(リスナー登録) | インスタンスに関する情報をリスナーに登録する。 |
■データベースバッファキャッシュとDBWn
ではインスタンス内のメモリとプロセスがどう連動するか確認します。データベースバッファキャッシュには役割が大きく2つあります。1つ目はデータファイルから読み出したブロックが一時保持する「キャッシュ」の役割。2つ目はサーバープロセスによって更新されたデータをデータファイルへ遅延書き込みする「バッファ」の役割です。この時、データベースバッファキャッシュからデータファイルに書き込む処理を担うのがDBWn(データベースライター)です。 図6:データベースバッファキャッシュとDBWnの関係
■REDOログバッファとLGWR
データファイルへの遅延書き込みにより、変更データは一時的にメモリ(データベースバッファキャッシュ)に保持されます。従って、DBWnがデータファイルに書き込む前にインスタンス障害を起こすと、変更データが紛失します。そこで、サーバープロセスはデータベースバッファキャッシュに書き込むのと同時にREDOログという変更データを生成し、REDOログバッファに書き込みます。その後、変更データがCOMMITされるとREDOログをREDOログファイルに書き込む処理を担うのがLGWR(ログライター)です。 図7:REDOログバッファとLGWRの関係
■インスタンスの起動・停止
インスタンスを起動してから実際にデータベースが使えるようになるまでには、下の図のようにステップがあります。
図8:データベースオープンまでのステップ
OPEN以外の状態では管理権限(SYSDBA権限、SYSOPER権限、SYSBACKUP権限等)をもつユーザーのみアクセスできます。普通にデータベースを使う場合は、いきなりstartup open
コマンドでオープンすればよいですが、次のケースでNOMOUNT、MOUNT状態にすることがあります。
- NOMOUNT:データベースの作成(
CREATE DATABASE
)、制御ファイルの作成(CREATE CONTROLEFILE
) - MOUNT:アーカイブログモードへの変換(
ALTER DATABASE ARCHIVELOG
)、データベース全体のリカバリ
インスタンスを停止する場合はSHUTDOWN
コマンドで実行することでSHUTDOWN状態にしますが、コマンドのオプション(SHUTDOWN xxx
のxxx部分)によって停止までの挙動が異なります。
オプション | 挙動 |
---|---|
NOMAL | すべての接続が切れるまで待つ。 オプション未指定時のデフォルト。 |
TRANSACTIONAL | 実行中のトランザクションが終わるまで待つ。 トランザクション後に接続は切断する。 |
IMMEDIATE | 実行中のトランザクションをロールバックさせる。 |
ABORT | ロールバックもせず実行中のトランザクションは無視して即時停止。 次回起動時にインスタンスリカバリが動く。 |
論理記憶域アーキテクチャ
図9:論理記憶域アーキテクチャの範囲
■スキーマ
Oracleデータベースを利用するにはユーザーを作成し、そのユーザーを使ってデータベースに接続したり、表の作成、データの読み取りを行います。明示的に所有権を指定せずに表の作成CREATE TABLE
を行うと、その実行ユーザーが表の所有者となります。所有ユーザーごとに表などのオブジェクトを管理する箱をスキーマと呼びます。Oracleにおいては1つのユーザーに必ず同名のスキーマが1つ存在します。
■表領域
オブジェクトはスキーマという箱で管理されますが、実態の格納場所は表領域です。表領域とは、データファイル(物理記憶域アーキテクチャで後述)をグルーピングした論理的な記憶域です。Oracleデータベースで表を作成する際、次のように表領域を指定します。
CREATE TABLE emp ( enpno NUMBER(8,0), enpname VARCHAR2(50), ) TABLESPACE tblsp1;
■セグメント
さらに表領域はセグメントと呼ばれる記憶域で構成されます。1つの表領域には複数のオブジェクトを格納できますが、オブジェクトとセグメントは1:1で対応します。ユーザーがオブジェクト作成時に指定するのは前述の通り表領域であり、セグメントはOracle側が管理してくれます。その管理方式をセグメント領域管理方式と呼び、表領域ごとに以下2種類のどちらで管理するかを定義します。
セグメント領域管理方式 | 概要 |
---|---|
自動セグメント領域管理 | ブロック(後述)の空き状況を4レベルに分類してツリー構造で管理。 設定項目はPCTFREE(=ブロックの空き割合)だけ。 |
手動セグメント領域管理 | 空き領域のあるブロックをリスト構造で管理。 設定項目はPCTFREEの他、PCTUSEDやFREELISTSなど多い。 |
■表領域の管理方式
表領域は内部のエクステント(物理記憶域アーキテクチャで後述)管理方式によってローカル管理方式とディレクトリ管理方式に分かれます。ディレクトリ管理方式は下位互換のためだけに残っており、原則ローカル管理方式を採用します。試験ではローカル管理方式での使用できる以下の機能を問われます。
- エクステント割り当ての自動化:エクステントのサイズを自動決定。
- 自動セグメント領域管理:上で説明した通り。
- bigfile表領域:最大32TBの巨大な表領域を作れる。
- 遅延セグメント管理:オブジェクト作成時にセグメントは作らない。表作成の時間短縮。
- セグメントの縮小:
ALTER DATABASE SHRINK SPACE
でセグメントを縮小する。
■表の圧縮
Oracle Database Enterprise Editionだと、表を圧縮してストレージ領域を削減することができます。基本表圧縮(ROW STORE COMPRESS BASIC)では、ダイレクトパスロードというデータベースバッファキャッシュを介さず直接データファイルにデータを書き込む場合にデータが圧縮されます。SQL*Loaderでファイルから一括データ取込した際や`パラレルINSERTした時が対象なので、大量なデータINSERTを行いがちなDWHなどが向いています。高度な行圧縮(ROW STORE COMPRESS ADVANCED)では、すべての操作を対象に圧縮を行います。圧縮の仕組み自体は基本表圧縮と同じです。Enterprise Editionに加えて、Advanced Compression Optionが必要です。さらにExadataではハイブリッド列圧縮機能も利用できます。これもDWH向きな機能ですが、基本表圧縮よりも圧縮率が高くなります。
物理記憶域アーキテクチャ
図10:物理記憶域アーキテクチャの範囲
■データファイル
データファイルは表やデータを格納する実態のファイルです。hoge01.dbfのような名前でOS上のファイルシステムで管理されています。表領域とデータファイルは1:Nの関係で、1つのデータファイルはいずれか1つの表領域に属します。
■ブロックとエクステント
データファイルは固定サイズ(2~32KB)に分割されて使用されます。これをブロックと呼びます。ブロックの中にデータを格納し、領域が足りなければセグメントに割り当てるブロックを前述のセグメント領域管理方式に則って増やします。ただし、ブロックは非常に小さく数が多いので1つずつセグメントに割り当てるのは非効率です。そこで複数の連続したブロックをエクステントと呼ばれる単位にまとめ、エクステントをセグメントに割り当てています。
1つの行データは、通常いずれか1つのブロックに格納されますが、行連鎖と行移行という例外状況では複数ブロックにまたがって格納されることがあります。いずれもストレージのI/O回数が増えるので極力避けるべきです。
図11:行連鎖と行移行
行連鎖は1つの行データのサイズがブロックサイズよりも大きい場合に発生します。従ってブロックサイズを大きくするか、行サイズを小さくすることが対策です。行移行はUPDATE時に更新後データの方がサイズが大きく、同一ブロックの空き領域に収まらなかった場合に発生します。あらかじめ空き領域を大きめに取っておけば発生しにくくなるので、セグメント領域管理方式の設定項目であるPCTFREEを大きめに設定しておくことが対策です。
インスタンスアーキテクチャで触れたように、REDOログはデータベースの変更データです。インスタンス障害時に紛失した変更データを復元するためにREDOログを管理するREDOログファイルがあります(ちなみに変更データ復元のことをロールフォワードと呼びます)。REDOログファイルは無制限にサイズが拡張する訳ではなく、一定サイズになると古いREDOログを上書きます。上書きされる前にREDOログを退避しておくファイルがアーカイブログファイルです。また、アーカイブログファイルを出力するモードをアーカイブログモードと呼びます(インスタンスがMOUNT状態のときにモード変更可能)。アーカイブログファイルは、バックグラウンドプロセスのARCn(アーカイバ)によって出力されます。
■制御ファイル
制御ファイルは、データファイル名やREDOログファイル名等の構成情報、データベース作成時間などの管理情報が記録されているファイルです。制御ファイルが破損するとデータベースを起動できなくなるため、複数ファイル作成し多重化しておくことが推奨です。CONTROL_FILES初期化パラメータに複数ファイル名を指定しておくと、多重化が実現できます。
■Oracle Managed Files(OMF)
OMFとは、Oracleがデータベースファイル(データファイル、REDOログファイル、制御ファイル)やアーカイブログファイルの命名、作成、削除を行い、DBAの管理負荷を削減するための機能です。OMFを有効するには、DB_CREATE_FILE_DIST初期化パラメータにデータベースファイルの配置先を、DB_RECOVERY_FILE_DEST初期化パラメータにアーカイブログファイルの配置先を指定します。さらに、これはオプションですがDB_CREATE_ONLINE_LOG_DEST_n初期化パラメータ(n=1,2,...,5)を設定すると制御ファイルとREDOログファイルが最大5か所の指定した場所に多重化されて配置されます。
まとめ
Oracle Silverの勉強法とOracle Databaseアーキテクチャの全体像を整理しました。アプリケーション担当としてOracleを使うことは多かったですが、DBAとして改めて勉強するとバックグラウンドプロセスや物理記憶域の管理など普段あまり意識することが無い部分をおさらいできて、良いリスキリングの機会となりました。Oracle Goldを取得したらまた記事にまとめたいと思います。