------------------------------------------------------------------------------------------------------------------------
-- ASH 버퍼 저장된 세션 히스토리 정보를 이용한 특정 시간대 수행 퀴리 확인하기(v$active_session_history)    
------------------------------------------------------------------------------------------------------------------------
/*
line  2     샘플링이 일어난 시간과 샘플 ID
line  3     세션정보, User 명, 트랜잭션 ID
line  4     수행중 SQL 정보
line  5     현재 세션의 상태 정보, 'ON CPU' 또는 'WAITING'
line  6     병렬 Slave 세션일 때, 쿼리 코디네이터(QC) 정보를 찾을 수 있게 함
line  7, 8  현재 세션의 진행을 막고 있는(blocking) 세션 정보
line  9     현재 발생 중인 대기 이벤트 정보
line 10     현재 발생 중인 대기 이벤트의 파라미터 정보
line 11     해당 세션이 현재 참조하고 있는 오브젝트 정보. v$session 뷰의 컬럼
line 12     애플리케이션 정보
☞ line 7~11의 정보가 매용 유용, 블로킹 세션 정보를 통해 현재 Lock 발생 시킨 세션을 찾음
*/
select 
      sample_id, sample_time
    , session_id, session_serial#, user_id, xid
    , sql_child_number, sql_plan_hash_value
    , session_state
    , qc_instance_id, qc_session_id
    , blocking_session, blocking_session_serial#, blocking_session_status
    , event, event#, seq#, wait_class, wait_time, time_waited
    , p1text, p1, p2text, p2, p3text, p3
    , current_obj#, current_file#, current_block# -- -40016382 
    , program, module, action, client_id
    , sql_text
from v$active_session_history sh, -- dba_hist_active_sess_history  참조
     dba_hist_sqltext hs
where sh.sql_id = hs.sql_id 
and sample_id between 135436538 and 135438470;
--and sample_time 
--between to_timestamp('2020/07/29 04:10:00','yyyy/mm/dd hh24:mi:ss')
--and to_timestamp('2020/07/29 04:25:00','yyyy/mm/dd hh24:mi:ss');

 

======================================================================================
#. 특정 세션의 순차적 수행 분석
-======================================================================================

select *
from (
  select 
    h.session_id as sid,
    to_char(h.sample_time,'mi:ss') as sample_time,
    h.sql_id,
    (select sql_text from v$sqlarea a where a.sql_id = h.sql_id) as sql_text,
    event,
    blocking_session as blocker
  from
    v$active_session_history h
  where
    h.session_id = &sid
  order by h.sample_time desc
) where rownum <= 20
;

 

======================================================================================
#. 10초전~현재까지 ASH 리포트 생성
-======================================================================================

col db_id new_value db_id;
col inst_num new_value inst_num;

select dbid as db_id from v$database;

     DB_ID
----------
3588319577

select instance_number as inst_num from v$instance;

  INST_NUM
----------
         1

select * from table(
  dbms_workload_repository.ash_report_text(
    &db_id,
    &inst_num,
    sysdate - 10/24/60/60,
    sysdate
  ));

 

 

 

======================================================================================
#. Blocking Lock Session 확인
======================================================================================
SELECT    B.BLOCKING_SESSION AS BLOCKING_SESSION_SID
         ,C.SID AS LOCK_SESSION_SID
         ,C.OWNER AS OBJECT_OWNER
         ,C.OBJECT AS OBJECT
         ,B.LOCKWAIT
         ,A.PIECE
         ,A.SQL_TEXT AS SQL
FROM      V$SQLTEXT A
         ,V$SESSION B
         ,V$ACCESS C
WHERE     A.ADDRESS = B.SQL_ADDRESS
AND       A.HASH_VALUE = B.SQL_HASH_VALUE
AND       B.SID = C.SID
AND       B.BLOCKING_SESSION IS NOT NULL
AND       C.OWNER NOT IN ('SYS', 'PUBLIC')
AND       C.OBJECT NOT IN ('TOAD_PLAN_TABLE')
ORDER BY  A.PIECE;

 


--======================================================================================
--#. 현재 세션에서 10초이상 걸리는 쿼리 조회 (SELECT절)
--======================================================================================
 
SELECT    ABS(SYSDATE - A.LAST_LOAD_TIME) * 24 * 60 * 60 AS SEC_TIEM, A.*
FROM      V$SQLAREA A
         ,V$SESSION B
WHERE     A.SQL_TEXT LIKE '%SELECT%'
AND       A.ADDRESS = B.SQL_ADDRESS
AND       B.STATUS = 'ACTIVE'
AND       A.ELAPSED_TIME >= 10 * 1000000 -- 실행계획에서 10초 이상 걸리는 쿼리를 조회(실제 걸리는 시간은 아님.)
AND       A.PARSING_SCHEMA_NAME NOT IN ('SYS', 'SYSTEM', 'SYSMAN')
AND       B.USERNAME IS NOT NULL;
 
--======================================================================================
--#. 현재 세션에서 PGA, UGA, CPU 사용량 세션별로 조회하는 쿼리
--======================================================================================
 
SELECT    B.USERNAME
         ,A.SID
         ,A.PGA_USAGE
         ,A.UGA_USAGE
         ,A.CPU_USAGE_SECONDS
         ,B.MACHINE
         ,B.PROGRAM
         ,B.MODULE
FROM      (SELECT    B.SID
                    ,MAX(DECODE(C.NAME, 'session pga memory', TRUNC(B.VALUE / 1024 / 1024) || 'MB', 0)) AS PGA_USAGE
                    ,MAX(DECODE(C.NAME, 'session uga memory', TRUNC(B.VALUE / 1024 / 1024) || 'MB', 0)) AS UGA_USAGE
                    ,MAX(DECODE(C.NAME, 'CPU used by this session', (B.VALUE / 100) || ' Sec', 0)) AS CPU_USAGE_SECONDS
           FROM      V$SESSTAT B
                    ,V$STATNAME C
           WHERE     B.STATISTIC# = C.STATISTIC#
           GROUP BY  B.SID) A
         ,V$SESSION B
WHERE     B.SID = A.SID
AND       B.STATUS = 'ACTIVE'
AND       B.USERNAME IS NOT NULL;

-----------------------------------------------------------------------------------------------------------------------
-- 현재 접속된 세션수
------------------------------------------------------------------------------------------------------------------------
SELECT  inst_id, Count(*) total_cnt, 
        Count( DECODE( server, 'DEDICATED', 1, null)) dedicated_cnt,
        Count( Decode (TYPE, 'BACKGROUND', 1, null)) back_cnt,
        Count( DECODE( Status, 'ACTIVE', 1, NULL)) active_cnt
FROM GV$SESSION
group by inst_id;

------------------------------------------------------------------------------------------------------------------------
-- 실행 중 Session Transaction 확인
------------------------------------------------------------------------------------------------------------------------
/* Formatted on 2018/04/30 오전 10:26:28 (QP5 v5.287) */
  SELECT s.inst_id,
         s.username,
         s.sid,
         s.serial#,
         p.spid,
         s.module,
         s.last_call_et,
         s.sql_exec_start,
         t.used_ublk,
         t.used_urec,
         s.osuser,  --s.command,
         s.event,
         (SELECT object_name
            FROM dba_objects
           WHERE object_id = s.row_wait_obj#)
            "object_name",
         t.start_time,
--         q.sql_text,
         --, t.start_scn
         --,'alter system kill session '''||s.sid||', '||s.serial#||', @'||s.inst_id||''' immediate;' "kill"         
         s.prev_sql_id,
         s.sql_id,
         (select sql_text from gv$sqlstats where sql_id = s.sql_id and rownum <= 1) sql_text,
         s.machine
    FROM gv$session s, gv$process p, gv$transaction t
--         , v$sqlstats q
   WHERE     s.paddr = p.addr(+)
         AND s.taddr = t.addr(+)
         AND (s.status = 'ACTIVE' OR t.used_urec IS NOT NULL)
         AND s.TYPE != 'BACKGROUND'
         --and machine like 'ompwap%'
         --and s.module like '%'
         --AND LNNVL (osuser = '9000091')
         AND s.username not in ('OGG','SYS')
         AND s.inst_id = p.inst_id(+)
         AND s.inst_id = t.inst_id(+)
--  AND s.sql_id = q.sql_id(+)
         --AND s.sql_address = q.address(+)
         --AND s.sql_hash_value = q.hash_value(+)
ORDER BY t.start_time, s.last_call_et DESC ;


select * from gv$sqlstats where sql_id in ('2qsy3txwtzgpp');

--ALTER SYSTEM KILL SESSION '4899,62440';

------------------------------------------------------------------------------------------------------------------------
-- v$session 대체해서 실시간 성능 이력 분석 (PLAN 포함됨)
------------------------------------------------------------------------------------------------------------------------
select sample_time,session_id,session_serial#,user_id,sql_id,
       sql_plan_operation, sql_plan_options, -- 11g 이상
       event,wait_time,time_waited, blocking_session, p1text,p1,p2text,p2,p3text,p3,
       (SELECT object_name
            FROM dba_objects
           WHERE object_id = current_obj#) "object_name", MODULE, 
       (SELECT sql_text
          FROM v$sqlarea a
         WHERE a.sql_id = h.sql_id)
          AS sql_text    
  from v$active_session_history h
 where 1=1
--   and sample_time between to_date ('20201104 092500', 'yyyymmdd hh24miss') and to_date ('20201104 093000', 'yyyymmdd hh24miss')
 and sample_time between sysdate-(interval '5' minute) and sysdate
--  (interval '5' [year|month|day|hour|minute|second]) 
   and session_type <> 'BACKGROUND' ;


------------------------------------------------------------------------------------------------------------------------
-- 특정 시간대의 대기 이벤트 집계 (특정 시간대 어떤 SQL에 어떤 EVENT가 가장 많이 발생했는지 분석)
------------------------------------------------------------------------------------------------------------------------
select user_id,sql_id,event,count (*),sum (wait_time),sum (time_waited)
  from v$active_session_history
 where 1=1
   and sample_time between to_date ('20201104 092500', 'yyyymmdd hh24miss') and to_date ('20201104 093000', 'yyyymmdd hh24miss')
--   and sample_time between sysdate-(interval '5' minute) and sysdate
   and session_type <> 'BACKGROUND'
 group by user_id, sql_id, event
 order by count (*) desc ;
 

------------------------------------------------------------------------------------------------------------------------
-- 특정 구간동안의 ASH 요약 리포트 
/* - SGA 크기, 샘플 수, 액티브 세션 수
- 대기 이벤트 정보(대기이벤트, 대기클래스, 대기시간정보)
- 대기 이벤트의 파라미터를 알 수 있어 어떤 자원에서 경합이 발생하는지 구체적 정보 파악 가능
- Top SQL에 대한 정보(명령 유형, 실행단계, 대기이벤트, Row Source등 정보 제공)를 제공
- Top Session 정보  */
------------------------------------------------------------------------------------------------------------------------
col db_id new_value db_id;
col inst_num new_value inst_num;

select dbid as db_id from v$database;
select instance_number as inst_num from v$instance;

select * from table(
  dbms_workload_repository.ash_report_text(
    :db_id, -- 2377999848
    :inst_num,
    sysdate - 10/24/60/60, -- 10초 
    sysdate
  ));

 

 

 

CREATE OR REPLACE PROCEDURE ORA.SP_TARGET_CUST ( 

    i_GCD IN ORA.TBL_TARGET_CUST.GCD%TYPE
    i_USE_VER IN ORA.TBL_TARGET_CUST.USE_VER%TYPE,
    i_REG_ID IN ORA.TBL_TARGET_CUST.REG_ID%TYPE 

)
IS
    c_limit PLS_INTEGER := 10000;


    CURSOR cur 
    IS
    SELECT GCD, IMEI
      FROM ORA.TBL_TARGET_CUST
     WHERE GCD =  i_GCD;

    TYPE t_CUST IS TABLE OF cur%ROWTYPE INDEX BY BINARY_INTEGER;
    l_CUST t_CUST;

BEGIN
  
    OPEN cur;
    LOOP
        FETCH cur BULK COLLECT INTO l_CUST LIMIT c_limit;

        FORALL i IN l_CUST.FIRST..l_CUST.LAST

                                             INSERT INTO ORA.TBL_TARGET_CUST( GCD
                                                               , USE_VER
                                                               , IMEI
                                                               , REG_DT
                                                               , REG_ID )
                                                         VALUES( l_CUST(i).GCD
                                                               , i_USE_VER
                                                               , l_CUST(i).IMEI
                                                               , SYSDATE
                                                               , i_REG_ID );
                     COMMIT;

        EXIT WHEN cur%NOTFOUND;

    END LOOP;

    CLOSE cur_CUST;

EXCEPTION
    WHEN OTHERS THEN
       NULL;
END;
/

'ORACLE > SQL' 카테고리의 다른 글

피벗(1) - LISTAGG, WM_CONCAT  (0) 2020.12.29
피벗(2) - PIVOT, UNPIVOT, (행을 열로, 열을 행으로)  (0) 2020.12.29
SQL Profile - plan 변경(응급조치)  (0) 2019.10.18
SQL trace _ 참조  (0) 2019.10.02
복수행 함수 (그룹 함수)  (0) 2018.12.13


1. RMAN 백업 종류
 
① backupset 으로 백업 수행 (default)
 : RMAN이 백업파일을 만들때 RMAN만이 알수있는 형태로 백업파일을 만드는데, 이것이 backupset 이다.

참고 : RMAN Memory 구조부분 참조
2012/02/21 - [Study/Oracle - 백업&복구] - 백업 & 복구 26 - RMAN : Catalog server구성 및 복구 간단 테스트 

 : RMAN 백업의 장점을 모두 사용하려면 이 방법으로 백업해야 한다.
 

※ backup piece (backupset과 함께 나오는 용어)
 : backupset의 용량이 너무 크면 분할해서 여러개의 파일로 백업받을수 있는데, 분할되는 하나의 백업파일을 backup piece라고 한다.
 
 
 
② Image copy 로 백업 수행
 : OS 명령어로 begin backup 하는 것과 가장 유사한 방법
   RMAN의 장점인 '사용중인 블록만 백업' 이나 '증분백업' 기능 등을 사용할 수 없다.
 
 
RMAN> copy
2> datafile '/app/oracle/oradata/testdb/users01.dbf'
3> to '/data/backup/rman/users01.dbf';
 
Starting backup at 22-FEB-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/app/oracle/oradata/testdb/users01.dbf
output file name=/data/backup/rman/users01.dbf tag=TAG20120222T165117 RECID=3 STAMP=775932679
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 22-FEB-12
 
 
  


2. RMAN 백업 가능 대상 및 백업이 안되는 사항들
 
① 백업 가능 대상
- database (all datafile 과 현재 control file)
- tablespace
- datafile (current 또는 image copy)
- archived redo log
- control file (current 또는 image copy)
 

 
② 백업 불가능 대상
- online redo log file
- init.ora
- password file
- listener.ora
- tnsnames.ora
 

 
 
 
3. RMAN 백업 제한 사항
- open 상태에서 백업을 받으려면 DB가 archive log mode 로 운영되어야 한다.
- DB가 MOUNT 또는 OPEN 되어 있어야 한다.
- 온라인 리두로그는 백업 불가능
- 노 아카이브모드 에ㅓ는 Clean 백업만 사용 가능
  즉, 오프라인 테이블스페이스나 읽기 전용 테이블스페이스 백업 사용 가능
- 해당 테이블스페이스느 백업모드 이어서는 안된다.
 
▶ RMAN = Begin backup 수행과 동일
 
 
 
 
 
4. RMAN 으로 백업 수행하기
 
① 독립형 명령(stand alone) 으로 백업받기
 : RMAN> prompt 에 1개의 명령어
 
Cf. 둘다 같음
RMAN> backup tablespace users;
 
RMAN> backup
2> tablespace
3> users;
 
 
 
② 작업형 명령으로 백업받기
 : 프로그램의 스크립트처럼 여러개의 명령어를 한꺼번에 사용가능
   RMAN> run { 명령1; 명령2; ... }
 
RMAN> run {
2> allocate channel c1 type disk maxpiecesize 100M;
3> backup tablespace system
4> format '/data/backup/rman/%U_%T';
5> }
 


- users tablespace 와 example tablespace 를 다른 channel을 할당해서 다른 경로로 백업받는 방법

RMAN> run {
2> allocate channel c1 type disk maxpiecesize 10M;
3> allocate channel c1 type disk maxpiecesize 50M;
4> backup
5> tablespace users channel c1
6> format '/data/backup/close/%U_%T'
7> tablespace example channel c2
8> format '/data/backup/rman/%U_%T';
9> }
 
 
 
 
 
 
 

문제 1: 전체 데이터베이스 백업 (독립형, 작업형 각각 수행)
 
RMAN> run {
2> allocate channel c1 device type disk
3> format '/data/backup/rman/%U_%T';
4> backup database;
5> }
 
 

문제 2: Channel 3개를 할당해서 Example, users, system,control file 만 백업
 
RMAN> run {
2> allocate channel c1 device type disk
3> allocate channel c2 device type disk
4> allocate channel c3 device type disk
5> backup
6> tablespace example, users, system
7> include current controlfile;
8> }
 

 
문제 3: Data file로 백업 (tablespace 이름이 아닌 data file 명으로)
 
RMAN> report schema;   ← SQL> 상태에서 쿼리 날려서 DATAFILE 상황 볼 필요없이 RMAN에서 바로 확인가능
 
Report of database schema for database with db_unique_name TESTDB
 
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    700      SYSTEM               YES     /app/oracle/oradata/testdb/system01.dbf
2    520      SYSAUX               NO      /app/oracle/oradata/testdb/sysaux01.dbf
3    95       UNDOTBS1             YES     /app/oracle/oradata/testdb/undotbs01.dbf
4    12       USERS                NO      /app/oracle/oradata/testdb/users01.dbf
5    345      EXAMPLE              NO      /app/oracle/oradata/testdb/example01.dbf
 
List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    29       TEMP                 32767       /app/oracle/oradata/testdb/temp01.dbf
 
RMAN> run {
2> allocate chanel c1 type disk;
3> backup datafile 1,2,3,4,5;
4> }
 

 
 
문제 4: 현재 Control file 만 백업
 
RMAN> run {
2> allocate channel c1 type disk;
3> backup current controlfile;
4> }
 
 
 


문제 5: 아래 조건으로 RMAN 백업
* RMAN 을 사용하여 sysaux, example, system 테이블 스페이스를 한번에 백업받기
* 백업경로
sysaux → /data/backup/open/
example → /data/backup/rman/
system → /data/backup/close/
* 작업형 명령어로 한번에 백업
* Channel 은 3개로 병렬작업 (채널이름은 각자 알아서..)
* 각 Channel은 백업 파일 하나의 크기가 최대 10M를 넘지 않도록 설정
 
 
RMAN> run {
2> allocate channel c1 type disk maxpiecesize 10M;
3> allocate channel c2 type disk maxpiecesize 10M;
4> allocate channel c3 type disk maxpiecesize 10M;
5> backup
6> tablespace example channel c1
7>  format '/data/backup/rman/%U_%T'
8> tablespace example channel c2
9>  format '/data/backup/close/%U_%T'
10> tablespace example channel c3
11>  format '/data/backup/open/%U_%T';
12> }

 



출처: https://dinggur.tistory.com/182?category=460192 [아무도없는세계]

'ORACLE > 백업및복구' 카테고리의 다른 글

UNDO 와 REDO  (0) 2023.12.13
데이터 이관 - Transportable Tablespace  (1) 2023.12.07
리눅스 백업 스크립트  (0) 2020.03.19
오라클 백업(핫백업/콜드백업)  (0) 2019.08.06
Archive log mode에서의 백업 및 복구  (0) 2018.12.05

/*
monitor hint 를 사용한 Plan 보기(v$sql_monitor, v$sql_plan_monitor)
Oracle은 실행 시간이 5초 이상(_sqlmon_threshold 히든 파라미터로 조정)인 모든 쿼리의 실행 이력 정보를 v$sql_monitor와 v$sql_plan_monitor 뷰에 남긴다. 
그리고 dbms_sqltune.report_sql_monitor 함수를 이용해서 정보를 조회할 수 있도록 해준다. 
또는 MONITOR 힌트를 사용해서 강제로 추적하게 할 수 있다
(Oracle 11g ~)
 */ 
 
-- /*+ monitor */ hint 이용한 방법
SELECT /*+ monitor */ 
     A.OWNER
    , A.TABLE_NAME
    , A.COLUMN_ID
    , A.COLUMN_NAME
    , B.COMMENTS
    , A.DATA_TYPE
    , A.DATA_LENGTH
    , A.NULLABLE
FROM   ALL_TAB_COLUMNS A
     , ALL_COL_COMMENTS B
WHERE  A.TABLE_NAME = B.TABLE_NAME
      AND  A.COLUMN_NAME = B.COLUMN_NAME
      AND A.OWNER in ('SPSDC','SPMKT','SPSAC','SPMBR','CMSTORE')      /*owner name*/
--      AND A.TABLE_NAME = 'EMPLOY' /*table name*/
      AND  A.COLUMN_NAME like 'INSD_DEVICE_ID%'
--      AND  B.COMMENTS like '%위치%'
ORDER BY A.TABLE_NAME, A.COLUMN_ID ;


-- sql_id 조회
select sql_id from v$sql where sql_text like 'SELECT /*+ monitor */ %';  


-- 결과 
select dbms_sqltune.report_sql_monitor(sql_id=>'6c29v4vunxz1t') from dual;

spool sqlmon_active.html

select dbms_sqltune.report_sql_monitor(sql_id=>'&sqlid',type=>'active', report_level=>'ALL') from dual;

spool off 

 


 SQL Monitoring Report

SQL Text

SELECT /*+ monitor */ A.OWNER , A.TABLE_NAME , A.COLUMN_ID , A.COLUMN_NAME , B.COMMENTS , A.DATA_TYPE , A.DATA_LENGTH , A.NULLABLE FROM ALL_TAB_COLUMNS A , ALL_COL_COMMENTS B WHERE A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME AND A.OWNER in ('SPSDC','SPMKT','SPSAC','SPMBR','CMSTORE') /*owner name*/ -- AND A.TABLE_NAME = 'EMPLOY' /*table name*/ AND A.COLUMN_NAME like 'INSD_DEVICE_ID%' -- AND B.COMMENTS like '%위치%' ORDER BY A.TABLE_NAME, A.COLUMN_ID

Global Information

 Status              :  DONE (ALL ROWS)      
 Instance ID         :  1                    
 Session             :  SPADMIN (4359:34279) 
 SQL ID              :  6c29v4vunxz1t       

 SQL Execution ID    :  16777216             
 Execution Started   :  06/24/2020 15:47:16  
 First Refresh Time  :  06/24/2020 15:47:16  
 Last Refresh Time   :  06/24/2020 15:47:17  

Global Stats
================================================================
| Elapsed |   Cpu   |    IO    | Fetch | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) | Calls |  Gets  | Reqs | Bytes |
================================================================
|    0.73 |    0.21 |     0.52 |     1 |  13790 | 2231 |  17MB |
================================================================

SQL Plan Monitoring Details (Plan Hash Value=2855117487)
==============================================================================================================================================================================================
| Id |                      Operation                       |       Name        |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  |  Mem  | Activity | Activity Detail |
|    |                                                      |                   | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes | (Max) |   (%)    |   (# samples)   |
==============================================================================================================================================================================================
|  0 | SELECT STATEMENT                                     |                   |         |      |           |        |       |          |      |       |     . |          |                 |
|  1 |   TABLE ACCESS BY INDEX ROWID BATCHED                | OBJ$              |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  2 |    INDEX RANGE SCAN                                  | I_OBJ1            |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  3 |    TABLE ACCESS BY INDEX ROWID BATCHED               | OBJ$              |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  4 |     INDEX RANGE SCAN                                 | I_OBJ1            |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  5 |     TABLE ACCESS BY INDEX ROWID BATCHED              | OBJ$              |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  6 |      INDEX RANGE SCAN                                | I_OBJ1            |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  7 |      TABLE ACCESS BY INDEX ROWID BATCHED             | OBJ$              |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  8 |       INDEX RANGE SCAN                               | I_OBJ1            |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
|  9 |       TABLE ACCESS BY INDEX ROWID BATCHED            | OBJ$              |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
| 10 |        INDEX RANGE SCAN                              | I_OBJ1            |       1 |    1 |           |        |       |          |      |       |     . |          |                 |
| 11 |   SORT ORDER BY                                      |                   |       1 |  653 |         1 |     +1 |     1 |       50 |      |       |  6144 |          |                 |
| 12 |    FILTER                                            |                   |         |      |         1 |     +1 |     1 |       50 |      |       |     . |          |                 |
| 13 |     NESTED LOOPS O

................

 

 

/* 
 gather_plan_statistics hint를 사용한 SQL Trace+Tkprof 수행 동일 효과 보기
 select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
 (Oracle 10g ~)
*/

-- /*+ gather_plan_statistics */ Hint 이용한 방법
SELECT  /*+ gather_plan_statistics */ 
     A.OWNER
   , A.TABLE_NAME
   , A.COLUMN_ID
    , A.COLUMN_NAME
    , B.COMMENTS
    , A.DATA_TYPE
    , A.DATA_LENGTH
    , A.NULLABLE
FROM   ALL_TAB_COLUMNS A
     , ALL_COL_COMMENTS B
WHERE  A.TABLE_NAME = B.TABLE_NAME
      AND  A.COLUMN_NAME = B.COLUMN_NAME
      AND A.OWNER in ('SPSDC','SPMKT','SPSAC','SPMBR','CMSTORE')      /*owner name*/
--      AND A.TABLE_NAME = 'EMPLOY' /*table name*/
      AND  A.COLUMN_NAME like 'INSD_DEVICE_ID%'
--      AND  B.COMMENTS like '%위치%'
ORDER BY A.TABLE_NAME, A.COLUMN_ID ;


-- plan
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));


select * from table(dbms_xplan.display_cursor(NULL,NULL,'allstats last -rows +alias +outline +predicate'));



-- 결과
SQL_ID  1sq5s3pjphk1q, child number 0
-------------------------------------
SELECT  /*+ gather_plan_statistics */       A.OWNER    , A.TABLE_NAME   
 , A.COLUMN_ID     , A.COLUMN_NAME     , B.COMMENTS     , A.DATA_TYPE   
  , A.DATA_LENGTH     , A.NULLABLE FROM   ALL_TAB_COLUMNS A      , 
ALL_COL_COMMENTS B WHERE  A.TABLE_NAME = B.TABLE_NAME       AND  
A.COLUMN_NAME = B.COLUMN_NAME       AND A.OWNER in 
('SPSDC','SPMKT','SPSAC','SPMBR','CMSTORE')      /*owner name*/ --      
AND A.TABLE_NAME = 'EMPLOY' /*table name*/       AND  A.COLUMN_NAME 
like 'INSD_DEVICE_ID%' --      AND  B.COMMENTS like '%위치%' ORDER BY 
A.TABLE_NAME, A.COLUMN_ID
 
Plan hash value: 2855117487
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                          | Name              | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                                   |                   |      1 |        |     50 |00:00:01.18 |   13797 |   2315 |       |       |          |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED               | OBJ$              |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  2 |   INDEX RANGE SCAN                                 | I_OBJ1            |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|   3 |   TABLE ACCESS BY INDEX ROWID BATCHED              | OBJ$              |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  4 |    INDEX RANGE SCAN                                | I_OBJ1            |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|   5 |    TABLE ACCESS BY INDEX ROWID BATCHED             | OBJ$              |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  6 |     INDEX RANGE SCAN                               | I_OBJ1            |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|   7 |     TABLE ACCESS BY INDEX ROWID BATCHED            | OBJ$              |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|*  8 |      INDEX RANGE SCAN                              | I_OBJ1            |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|   9 |      TABLE ACCESS BY INDEX ROWID BATCHED           | OBJ$              |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|* 10 |       INDEX RANGE SCAN                             | I_OBJ1            |      0 |      1 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|  11 |  SORT ORDER BY                                     |                   |      1 |      1 |     50 |00:00:01.18 |   13797 |   2315 |  6144 |  6144 | 6144  (0)|
|* 12 |   FILTER                                           |                   |      1 |        |     50 |00:00:01.83 |   13797 |   2315 |       |       |          |
|  13 |    NESTED LOOPS OUTER                              |                   |      1 |      1 |     50 |00:00:01.81 |   12214 |   2304 |       |       |          |
|  14 |     NESTED LOOPS OUTER                             |                   |      1 |      1 |     50 |00:00:01.81 |   12160 |   2279 |       |       |          |
|  15 |      NESTED LOOPS OUTER                            |                   |      1 |      1 |     50 |00:00:01.79 |   12056 |   2226 |       |       |          |
|  16 |       NESTED LOOPS OUTER                           |                   |      1 |      1 |     50 |00:00:01.79 |   11924 |   2218 |       |       |          |
|  17 |        NESTED LOOPS OUTER                          |                   |      1 |      1 |     50 |00:00:01.79 |   11924 |   2218 |       |       |          |
|  18 |  ......

|  71 |     FIXED TABLE FULL                               | X$KZSRO           |      0 |      2 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
|* 72 |     INDEX RANGE SCAN                               | I_OBJAUTH2        |      0 |      2 |      0 |00:00:00.01 |       0 |      0 |       |       |          |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("O"."OBJ#"=:B1)
   4 - access("O"."OBJ#"=:B1)
   6 - access("O"."OBJ#"=:B1)
   8 - access("O"."OBJ#"=:B1)
  10 - access("O"."OBJ#"=:B1)
  12 - filter(((INTERNAL_FUNCTION("O"."TYPE#") OR ("O"."TYPE#"=2 AND  IS NULL)) AND ("O"."SPARE3"=USERENV('SCHEMAID') OR  IS NOT NULL OR  IS NOT NULL) AND 
              (BITAND("O"."FLAGS",1048576)=1048576 OR BITAND("U"."SPARE1",16)=0 OR ("O"."TYPE#"<>88 AND  IS NULL) OR ( IS NOT NULL AND 
              ((SYS_CONTEXT('userenv','current_edition_name')='ORA$BASE' AND "U"."TYPE#"<>2) OR ("U"."TYPE#"=2 AND 
              "U"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id'))) OR  IS NOT NULL))) AND (BITAND("O"."FLAGS",1048576)=1048576 OR BITAND("U"."SPARE1",16)=0 
              OR ("O"."TYPE#"<>88 AND  IS NULL) OR ( IS NOT NULL AND ((SYS_CONTEXT('userenv','current_edition_name')='ORA$BASE' AND "U"."TYPE#"<>2) OR ("U"."TYPE#"=2 AND 
              "U"."SPARE2"=TO_NUMBER(SYS_CONTEXT('userenv','current_edition_id'))) OR  IS NOT NULL))) AND ("U"."NAME"=SYS_CONTEXT('USERENV','CURRENT_USER') OR 
              ORA_CHECK_SYS_PRIVILEGE("U"."USER#",2)=1 OR  IS NOT NULL)))
  25 - access("C"."NAME"="C"."NAME")  ....

 

 

 

일단 crond 데몬으로 아침 6마다 백업 스크립트를 실행하는데
그 백업 스크립트는 특정 디렉토리를 tar.gz 로 압축하고
그걸 백업 서버의 ftp 로 접속해서 저장한다.
이정도만 되더라도 사용자들의 데이터는 안전하게 유지할수 있는것이다.

그럼 먼저 crond 을 보도록 하자
crond 는 특정 시간이나 날짜(좀 복잡하게도 가능)에 정해진 일을 수행하는 데몬이다.
자세한거는 직접들 찾아보시고

# crontab -e 0 6 * * * /bin/backup.sh


이렇게 명령을 주게되면 crond 에 매일 아침 6시에 /bin/backup.sh 를 실행하라는
것을 의미한다. 자세한 의미는 굳이 설명하지 않겠다.
이러면 crond 는 매일 아침 6정각에 /bin/backup.sh 를 실행한다.

다음은 backup.sh 의 내용이다.

-------------------------------------------------------------------------------------------------------------------------------

#!/bin/bash
dstring="backup_`date +'%y%m%d'`.tar.gz"  # 파일명을 만들어낸다.
                                                             # 04년06월21일같은경우에
                                                             # backup_040621.tar.gz 를 만든다.
wall < /bin/start_backup_message             # 접속되어있는 모든 사용자에게
                                                             # 백업이 시작됨을 알리고
/etc/init.d/network stop                            # 네트워크 서비스를 중지시킨다.
tar cfz $dstring "/home"                        # home 디렉토리를 파일명으로 압축한다.
/etc/init.d/ network start                           # 네트워크 서비스 재개

Server="Backup Server Address"   # 서버IP
Password="PASSWORD"              # backup 받는 유저의 패스워드
UsrID="USERID"                           # ID

ftp -n $Server <<End-Of-Session  # ftp 에 접속 -n 옵션은 자동로그인을 안한다.
user $UsrID $Password                # 로그인
binary
put "$dstring"
bye
End-Of-Session

rm -f $dstring                               # 백업파일 삭제

wall < /bin/end_backup_message  # 백업이 끝났음을 알린다

-------------------------------------------------------------------------------------------------------------------------------

네트워크 서비스를 중지시키는 이유는 간단하다.
백업이 진행될동안 서버에 파일을 올리지 않게 하기 위해서이다.

출처: https://oracle.tistory.com/246 [안나푸르나]

'ORACLE > 백업및복구' 카테고리의 다른 글

데이터 이관 - Transportable Tablespace  (1) 2023.12.07
RMAN 백업  (0) 2020.06.25
오라클 백업(핫백업/콜드백업)  (0) 2019.08.06
Archive log mode에서의 백업 및 복구  (0) 2018.12.05
ConfrolFile 백업 및 복구  (0) 2018.12.05

dbms_redefinition 패키지를 이용한 파티션 전환

-- DBMS_REDEFINITION.CAN_REDEF_TABLE

-- DBMS_REDEFINITION.START_REDEF_TABLE

-- DBMS_REDEFINITION.SYNC_INTERIM_TABLE

-- DBMS_REDEFINITION.FINISH_REDEF_TABLE

 

-- 대상 table 생성
CREATE TABLE SPSAC.INI_TB_DP_COMMENT_REPLY
(
PRCHS_ID                  VARCHAR2 (20) NOT NULL,
PROD_ID                   VARCHAR2 (10),
PRCHS_AMT                 NUMBER,
PRCHS_PAYMENT_INFO        VARCHAR2 (1000),
REWARD_INFO               VARCHAR2 (1000), EVENT_ID                  VARCHAR2 (100),
EVENT_RESERVE_RESULT_CD   VARCHAR2 (10),
EVENT_RESERVE_RESPONSE    CLOB,
EVENT_PROC_STATUS_CD      VARCHAR2 (10),
EVENT_RESERVE_DT          DATE DEFAULT SYSDATE,
EVENT_JOIN_RESULT_CD      VARCHAR2 (10),
EVENT_JOIN_DT             DATE,
REWARD_WIDR_RESULT_CD     VARCHAR2 (20),
REWARD_WIDR_DT            DATE,
EVENT_META1               VARCHAR2 (4000),
EVENT_META2               VARCHAR2 (4000),
EVENT_META3               VARCHAR2 (4000),
REG_ID                    VARCHAR2 (50),
-- REG_DT                    DATE DEFAULT SYSDATE,
REG_DT                    DATE DEFAULT SYSDATE NOT NULL,
UPD_ID                    VARCHAR2 (50),
UPD_DT                    DATE DEFAULT SYSDATE
) TABLESPACE TBS_SPPRS_TDE_DAT
  LOB (EVENT_RESERVE_RESPONSE) STORE AS SECUREFILE (TABLESPACE TBS_SPPRS_TDE_IDX)
  PARTITION BY RANGE (REG_DT)
( PARTITION P201810 VALUES LESS THAN (to_date('20181101','YYYYMMDD'))
, PARTITION P201811 VALUES LESS THAN (to_date('20181201','YYYYMMDD'))
, PARTITION P201812 VALUES LESS THAN (to_date('20190101','YYYYMMDD'))
, PARTITION P201901 VALUES LESS THAN (to_date('20190201','YYYYMMDD'))
, PARTITION P201902 VALUES LESS THAN (to_date('20190301','YYYYMMDD'))
, PARTITION P201903 VALUES LESS THAN (to_date('20190401','YYYYMMDD'))
, PARTITION P201904 VALUES LESS THAN (to_date('20190501','YYYYMMDD'))
, PARTITION P201905 VALUES LESS THAN (to_date('20190601','YYYYMMDD'))
, PARTITION P201906 VALUES LESS THAN (to_date('20190701','YYYYMMDD'))
, PARTITION P201907 VALUES LESS THAN (to_date('20190801','YYYYMMDD'))
, PARTITION P201908 VALUES LESS THAN (to_date('20190901','YYYYMMDD'))
, PARTITION P201909 VALUES LESS THAN (to_date('20191001','YYYYMMDD'))
, PARTITION P201910 VALUES LESS THAN (to_date('20191101','YYYYMMDD'))
, PARTITION P201911 VALUES LESS THAN (to_date('20191201','YYYYMMDD'))
, PARTITION P201912 VALUES LESS THAN (to_date('20200101','YYYYMMDD'))
, PARTITION PMAX    VALUES LESS THAN (MAXVALUE)
) ENABLE ROW MOVEMENT

 



BEGIN
    DBMS_REDEFINITION.CAN_REDEF_TABLE('SPSAC', 'TB_DP_COMMENT_REPLY', options_flag  =>  DBMS_REDEFINITION.CONS_USE_PK);
END;
/



BEGIN
    DBMS_REDEFINITION.START_REDEF_TABLE(
        uname         =>  'SPSAC',
        orig_table    =>  'TB_DP_COMMENT_REPLY',
        int_table     =>  'INI_TB_DP_COMMENT_REPLY',
        col_mapping   =>  'REPLY_SEQ       REPLY_SEQ     ,
       to_clob(REPLY_DSCR)      REPLY_DSCR    ,
                   COMMENT_SEQ     COMMENT_SEQ   ,
                   MBR_NO          MBR_NO        ,
                   NICKNAME        NICKNAME      ,
                   USER_MDN        USER_MDN      ,
                   AUTHOR_YN       AUTHOR_YN     ,
                   PURCHASE_YN     PURCHASE_YN   ,
                   REPLY_ORD       REPLY_ORD     ,
                   RECOM_CNT       RECOM_CNT     ,
                   BAD_REPLY_YN    BAD_REPLY_YN  ,
                   REG_ID          REG_ID        ,
                   REG_DT          REG_DT        ,
                   UPD_ID          UPD_ID        ,
                   UPD_DT          UPD_DT        ,
                   DEL_YN          DEL_YN        ,
                   DEL_TYPE        DEL_TYPE      ,
                   DEL_DT          DEL_DT      ' ,
        options_flag  =>  DBMS_REDEFINITION.CONS_USE_PK--,
--        orderby_cols  =>  'REPLY_SEQ'
        );
END;
/



DECLARE
    num_errors PLS_INTEGER;
BEGIN
    DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
        uname             =>  'SPSAC',
        orig_table        =>  'TB_DP_COMMENT_REPLY',
        int_table         =>  'INI_TB_DP_COMMENT_REPLY',
        copy_indexes      =>  DBMS_REDEFINITION.CONS_ORIG_PARAMS,
        copy_triggers     =>  TRUE,
        copy_constraints  =>  TRUE,
        copy_privileges   =>  TRUE,
        ignore_errors     =>  TRUE,
        num_errors        =>  num_errors,
        copy_statistics   =>  TRUE, 
        copy_mvlog        =>  FALSE
        ); 
END;
/



SELECT OBJECT_NAME, BASE_TABLE_NAME, DDL_TXT FROM DBA_REDEFINITION_ERRORS
;


SELECT * FROM DBA_CONSTRAINTS WHERE TABLE_NAME = 'INI_TB_DP_COMMENT_REPLY';
-- 확인하기
ALTER TABLE SPSAC.INI_TB_DP_COMMENT_REPLY MODIFY CONSTRAINTS TMP$$_PK_CM_VOC_EMAIL0 VALIDATE;

-- 변경 데이터 sync 작업
BEGIN 
    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SPSAC', 'TB_DP_COMMENT_REPLY', 'INI_TB_DP_COMMENT_REPLY');
END;
/


BEGIN 
    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SPSAC', 'TB_DP_COMMENT_REPLY', 'INI_TB_DP_COMMENT_REPLY');
END;
/

-- 작업 완료
BEGIN
    DBMS_REDEFINITION.FINISH_REDEF_TABLE('SPSAC', 'TB_DP_COMMENT_REPLY', 'INI_TB_DP_COMMENT_REPLY');
END;
/

drop table SPSAC.INI_TB_DP_COMMENT_REPLY purge;

 

 

 

■ Mview를 이용한 파티션 전환

 

CREATE TABLE SCOTT.TEST(  ID NUMBER,  COL1  VARCHAR2(10),  COL2  VARCHAR2(10) );
ALTER TABLE SCOTT.TEST ADD  CONSTRAINT TEST_PK  PRIMARY KEY (ID);
GRANT DELETE, INSERT, SELECT, UPDATE ON SCOTT.TEST TO HR;
CREATE PUBLIC SYNONYM TEST FOR SCOTT.TEST;

-- 1. 원본 테이블에 primary key모드로  Mlog생성합니다. 
CREATE MATERIALIZED VIEW LOG ON SCOTT.TEST  WITH PRIMARY KEY EXCLUDING NEW VALUES;

-- 2. 파티션으로 전환할 테이블을 생성합나디.
CREATE TABLE SCOTT.TEST_INTERIM 
( ID NUMBER,  COL1  VARCHAR2(10),  COL2  VARCHAR2(10) )
PARTITION BY RANGE(ID) 
( PARTITION TEST_S0001 VALUES LESS THAN (1000000),  
  PARTITION TEST_S0002 VALUES LESS THAN (2000000),  
  PARTITION TEST_S0003 VALUES LESS THAN (3000000),  
  PARTITION TEST_S0004 VALUES LESS THAN (4000000) 
)ENABLE ROW MOVEMENT; 

-- 3. 원본 테이블에 primary key모드로 Mview 생성합니다. 
-- 수동으로 refresh할 예정이므로,  START WITH ..  NEXT 절은 생략합니다.
-- START WITH ..  NEXT 절을 사용하면 job에 등록되어지기때문에 
-- 자동으로 refresh되어 예기치 않는 문제가 발생될수 있습니다.
CREATE MATERIALIZED VIEW SCOTT.TEST_INTERIM
ON PREBUILT TABLE 
REFRESH FORCE
WITH PRIMARY KEY
AS
SELECT * FROM SCOTT.TEST;

-- 4. TEST_INTERIM_PK 인덱스 생성합니다.
CREATE INDEX SCOTT.TEST_INTERIM_PK ON SCOTT.TEST_INTERIM (ID);

-- 5. Primary Key Constraint 생성합니다.
ALTER TABLE SCOTT.TEST_INTERIM ADD  CONSTRAINT TEST_INTERIM_PK  PRIMARY KEY (ID);

-- 6. 원본테이블와 동기화작업합니다.
EXEC DBMS_MVIEW.REFRESH('"SCOTT"."TEST_INTERIM"');

-- 7. 원본테이블과 동일하게 권한을 부여합니다. 
GRANT DELETE, INSERT, SELECT, UPDATE ON SCOTT.TEST_INTERIM TO HR;

-- 9. 통계정보 수집합니다.(혹시 plan이 변경될수 있으므로 원본테이블의 통계쩡보를  copy하셔도 됩니다).
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','TEST_INTERIM', granularity=>'AUTO',estimate_percent=>1); 

-- 10. 미리 인덱스/constraint명을 수정함
ALTER TABLE SCOTT.TEST              RENAME CONSTRAINT TEST_PK TO TEST_PK_bk; 
ALTER TABLE SCOTT.TEST_INTERIM   RENAME CONSTRAINT TEST_INTERIM_PK TO TEST_PK; 

-- 12. 원본테이블와 동기화작업합니다.
EXEC DBMS_MVIEW.REFRESH('"SCOTT"."TEST_INTERIM"');

-- 13 ~ 15단계는 offline작업이므로, 빠르게 진행합니다.
-- 13. 물리적인 테이블을 남겨두고, Mview 삭제함.
DROP MATERIALIZED VIEW SCOTT.TEST_INTERIM PRESERVE TABLE;

-- 14. 원본테이블에 Mlog를 삭제함.
-- 원본테이블명을 rename하기 위해서는 mlog가 삭제되어야합니다.
DROP MATERIALIZED VIEW LOG ON SCOTT.TEST;

--15. 테이블명을 수정함,
ALTER TABLE SCOTT.TEST RENAME TO TEST_BK;
ALTER TABLE SCOTT.TEST_INTERIM RENAME TO TEST;

--16. 관련된 object compile함.
ALTER PUBLIC SYNONYM TEST COMPILE;

'ORACLE > ADMIN' 카테고리의 다른 글

오라클 스케줄러(Scheduler)  (0) 2021.01.15
shrink/Reorg 대상 찾기 (dbms_space )  (0) 2020.12.30
Logdump Utility  (0) 2019.11.13
ASM DB Startup / Shutdown Guide  (0) 2019.10.23
ASM - Tablespace 관리하기  (0) 2019.10.21

Logdump Utility

Oracle GoldenGate Software includes the Logdump Utility for viewing data directly from the trail files.

 

Without the Logdump, it is not possible to read the content of the Oracle GoldenGate trail files, as the trail files are in a binary format. With Logdump, we can open up the trail file, read its content, navigate through the file, view transactions at different RBA’s (relative byte address – file position), help identify the type of commands (DML or DDL) issued on the source, including delete, insert, update, alter and create statements.

 

Hence Logdump Utility is most important utility in troubleshooting GoldenGate Issues.

 

To invoke the utility, go to the GoldenGate home directory and type “logdump”, as shown in the following example.

 

[oracle@dbserver1 ggs]$ ./logdump

 

LogDump Commands:

 

1. How to open LogDump: Navigate to the directory where the Oracle GoldenGate Software is installed and execute the Logdump.

 

[GoldenGate]$ $GG_HOME/logdump

 

2. Opening a Trail File:  To open a trail file and read its content, specify the trail file at the logdump prompt. Trail files are usually found in the GoldenGate dirdat directory.

 

$ ls -lrt

 

$GG_HOME/dirdat

 

$-rw-rw-rw- 1 oracle oinstall 78325 May 7 10:38 EE000001

$-rw-rw-rw- 1 oracle oinstall 78325 May 7 10:42 EE000002

$-rw-rw-rw- 1 oracle oinstall 78325 May 7 10:55 EE000003

 

You can also determine the current trail file directory/name by running the “INFO process_name” command at the ggsci prompt.

 

3. Open and view the details of local trail file: 

Logdump> OPEN ./dirdat/EE000001

Change the file name and location as required.

 

4. Set Output Format: Enable the following options so that you are able to view the results in a readable format in your Logdump session.

a) Set trail file header details on: The FILEHEADER contains the header details of the currently opened trail file.

Logdump> FILEHEADER DETAIL

b) Record Header: 

Logdump> GHDR ON

c) Set Column Details on: It displays the list of columns, their ID, length, Hex values etc.

Logdump> DETAIL ON

d) User Token Details: User token is the user-defined information stored in a trail, associated with the table mapping statements. The CSN (SCN in Oracle Database) associated with the transaction is available in this section.

Logdump> USERTOKEN DETAIL

e) Set length of the record to be displayed: In this case, it is 128 characters.

Logdump> RECLEN 128

 

5. Viewing the records: To view particular records in the trail files, navigate as below in the local trail file.

a) First record in the trail file: Here “0” is the beginning of the trail file

Logdump> POS 0

b) Move to a specific record, at a particular RBA
The “xxxx” is the RBA number.

Logdump> POS xxxx

c) Next record in the opened trail file
Logdump> N
Or
Logdump> NEXT

d) Moving forward or reverse in the trail file
Logdump> POS FORWARD
or
Logdump> POS REVERSE

e) Skip certain number of records
Here ‘x’ is the number of records you want to skip.

Logdump> SKIP x

f) Last record in the trail file
Logdump> POS last

 

6. Filter Commands:

We can use filter commands to view the specific operations or data records, a record at a specific RBA, the record length, record type, etc. using the commands below.

 

To start filtration, use the “filter” keyword, followed by include or exclude. These options allow the data to be removed or shown, based on the filter criteria. Then apply other conditions like file name, rectype, iotype etc. Here rectype is record type and iotype is input output type.

 

There are number of operation we can filter using the Logdump. To view the list of operation types and the number assigned to them, run below command.

a) Show the Record Types 

Logdump> SHOW RECTYPE

b) Enable or disable filteration:

Logdump> FILTER [ ENABLE | DISABLE ]

Filter Records by Table Name

Logdump> FILTER INCLUDE FILENAME CC_APP.IMAGE_DETAIL

c) Filter Records by Operation Type: Operation types are Insert, Update, and Delete.

Logdump> FILTER INCLUDE IOTYPE INSERT

d) Filter Records using the operation number
You can specify the IOTYPE by using the equivalent operation number.

Logdump 374> FILTER INCLUDE IOTYPE 160
Logdump 374> N
n
Sample Output:

 

2013/02/18 00:36:05.000.000 DDLOP Len 1169 RBA 3049

Name:

After Image: Partition 0 G s

2c43 353d 2733 3135 3435 272c 2c42 373d 2733 3135 | ,C5=’31545′,,B7=’315

3735 272c 2c42 323d 2727 2c2c 4233 3d27 5331 272c | 75′,,B2=”,,B3=’S1′,

2c42 343d 2754 4553 545f 3132 272c 2c43 3132 3d27 | ,B4=’TEST’,,C12=’

272c 2c43 3133 3d27 272c 2c42 353d 2754 4142 4c45 | ‘,,C13=”,,B5=’TABLE

