Oracle gv$ビューとは?v$ビューとの違いとRAC環境での活用

Oracle Master Gold

Oracle Databaseの運用管理やパフォーマンス分析において、v$session などの動的パフォーマンスビューの活用は欠かせません。しかし、複数インスタンスで構成されるOracle RAC環境では、接続先ノードの情報を見るだけではシステム全体の正確な状況を把握できません。

本記事では、複数インスタンスの情報を一元管理できるgv$ビュー(グローバル動的パフォーマンスビュー)について、各インスタンスのv$ビューとの決定的な違い、内部構造、実務で即座に使えるSQL実行例まで初心者にも分かりやすく解説します。

Oracle Restartとは?単一インスタンス環境における高可用性構成とその全貌
Oracle Restartは、Oracle Databaseを単一ノード環境で運用する際に、データベースやリスナー、ASM(Automatic Storage Management)などの重要なコンポーネントを自動的に起動・監視・復旧させ…

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


1. 結論・最短手順(クラスタ全体の状況を把握するリスト)

Oracle RAC(Real Application Clusters)環境において、全インスタンスの稼働状況やセッション情報を一括で確認・分析するための最短手順は以下の通りです。

  1. システム特権の確認SYSDBA特権やSELECT_CATALOG_ROLEロールなど、動的パフォーマンスビューへの参照権限を持つユーザーでデータベースに接続します。
  2. 接続先コンテキストの確認:マルチテナント環境(CDB/PDB)では、原則としてCDBルート(CDB$ROOT)に接続します。
  3. INST_ID列の活用:SQLのSELECT句やWHERE句に必ずINST_ID(インスタンスID)を含め、抽出データがどのノードのものかを識別します。
  4. 特定インスタンスのフィルタリング:必要に応じてWHERE inst_id = 1のように条件を指定し、調査対象ノードを絞り込みます。

2. 背景と基礎:gv$ビューとは?

gv$ビューの定義

gv$ビュー(Global V$ View)とは、Oracle RAC環境において、クラスタを構成するすべてのインスタンスの動的パフォーマンス情報を一括して取得できる特別なビューです。

v$ビューとの決定的な違い

通常のv$ビューは、現在セッションが接続しているインスタンス内部の情報しか参照できません。これに対して、gv$ビューはすべてのインスタンスのv$ビューに相当する情報をベースに、それらを束ねて1つのグローバルなビューとして提供します。

初学者向け一口メモ

「各インスタンスに順番にログインしてv$ビューを見れば同じでは?」と考えるかもしれません。しかし、それでは一時的に発生しているロック競合や高負荷SQLをリアルタイムに突き合わせることが困難です。gv$ビューは、データベース内部のパラレル・クエリ機構を利用して、全ノードから同時に情報を集約するため、時間差のない正確な全体像を一度に把握できます。

3. gv$ビューの構造(テキスト図解)

gv$ビューは、各インスタンスに存在する個々の動的パフォーマンス情報を内部的に集約し、共通の列に加えてINST_ID(インスタンス識別子)という列を追加した構造を持っています。

 ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
 │  Instance 1  │     │  Instance 2  │ ... │  Instance N  │
 │ (v$session)  │     │ (v$session)  │     │ (v$session)  │
 └──────┬───────┘     └──────┬───────┘     └──────┬───────┘
        │                    │                    │
        ▼                    ▼                    ▼
 ┌────────────────────────────────────────────────────────┐
 │                 gv$session (統合ビュー)                 │
 │  ※自動的に INST_ID 列が追加され、ノードを識別可能       │
 └────────────────────────────────────────────────────────┘

各インスタンスでv$ビューを見る方法との比較

評価項目各インスタンスでv$ビューを個別参照gv$ビューを一括参照
アクセス方法インスタンスの数だけ個別に接続・切断が必要1回の接続、1本のSQLで全ノードにアクセス可能
データの同時性取得タイミングにズレが生じる(不正確)クラスタ全体から同時に最新情報を集約(正確)
集計作業表計算ソフト等で手動マージが必要GROUP BYORDER BYでSQLによる自動集約が可能
インスタンス識別出力結果自体にインスタンスIDが含まれないINST_ID 列によって一目で判別可能

4. 手順・実装:gv$ビューの利用手順

