4

開発中に、データベースには次のような多数の有効な接続があることがわかりました。

SELECT username, COUNT(*) FROM v$session GROUP BY username;

実際に接続している人を見つけるために、IPアドレスのリストを取得したいと思います。

一般的なウェブ検索と公式ドキュメントの閲覧中に、私はクエリを作成します。

SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name
  FROM v$session
  WHERE type = 'USER';

machineの最も重要な部分はどこですかselect。ただし、残念ながら、machineフィールドにはクライアントOSが認識しているホスト名が表示されます。

私の場合には当てはまらないUTL_INADDR.GET_HOST_ADDRESSを使用することをお勧めするインターネット。第一に、ORA-24247が原因です。ネットワークアクセスがアクセス制御リスト(ACL)によって拒否され、第二に、クライアントOSのホスト名が通常/ etc / hostnameで定義され、イントラネットのDNSサーバーで使用できないためです。

Oracle DBへのオープンセッションのIPを取得するその他の方法(DBインスタンスはどのような場合でもそのソケットに関する情報を保持します...)。

アップデート

私は信頼できるイントラネットの下にありますが、ネットワーク階層は不明です。

そして、どのアプリケーションが自分のテーブルを使用しているかを見つけようとします(いくつかのアプリサーバー、すべてを知っているわけではありません)。それらのいくつかは接続を使いすぎており、修正する必要があります。しかし、最初にそれらを特定する必要があります...

4

4 に答える 4

4

Oracleセッションは、元のクライアント名/ IPアドレスを知る必要はなく、確かに信頼する必要もないことに注意してください。それはネットワークトランスポート層の上にあり、TCP/IPまたは他の何かを介して接続されているかどうかは実際には気にしません。(リスナーが情報を渡す必要があるのか​​、それとも既製のソケットを効果的に渡すのかさえわかりません)。ご覧のとおり、ビュー内の他のフィールドのmachineように、クライアントが宣言したものです。特にクライアントがWindowsボックスの場合は、DNSまたはサーバーが解決できるものとはまったく似ていない可能性があります。programv$session/etc/hosts

あなたができることは、Unix / Linuxレベルで(/ etc / hostsを参照しているので、Windowsを使用していないと思います)、を探して、port表示されるアドレスを確認します。たとえばv$session、私はportとして表示される50527ので、表示すると次のようnetstat -an | grep 50527に表示されます。

tcp  0  0  192.168.1.1:1521  192.168.1.23:50527  ESTABLISHED

だから私はから接続していることがわかります192.168.1.23。サーバー上でSQL*Plusを実行している場合は、hostコマンドを使用してこれを実行できますが、それでも少し不便です。これを定期的に行う必要があり、それを監査テーブルにキャプチャするためのログオントリガーを追加することはオプションではなく、データベース内から実際に行う必要がある場合は、Javaストアドプロシージャを記述して、あなたのためのそのポート。ただし、シェルスクリプトを記述して、portからの数値をクエリv$sessionし、その方法でルックアップを実行する方がおそらく簡単です。

于 2013-02-25T17:13:10.710 に答える
2

通常、着信接続の IP アドレスはリスナー ログで確認できます。それが、必要なときにそのような情報を追跡する方法です。

于 2013-03-22T18:36:15.187 に答える
2

私の質問を掘り下げてくれてありがとう(これはまだ一般的な目的であり、正確には私のものではありません!!)。

簡単な答え: Oracle システム テーブルから実際の IP を取得することはできません。

netstatこのタスクでは、またはのような汎用ユーティリティを使用できますが、サーバー側lsof -p <pid-of-oracle>でのみ使用できます。

いくつかの助けはv$session.port価値観から来ることができます...

ヘルパーからの 1 つの良い提案 - DB クライアントからの適切な名前を使用してください。それらはv$session表の行に取り込まれます。

machine, terminal, program, module, service_name

クライアントを特定するのに役立ちます...

于 2013-02-25T19:24:47.550 に答える