272c 2c42 363d 2743 5245 4154 4527 2c2c 4238 3d27 | ‘,,B6=’CREATE’,,B8=’

4747 5553 4552 2e47 4753 5f44 444c 5f48 4953 5427 | GGUSER.GGS_DDL_HIST’

2c2c 4239 3d27 5331 272c 2c43 373d 2731 312e 322e | ,,B9=’S1′,,C7=’11.2.

Filtering suppressed 2 records

 

Note: Here 160 represent DDL operation and in the detail, we can see the DDL type like below is “CREATE” and suppressed means number of records skipped to reach next filter value.

e) View currently applied filters

Logdump> FILTER SHOW

Sample output:
Data filters are ENABLED

Include Match ANY
Rectypes: DDLOP

Exclude Match ANY

f) Filter on multiple conditions:
We can filter the data of trail file using the multiple conditions together.

For that we can string multiple FILTER commands together, separating each one with a semicolon, as shown in the below example:

Logdump>FILTER INCLUDE FILENAME [SCHEMA].[TABLE]; FILTER RECTYPE 5; FILTER INCLUDE IOTYPE INSERT
The above example will display only “5”,” insert” statement records from the specified table.

Note: [SCHEMA] & [TABLE] is the name of the schema and table, and should be in upper case.

g) Clear the filter in the session
Logdump> FILTER CLEAR

 


Sample output:

[oracle@ggnode ~]$ cd /u01/gg12c/
[oracle@ggnode gg12c]$ ls -ltr |grep log
-rwxr-x--- 1 oracle oinstall 30538126 Jul 14 2017 logdump
-rwxr-x--- 1 oracle oinstall 14312189 Jul 14 2017 libgglog.so
-rw-r----- 1 oracle oinstall 3168 Jul 26 2017 gglog-RNSIMEX1.dmp
-rw-r----- 1 oracle oinstall 0 Jul 27 2017 gglog-ggsci.dmp
drwxr-xr-x 5 oracle oinstall 20480 Aug 7 2017 cfgtoollogs
-rw-r--r-- 1 oracle oinstall 480 Aug 11 2017 gglog-ENSIMEX1.xml.txt
-rw-r----- 1 oracle oinstall 2097151957 Sep 7 2017 gglog-ENSIMEX1.log.2
-rw-r----- 1 oracle oinstall 200881340 Sep 7 2017 gglog-ENSIMEX1.log.1
-rw-r----- 1 oracle oinstall 8577489 Sep 7 2017 gglog-ENSIMEX1.log
-rw-r----- 1 oracle oinstall 19249553 May 7 08:31 ggserr.log
[oracle@ggnode gg12c]$ ./logdump open /u01/gg12c/dirdat/nsim1/r1000000021

Oracle GoldenGate Log File Dump Utility for Oracle
Version 12.2.0.1.170221 23712604

Copyright (C) 1995, 2017, Oracle and/or its affiliates. All rights reserved.

Current LogTrail is /u01/gg12c/dirdat/nsim1/r1000000021
Logdump 37 >log support1.lst
--- Session log support1.lst opened 2018/05/07 08:53:08.098.874 ---
Logdump 38 >ghdr on
Logdump 39 >detail data on
Logdump 40 >
Logdump 40 >usertoken detail
Logdump 41 >
Logdump 41 >headertoken detail
Logdump 42 >fileheader detail
Logdump 43 >ggstoken detail
Logdump 44 >pos 0
Reading forward from RBA 0
Logdump 45 >pos 3849
Bad record found at (RBA 3849, format 5.50 Unknown TokenID 6d)
 4602 05a0 3000 0342 3000 0008 4747 0d0a 544c 0a0d | F...0..B0...GG..TL..
 3100 0002 0005 3200 0004 2000 0000 3300 0008 02f2 | 1.....2... ...3.....
 9180 19d7 9dbc 3400 0029 0027 7572 693a 4256 4f52 | ......4..).'uri:BVOR
 414c 3031 3a3a 6f72 6163 6c65 5f64 6174 613a 6767 | AL01::oracle_data:gg
 7377 3a50 4e53 494d 4c42 3135 0000 2d35 0000 2900 | sw:PNSIMLB15..-5..).
 2775 7269 3a42 564f 5241 4c30 313a 3a6f 7261 636c | 'uri:BVORAL01::oracl
 655f 6461 7461 3a67 6773 773a 454e 5349 4d4c 4231 | e_data:ggsw:ENSIMLB1
 3600 0026 0024 2f67 6773 772f 6767 3132 632f 6469 | 6..&.$/u01/gg12c/di
 7264 6174 2f6e 7369 6d31 2f72 3130 3030 3030 3030 | rdat/nsim1/r10000000
 3231 3700 0001 0138 0000 0400 0000 1539 ff00 0800 | 217....8.......9....
 0000 0000 0000 003a 0000 8109 3131 3036 3931 3233 | .......:....11069123
 3400 0000 0000 0000 0000 0000 0000 0000 0000 0000 | 4...................
 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 | ....................
.
. . . . . . . . . . 
. Long Text skipped 
. . . . . . . . . . 
.
.
 2d31 3404 000a 0000 0000 0001 6325 9046 7605 000a | -14.........c%.Fv...
 0000 0000 0001 632a b6a2 7606 004b 0000 0047 002f | ......c*..v..K...G./
 7365 7276 6963 652f 7469 6d65 7243 616c 6c62 6163 | service/timerCallbac
 6b2f 7072 696d 6172 7944 6576 6963 6543 6865 636b | k/primaryDeviceCheck
 456e 7450 6572 696f 6446 6f72 4f70 7469 6d69 7a65 | EntPeriodForOptimize
 6448 6561 7274 6265 6174 0700 1e00 0000 1a00 7b22 | dHeartbeat........{"
 696d 7369 22 | imsi"
Reading forward from RBA 3849
Logdump 46 >n
TokenID x47 'G' Record Header Info x01 Length 483
TokenID x48 'H' GHDR Info x00 Length 36
 450c 0041 6201 05ff 2b44 2e1f 7a91 f202 bc0e d202 | E..Ab...+D..z.......
 0000 0000 1c08 0000 0352 0000 0001 0100 | .........R......
TokenID x44 'D' Data Info x00 Length 354
TokenID x54 'T' GGS Tokens Info x00 Length 73
TokenID x5a 'Z' Record Trailer Info x01 Length 483

...

GGS tokens:
TokenID x52 'R' ORAROWID Info x00 Length 20
 4141 4163 477a 4141 4141 414e 4141 7541 4143 0001 | AAAcGzAAAAANAAuAAC..
TokenID x74 't' ORATAG Info x01 Length 0
TokenID x4c 'L' LOGCSN Info x00 Length 9
 3131 3036 3931 3233 34 | 110691234
TokenID x36 '6' TRANID Info x00 Length 22
 3337 3831 3238 3036 3332 2e32 302e 322e 3131 3932 | 3781280632.20.2.1192
 3935 | 95
TokenID x69 'i' ORATHREADID Info x01 Length 2
 0001 | ..

Logdump 47 >exit

 

 

 

 

 

Reference: 

 

1 Using the Logdump Utility

This chapter contains instructions for using the Logdump utility of Oracle GoldenGate. Logdump enables you to search for, filter, view, and save data that is stored in a trail or extract file. 1.1 Getting Started with Logdump This section introduces you to

docs.oracle.com

 

Oracle GoldenGate

Oracle GoldenGate Oracle GoldenGate is a comprehensive software package for real-time data integration and replication in heterogeneous IT environments. The product set enables high availability solutions, real-time data integration, transactional change d

www.oracle.com

 

Analyzing a SQL Trace File with SQL Statements


많은 경우 그렇듯이 어떤 기능은 제공하는 자의 예상과는 다른 목적으로 사용될 수 있다.

 

오라클 11g부터 지원하는 DBMS_SQLTUNE의 SELECT_SQL_TRACE 함수는 본래 SQL trace 파일의 내용을

SQL tuning set에 로딩하는 것이 목적이었는데, 이 포스트에서는 다소 다른 용도로 활용하려고 한다.

 

사용할 수 있는 오라클 버전은 11.1.0.7 이상이어야 한다. 

 

- SELECT_SQL_TRACE 함수

- SELECT_SQL_TRACE 함수의 리턴값

 

1.테스트 Setup

 

drop table t purge;

 

CREATE TABLE t
AS
SELECT rownum AS id, rpad('*',1000,'*') AS pad
FROM dual
CONNECT BY level <= 10000
ORDER BY dbms_random.value;

 

ALTER TABLE t ADD CONSTRAINT t_pk PRIMARY KEY (id);

 

BEGIN
  dbms_stats.gather_table_stats(
      ownname          => user,
      tabname          => 't',
      estimate_percent => 100,
      method_opt       => 'for all columns size 1'
    );
END;
/

2.SQL Trace 설정

 

execute dbms_monitor.session_trace_enable(binds => TRUE, plan_stat => 'ALL_EXECUTIONS')

 

3.몇몇 쿼리 수행

 

variable id number

EXECUTE :id := 10;
SELECT count(pad) FROM t WHERE id < :id;

 

EXECUTE :id := 990;
SELECT count(pad) FROM t WHERE id < :id;

 

EXECUTE :id := 20;
SELECT count(pad) FROM t WHERE id < :id;

 

SELECT sum(id) FROM t;

 

4.SQL Trace 설정 해제 및 Trace 파일 이름 확인

 

execute dbms_monitor.session_trace_disable

 

set serveroutput on

exec print_table('select * from  v$diag_info')

 

SELECT value
FROM v$diag_info
WHERE name = 'Default Trace File';

 

  VALUE
  -------------------------------------------------------------------
  /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_14663.trc

 

5.디렉토리 객체 생성, 뷰 생성 및 내용 확인

 

CREATE DIRECTORY trace AS '/u01/app/oracle/diag/rdbms/orcl/orcl/trace/';

 

CREATE OR REPLACE VIEW V
AS
SELECT SQL_ID, FORCE_MATCHING_SIGNATURE, SQL_TEXT, BIND_DATA, PARSING_SCHEMA_NAME, MODULE,
       ACTION, ELAPSED_TIME, CPU_TIME, BUFFER_GETS, DISK_READS, DIRECT_WRITES, ROWS_PROCESSED,
       FETCHES, EXECUTIONS, END_OF_FETCH_COUNT, OPTIMIZER_COST, OPTIMIZER_ENV, PRIORITY,
       COMMAND_TYPE, FIRST_LOAD_TIME, STAT_PERIOD, ACTIVE_STAT_PERIOD, OTHER, PLAN_HASH_VALUE
FROM table(dbms_sqltune.select_sql_trace(
             directory => 'TRACE',
             file_name => 'orcl_ora_14663.trc',
             select_mode => 2)) t;

 

DESC V;

 

set serveroutput on

exec print_table('select * from v') 

 

FORCE_MATCHING_SIGNATURE      : 0
SQL_TEXT                      : SELECT count(pad) FROM t WHERE id < :id
BIND_DATA                     :
PARSING_SCHEMA_NAME           : HR
MODULE                        :
ACTION                        :
ELAPSED_TIME                  : 853
CPU_TIME                      : 1000
BUFFER_GETS                   : 11
DISK_READS                    : 0
DIRECT_WRITES                 :
ROWS_PROCESSED                : 1
FETCHES                       : 2
EXECUTIONS                    : 1
END_OF_FETCH_COUNT            :
OPTIMIZER_COST                :
OPTIMIZER_ENV                 :
PRIORITY                      :
COMMAND_TYPE                  : 3
FIRST_LOAD_TIME               :
STAT_PERIOD                   :
ACTIVE_STAT_PERIOD            :
OTHER                         :
PLAN_HASH_VALUE               : 4294967295
-----------------

... 생략 ...

 

6.현재 유저에 의해 수행된 SQL, 경과시간, 수행 횟수 집계 

 

SELECT sql_id,
       sum(elapsed_time) AS elapsed_time,
       sum(executions) AS executions,
       round(sum(elapsed_time)/sum(executions)) AS elapsed_time_per_execution
FROM table(dbms_sqltune.select_sql_trace(
             directory => 'TRACE',
             file_name => 'orcl_ora_14663.trc',
             select_mode => 2)) t
WHERE parsing_schema_name = user
GROUP BY sql_id
ORDER BY elapsed_time DESC;

 

7.SQL 문장

 

SELECT sql_text
FROM table(dbms_sqltune.select_sql_trace(
             directory => 'TRACE',
             file_name => 'orcl_ora_14663.trc',
             select_mode => 2)) t
WHERE sql_id = 'asth1mx10aygn';

 

8.다양한 통계 확인

 

SELECT plan_hash_value, executions, fetches, elapsed_time, cpu_time, disk_reads, buffer_gets, rows_processed
FROM table(dbms_sqltune.select_sql_trace(
             directory => 'TRACE',
             file_name => 'orcl_ora_14663.trc',
             select_mode => 2)) t
ORDER BY elapsed_time DESC;

9.Bind 변수의 값 확인

 

(참고.bind 변수는 오라클에서 사용하는 용어이고, 다른 DBMS에서는 host 변수라고 부른다.)

 

col type format a20

SELECT elapsed_time,
       value(b).gettypename() AS type,
       value(b).accessnumber() AS value
FROM table(dbms_sqltune.select_sql_trace(
             directory => 'TRACE',
             file_name => 'orcl_ora_14663.trc',
             select_mode => 2)) t,
     table(bind_list) b
WHERE sql_id = 'asth1mx10aygn'
ORDER BY elapsed_time DESC;


10.실행계획 확인

 

begin
  dbms_sqltune.drop_sqlset('TEST');
end;
/

 

DECLARE
  c sys_refcursor;
BEGIN

  dbms_sqltune.create_sqlset('TEST');
  OPEN c FOR
    SELECT value(t)
    FROM table(dbms_sqltune.select_sql_trace(
               directory => 'TRACE',
               file_name => 'orcl_ora_14663.trc',
               select_mode => 2)) t;
  dbms_sqltune.load_sqlset('TEST', c);
  CLOSE c;
END;
/

 

SELECT *
FROM table(dbms_xplan.display_sqlset(
             sqlset_name => 'TEST',
             sql_id => 'asth1mx10aygn'
          ));

 

 

+ Recent posts