gv$ビューを実務で安全かつ効果的に利用するための手順です。

  1. 事前準備(権限と環境の確認)動的パフォーマンスビューを参照するため、十分な権限を持ったユーザー(SYSSYSTEM、または監視用ロール付与ユーザー)でログインします。
  2. 接続先の切り替え(マルチテナント環境の場合)CDB/PDB構成を採用している場合、PDBに接続した状態でgv$ビューを検索すると、原則として「そのPDBがオープンしているインスタンス」の情報のみが対象となります。クラスタ全体の物理構造やセッション全体を俯瞰する場合は、必ずCDBルートに接続してください。
  3. SQLの組み立て情報を識別しやすくするため、出力項目(SELECT句)の先頭に必ずINST_IDを指定します。

5. 実行例:よく使うgv$ビューとSQLスニペット

実機でのトラブルシューティングや定期監視でそのまま利用できる、具体的なSQL実行例です。

前提条件

  • 対象バージョン:Oracle Database 19c (CDB/PDB構成)
  • 実行スキーマSYSSYSDBA権限で接続)
  • 対象OS:Oracle Linux 7.9 / 8.x (RAC構成)
  • 注意点:環境依存を防ぐため、SQL文中にマルチバイト文字(日本語コメントなど)は含めていません。

① インスタンス一覧と稼働ステータスの取得

クラスタを構成するすべてのインスタンスの名前、ホスト名、および起動状態を一覧表示します。

次のSQL文を実行して、クラスタ全体の基本的な稼働状態を確認します。

SELECT inst_id, instance_name, host_name, version, status
FROM gv$instance
ORDER BY inst_id;

SQLの意図と結果:

このSQLは、すべてのノードの基本ステータスをインスタンスID順に並べ替えて取得します。特定のノードがダウンしているか、あるいはMOUNTED状態にとどまっているかを即座に判別できます。

② 全インスタンスのアクティブセッション確認

クラスタ全体で、現在リソースを消費して処理を実行している(ACTIVEな)ユーザーセッションを抽出します。背景プロセス(BACKGROUND)は除外し、一般ユーザーのみを対象とします。

次のSQL文を実行して、現在システムに負荷をかけているアクティブセッションを特定します。

SELECT inst_id, sid, serial#, username, status, program
FROM gv$session
WHERE username IS NOT NULL
  AND status = 'ACTIVE'
ORDER BY inst_id, sid;

SQLの意図と結果:

ノードをまたいで実行されているアプリケーションセッションの分布を確認できます。特定のノードだけにアクティブセッションが集中しているといった、ロードバランスの偏りを発見するのに役立ちます。

③ クラスタ全体のロック競合(待機状態)の検出

他セッションの処理をブロックしているセッション(block = 1)や、ロックの獲得を待たされているセッション(request > 0)をクラスタ全体から検出します。

次のSQL文を実行して、複数インスタンス間で発生している行ロックやテーブルロックの競合を調査します。

SELECT inst_id, sid, type, lmode, request, block
FROM gv$lock
WHERE block = 1 OR request > 0
ORDER BY inst_id, sid;

SQLの意図と結果:

RAC環境では、インスタンス1のセッションが、インスタンス2のセッションをブロックすることがあります(グローバル・ロック・ブロッキング)。このSQLにより、ノードの壁を越えたデッドロックや長時間のロック待機を突き止められます。

6. トラブルシューティング

gv$ビューの検索時に発生しやすい代表的なエラーと、その原因および対処法です。データの更新や削除を伴う操作ではないため、システムへの影響を最小限に抑えながら調査できます。

ORAエラーコード発生原因確認方法・対処手順
ORA-00942: table or view does not exist実行ユーザーにgv$ビューへの参照権限が不足している。SYSユーザー等で GRANT SELECT ON gv_$session TO username; を実行して権限を付与する(ビュー名にアンダースコアが入る点に注意)。
ORA-12850: Could not allocate slaves on all specified instances特定のノードがハングアップしている、またはネットワーク(インターコネクト)に問題があり、他ノードの情報が収集できない。まず自ノードのv$ビューを検索して単体で動作するか確認する。その後、Oracle Clusterwareのステータス(crsctl stat res -t)等でノード間の通信状態を確認する。

7. 運用・監視・セキュリティ上の注意

