programing

Oracle 데이터베이스에 오는 모든 쿼리 표시

megabox 2023. 7. 13. 20:46
반응형

Oracle 데이터베이스에 오는 모든 쿼리 표시

데이터베이스로 오는 모든 쿼리를 확인해야 합니다.어떻게 하는 거지?저는 구글 검색에서 적절한 결과를 얻을 수 없었습니다.

SQL 추적을 활성화하면 데이터베이스로 오는 모든 쿼리가 기록됩니다.

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

추적 파일이 udump 디렉토리에 있습니다.

데이터베이스를 감사하려면 이전 답변을 참조하십시오.

짧은 시간 동안 모든 세션의 모든 쿼리를 확인해야 하고 정말 간단한 솔루션이 필요한 경우 이렇게 합니다. (위의 답변은 SQL이 한 세션에서만 실행된다는 것을 보여줍니다. 그러면 모든 세션에 걸쳐 모든 SQL이 쉽게 제공됩니다.)

. 검색된 모든 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), 
        "TERMINAL" VARCHAR2(30 BYTE), 
        "ADDRESS" RAW(8), 
        "PIECE" NUMBER, 
        "SQL_TEXT" VARCHAR2(4000)
       )

. 익명 블록에서 악성 폴링 루프를 실행하여 블록이 실행되는 동안 시스템에서 실행되는 모든 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.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;

. 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

이 방법은 "여기서 무슨 일이 일어나고 있습니까?" 상황에서 GUI 도구가 없고 파일에 액세스할 수 없는 경우 SQL을 트랩할 수 있는 빠른 방법입니다.USER_DUMP_DEST.

여기서 Windows에서 XE를 실행하면 사용자가 수행하는 작업을 찾을 수 있습니다.SQL Plus를 시작하고 다음을 실행합니다.

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

그러면 사용자에 대한 SID 및 SERIAL#의 두 정수 값이 표시됩니다.사용자의 세션이 두 개 이상 열려 있을 수 있습니다.로깅을 설정하려면 다음을 실행합니다.

> 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 파일은 단순히 텍스트입니다.

작업이 완료되면 파일이 가득 차거나 DB 속도가 느려지지 않도록 로깅을 해제합니다.

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

좋아요 - 행복한 진단과 리버스 엔지니어링!

언급URL : https://stackoverflow.com/questions/9125223/show-all-queries-coming-to-an-oracle-database

반응형