Oracle Databaseのモニタリング

 


✅ bashスクリプトを使ったモニタリングツール作成

📁 スクリプト構築の手順:

  1. モニタリング実行サーバの選定

    • アプリケーションサーバ上で実行するのが望ましい(ネットワーク問題も検知できる)。

    • 今回はDBサーバ上で実行。

  2. ディレクトリ作成 → 初期チェック作成

    • SQL*Plus を使って DB 接続確認。

    • dual テーブルから "Success" を返すSQLを使い、結果に "Success" が含まれていれば接続成功。

  3. 接続情報を変数化

    • ユーザー名、パスワード、ホスト、ポート、サービス名などを変数で定義。

  4. スクリプトのログ出力整備

    • ログに日時、サーバー名、サービス名などを出力する logging 関数を作成。

  5. 追加チェック:ブロックセッション確認

    • セッションのブロッキング状態を確認するSQLを追加。

    • アプリケーションユーザーでは参照できず、DBSNMPユーザーを解錠して使用。

    • DBSNMPユーザーはデフォルトでロックされているため、アンロックが必要。

  6. SQLのループ処理化

    • チェックするSQL文をリスト化し、forループで実行。

    • 新しいSQLを追加したい場合はリストに追加するだけで済む。

  7. 異常検知のロジック

    • 接続チェックの結果に "Success" がなければエラー。

    • 他のチェックは、出力があればエラー、なければ正常。

    • エラー時にはログに ERROR を付け、後続で通知(SlackやPagerDuty、メールなど)するよう実装予定。

  8. 最後にテスト実行と修正

    • continue ステートメントで正しくループを制御。

    • 接続チェック、セッションチェック、バックアップ日付チェックなどを含む4つの項目を確認。

    • バックアップが45日前であり、エラーとして検出される。

🔧 Gmail SMTPを使ったメール通知機能の構築と統合(要約)

📌 目的

  • 自作のDB監視スクリプトに、問題検出時のメール通知機能を追加。

  • GmailのSMTPリレーを使って、安全にメール送信する仕組みを構築。


📨 Gmail SMTPリレーの設定手順

  1. Postfixのインストール

    • メール送信に使用するMTA(Mail Transfer Agent)としてpostfixをインストール。

    • 起動時に自動起動するよう設定。

  2. Postfix設定の変更

    • GmailのSMTPサーバ(smtp.gmail.com:587など)をリレー先として指定。

    • Gmailアカウントの認証情報を/etc/postfix/sasl_passwdファイルに保存。

  3. セキュリティ設定

    • 認証情報ファイルのパーミッションを厳しく(600など)制限。

    • postmapコマンドでハッシュ化ファイルを作成。

    • Postfixを再起動して設定を反映。

  4. Gmail側の設定

    • アカウントで「安全性の低いアプリのアクセス」を有効にしておく(必要に応じてアプリパスワード使用)。

  5. メール送信テスト

    • mailコマンド等でテストメールを送信。

    • エラーが出る場合は、設定ファイルの重複箇所などを修正。


💻 監視スクリプトとの統合

  1. メール送信関数 send_email() を作成

    • 引数に「件名」「宛先」「本文」を取り、Postfix経由でメール送信。

  2. 環境変数の設定

    • スクリプト内でORACLE_HOMEPATHを明示的に設定(再ログイン時のエラー防止)。

  3. エラー検出時にメール送信

    • 例:バックアップの問題が検出されたら即座に通知メールを送信。


🖥 OSレベルのチェック追加

  • ディスク使用率チェック(85%超でアラート)

  • **ロードアベレージ(平均負荷)**チェック(プロセスが多すぎるとアラート)


🚫 同時実行防止処理の追加

  • スクリプト実行時にロックファイルを作成。

  • ロックファイルが存在する場合は異常とみなして即終了&通知。


⏰ スケジューリング(Cronの設定)

  • 監視スクリプトを 5分ごとに実行。

  • ログファイルに毎回結果を追記(logs/yyyy-mm-dd.logの形式)。

  • 実行結果に問題があれば、その都度メール通知


📌 最後に:追加課題(推奨)

  • 各組織によって必要なチェック項目が異なるため、

    • 他の監視SQL(例:遅いクエリ検知、表領域の空き容量、無効インデックスなど)を調査し、スクリプトに追加することが推奨されている。

🧭 Oracle Enterprise Manager Express(EM Express)の概要と接続方法

🔍 EM Expressとは?

  • Oracleデータベースの管理ツール

  • 以前はFlashベースだったが、Flash終了に伴い利用できなくなった。

  • Oracle 19c以降ではJavaベースに移行。

  • 現時点(19c)では、利用できる機能は限定的(Performanceタブのみ)
     → ユーザー管理・メモリ・ストレージ管理は非対応。


🌐 接続に必要な準備

🔹 CDBへの接続

  1. DBMS_XDB_CONFIG パッケージを使って、CDBのHTTPSポート番号を確認。

    • DBMS_XDB_CONFIG.GETHTTPSPORT() → 例:5500 を返す。

  2. URL形式: https://<IPアドレス>:<ポート番号>/em

  3. CDBに接続する際は、コンテナ名の指定は不要

  4. 成功すると、PerformanceタブStorageタブが表示される。

    • Storageタブでは、CDBの表領域(Tablespace)情報が閲覧可能。

🔹 PDBへの接続

  1. GETHTTPSPORT() ではPDBのポート番号は取得できない

  2. SETHTTPSPORT() を使用して手動でポートを設定(例:5502)。

  3. 再度 GETHTTPSPORT() で確認すると、設定したポート番号が返る。

  4. 接続URLにPDBのポート番号を使い、CISユーザーなどの資格情報でログイン可能。


📘 レッスン概要:データベースにワークロード(負荷)をかける方法

🔽 1. 必要なスクリプトのダウンロードと準備

  • Oracle Learning Library から ワークロード用のスクリプトをダウンロード&解凍

  • setup_workload.sql を実行するよう記載があるが、その中身を事前に確認

    • setup_workload.sql は以下のスクリプトを実行:

      • unlock_accounts.sql:HR/OE/SHユーザーのロック解除とパスワード設定

      • setup_order.sql:注文処理用のスキーマ(Order Entry)のオブジェクト作成


🛠 2. サンプルスキーマのインストール(Order Entry / Sales History)

🔹 手順

  1. Oracleの提供する サンプルスキーマ(Order Entry, Sales History)を準備

  2. スクリプト内のパスを自環境のものに変える必要があるため、Perlコマンドを使って一括置換

    • 特定の文字列(__SUB__CWD__)を実際のディレクトリパスに変換。

  3. PDB1 に接続し、インストールスクリプトを実行(順番に実行)。

    • 実行時には質問(インストール場所や表領域名など)に回答。

    • エラーがないことを確認。


▶️ 3. 負荷(ワークロード)生成スクリプトの実行

🔹 setup_workload.sql

  • 必要なユーザー(OEなど)やオブジェクトを用意するスクリプト。

  • 引数:

    1. ユーザー名(例:OE)

    2. パスワード

    3. サービス名

    4. サーバーIPアドレス

🔹 start_workload.sh

  • 実際にデータベースに対して操作(INSERT/UPDATE/DELETE)を並列実行するスクリプト。

  • insert_orders.sql などのスクリプトを繰り返し呼び出して負荷を生成。

  • 接続方法:完全な接続文字列(ホスト、ポート、サービス名)を指定する必要あり。

  • Load Factor により負荷のレベル(同時実行数)を設定可能。

🔹 モニタリング

  • 別ターミナルで top コマンドを使って、Oracleプロセスが増加し、負荷がかかっている様子を確認可能。


📌 補足

  • 各スクリプトの内容(特にPL/SQLコード)は学習目的でも一度目を通すと理解が深まる

  • 接続エラー防止のために、接続方法(TNS形式)や環境変数の確認を忘れずに。


🔍 Oracle Enterprise Manager Express を使用して、PDB負荷状況を可視化・分析


📊 主な機能と操作方法

  • Performance Hub メニューから、過去1時間のリアルタイムデータを確認可能。

  • 時間スライダーを使って、関心のある期間を指定可能。

  • Active Session History(ASH)チャートで、セッションごとの待機イベントやCPU使用状況を視覚的に確認。

  • ユーザーごとの負荷を確認するため、Weight Class ➝ Session Identifier ➝ Username でフィルタ設定可能。

  • ユーザーの負荷内容を Concurrency(同時実行)や Scheduler(スケジューラ) などで分類。


🧠 詳細分析機能

  • Top Dimensions ➝ Module を使って、ユーザーが実行していた処理単位(モジュール)を特定可能。

  • Workloadタブでは以下の情報が確認できる:

    • CPU統計

    • 待機時間統計

    • Workload Profile(例:Parse Callsなど)

    • セッション情報(例:Open Cursors)

  • Active Session History Analyticsでは、実行中のSQLに関する詳細を表示:

    • SQL ID をクリックすると、SQLのテキスト、実行時間、IO量、リクエスト数などを確認可能。


💡 ポイント

  • フィルタや統計項目の切り替えにより、特定ユーザーや処理に絞った分析が可能。

  • 実データを用いたトラブルシューティングやパフォーマンス監視に活用できる。

  • 分からない項目は調査しながら操作を習得するのが望ましい。





🔍 AWR(自動ワークロードリポジトリ)とは?

Oracleデータベースが内部で収集・保持する統計情報のデータウェアハウスであり、パフォーマンス問題の検出や自己チューニングに利用されます。


🛠️ AWRレポートの作成手順

  1. awrrpt.sqlスクリプトの実行:
    Oracle Home 配下の rdbms/admin ディレクトリにあるスクリプトを使う。

  2. レポート形式の選択:
    HTML形式(デフォルト)またはTEXT形式を選べる。

  3. スナップショット期間の指定:
    デフォルトでは60分ごとにスナップショット(統計情報)が自動取得され、最大8日間保存。開始スナップショットIDと終了スナップショットIDを指定。

  4. レポート名の入力:
    指定した名前でカレントディレクトリに保存される。

  5. ローカルにコピーしてHTMLレポートを閲覧。


📈 AWRレポートの内容と利点

  • 基本情報: DB名、バージョン、起動時間、コンテナ情報など。

  • 解析期間中の負荷状況: CPU不足、I/Oリソースの待機などが確認可能。

  • 待機イベント: サーバープロセスがどのイベントで待機していたかの統計情報。性能問題の「兆候」として利用できる(ただし原因ではない)。

  • イベントの分類: 待機イベントは「Wait Class」でグループ化される。


🔍 特に注目すべき情報

  • Top Foreground Events by Wait Time: 最も多くの待機時間を要したイベント。

  • Top SQL by Elapsed Time: 実行時間が長いSQLの特定に役立つ。

  • プロセスタイプ別の統計: 負荷のかかっているプロセスの分類が確認可能。


前の記事(Oracle Databaseのパッチ適用)