メリットと運用の落とし穴

  • メリット:集中管理コンソールがなくても、任意のノードからSQLを1回実行するだけでクラスタ全体の健康状態を把握できます。
  • パフォーマンス上の注意(落とし穴):gv$ビューは内部的に、全インスタンスに対してパラレル・クエリを発行してデータをかき集めています。そのため、システム高負荷時(インターコネクトの帯域が逼迫しているときなど)に、gv$ビューを極端に短いインターバルで大量に連発すると、監視処理自体がデータベースの負荷を悪化させる原因になり得ます。
  • 回避策・戻し方:特定のノードに障害が絞り込めている場合は、gv$ビューではなく、条件を絞るか、あるいはそのノードへ直接接続して通常のv$ビューを参照するように切り替えてください。

シングル・インスタンス(スタンドアロン)環境での挙動

RACを構成していない単一のインスタンス環境でも、gv$ビューは問題なく使用可能です。この場合、内部的なノード間通信は発生せず、取得できるデータの `INST_ID` 列にはすべて `1` が入ります。 将来的にRAC構成への移行やスケールアウトが予定されているシステムでは、最初から運用のスクリプト(監視シェルなど)にgv$ビューを採用しておくことで、移行時の手直しを減らすことができます。

8. FAQ:よくある質問

Q. gv$ビューを検索すると、裏ではどのような仕組みが動いているのですか?

A. gv$ビューにアクセスすると、Oracle Databaseは内部的にパラレル・クエリの仕組みを使用します。実行したノードがコーディネータとなり、他のアクティブな全インスタンスに対して特殊なバックグラウンド・プロセスを介してデータを要求し、それらを自ノードに集約してユーザーに結果を返します。

Q. gv$ビューに対応するベースのテーブルや、元となる定義はどこで見られますか?

A. gv$ビューの実体は、固定表と呼ばれるメモリ上の構造体(X$表)です。例えば gv$sessionX$KSUSE などの固定表を基に構成されています。ビューの具体的な定義は、v$fixed_view_definition ビューを検索することで確認できます。

Q. 一般ユーザーにgv$ビューの参照権限を付与する際、注意点はありますか?

A. 動的パフォーマンスビューの権限を付与する場合、ベースとなるオブジェクト名に注意が必要です。GRANT SELECT ON gv$session TO username; と記述するとエラーになります。シノニムの元である gv_$session(vの後にアンダースコアがあるオブジェクト)を指定して、GRANT SELECT ON gv_$session TO username; のように実行してください。

Q. PDB(プラガブル・データベース)に接続した状態で gv$session を見ると、他のPDBのセッションも見えてしまいますか?

A. いいえ。PDB環境にローカルユーザー等で接続してgv$ビューを参照した場合、データは自動的にそのPDB内部の情報だけにフィルタリングされます(ただし、インスタンスは全ノード分が対象)。コンテナ全体(他のPDBも含めた全セッション)を俯瞰したい場合は、共通ユーザーを使用してCDBルート(CDB$ROOT)に接続した上でSQLを実行してください。

9. まとめ:要点チェックリスト

  • gv$ビュー(グローバル動的パフォーマンスビュー)は、Oracle RAC環境において、全インスタンスの動的情報を一元的に取得できる仕組みである。
  • 通常のv$ビューとの最大の違いは、データがどのインスタンスのものかを示すINST_ID 列が保持されている点である。
  • 内部的にパラレル・クエリを駆使して全ノードからリアルタイムに情報を集約するため、時間差のない正確なクロスノード分析(ノードをまたぐロック競合の調査など)が可能。
  • シングル・インスタンス(スタンドアロン)環境で実行した場合は、エラーにならず INST_ID = 1 として動作する。
  • 全ノードから情報を集める特性上、システム超高負荷時に高頻度でクエリを乱発するとインターコネクト(ノード間通信)のオーバーヘッドとなるため、監視の頻度には配慮が必要。

本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。


[参考]
Oracle RACの概要

Oracle RAC(Real Application Clusters) とは?仕組みとメリットを初心者向けに解説
「データベースが止まらない」仕組みとして Oracle RAC に興味をお持ちですか?RAC は複数サーバーで単一DBを稼働させ、可用性と拡張性を高める技術です。この記事では、RAC の基本的な仕組み、メリット、そして自分が接続している環境…
Oracle SQLチューニングの基本Oracle SQLチューニング最短ガイド:実行計画・統計・トレース【19c】Oracle SQLチューニングの基本
本記事は、既存記事「Oracle SQLチューニングの基本」の内容を、より実務寄り・再現可能な形に再構成したリライト版です。元記事の主旨(実務で使えるSQLチューニングの要点)を保ちつつ、最短手順・再現用スクリプト・トラブル対処を強化しまし…

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました