web-dev-qa-db-ja.com

Oracleデータベースに送信されるすべてのクエリを表示する

データベースに送られるすべてのクエリを確認する必要があります。どうやってするか? Google検索で適切な結果が得られませんでした。

20
user1186971

有効 SQLトレース &データベースに送られるすべてのクエリがログに記録されます。

ALTER SESSION SET sql_trace = true;
ALTER SESSION SET tracefile_identifier = mysqltrace;

トレースファイルはudumpディレクトリにあります。

データベースを監査する場合は、 以前の回答を参照してください。

13
Sathyajith Bhat

時間の短いウィンドウですべてのセッションからのすべてのクエリを表示する必要があり、本当に簡単な解決策が必要な場合は、これを実行します。 (上記の回答は、SQLが1つのセッションで実行されていることのみを示しています。これにより、すべてのセッションにわたってすべてのSQLが簡単に得られます。)

1)。取得したすべてのSQLを格納する一時テーブルを作成します。

-- Fabien pointed out out that 'port may be inaccessible on 10.2 
       CREATE TABLE "MIKE"."TMP" 
       (    "LOOP_NO" NUMBER(10,0), 
        "SID" NUMBER, 
        "SERIAL#" NUMBER, 
        "PROCESS" VARCHAR2(24 BYTE), 
        "PROGRAM" VARCHAR2(48 BYTE), 
        "MODULE" VARCHAR2(64 BYTE), 
        "OSUSER" VARCHAR2(30 BYTE), 
        "SCHEMANAME" VARCHAR2(30 BYTE), 
        "ACTION" VARCHAR2(64 BYTE), 
        "MACHINE" VARCHAR2(64 BYTE), 
        "PORT" NUMBER, 
        "TERMINAL" VARCHAR2(30 BYTE), 
        "ADDRESS" RAW(8), 
        "PIECE" NUMBER, 
        "SQL_TEXT" VARCHAR2(4000)
       )

2)。ブロックが実行されている限り、匿名ブロックで厄介なポーリングループを実行して、システムで実行されたすべてのSQLを収集します。

declare
begin 
  for j in 1.. 1000 loop 

     insert into  mike.tmp
     SELECT j, b.sid, b.serial#, b.process, b.program, b.module, b.osuser, b.schemaname, b.action, b.machine, b.port, b.terminal,a.address,  a.piece, a.sql_text
            FROM V$sqltext_With_Newlines a
            join V$Session b  on a.address = b.sql_address
           WHERE A.ADDRESS NOT IN (select address FROM mike.tmp)
        ORDER BY b.sid, a.piece;

    commit;

  end loop;
end;

3)。 SQLを取得するクエリ:

select distinct osuser, a.address, a.sid, a.piece, a.sql_text 
          from mike.tmp a
          join (select loop_no, sid from mike.tmp where sql_text like '%anytexthere%') b 
            on a.loop_no = b.loop_no
           and a.sid = b.sid 
           order by a.sid, a.address, a.piece

...これは「ここで何が起こっているのか」にいるときにSQLをトラップするための簡単な方法にすぎないことに注意してください。状況、およびGUIツールがありません。

7
mike

ここでWindowsでXEを実行すると、ユーザーが何をしているかを見つけることができます。 SQLPlusを起動して実行します。

> SELECT USERNAME, SID, SERIAL# FROM v$session WHERE userName = '<your user>'

これにより、ユーザーのSIDとSERIAL#の2つの整数値が取得されます。ユーザーが複数のセッションを開いている可能性があります。これを実行してロギングをオンにします。

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, true)

次に、アプリでいくつかの作業を行います...データがどこに使用されたかを調べます。

> SHOW PARAMETERS user_dump_dest

そして、C:\ oraclexe\app\Oracle\diag\rdbms\xe\xe\traceのようなものを取得します。ここには、多数のトレースログがあります。 .trcファイルは単にテキストです

完了したら、ログをオフにして、ファイルがいっぱいになったり、データベースの速度が低下したりしないようにします。

> execute dbms_system.set_sql_trace_in_session(<SID>, <SERIAL#>, false)

よろしくお願いします-診断とリバースエンジニアリングを楽​​しんでください!

6
Daniel Williams