최근 금융사나 관공서의 차세대 프로젝트를 살펴보면 오라클 데이터베이스의 업그레이드 튜닝이 유독 많다.

오라클 9i나 10g에서 오라클 11g로의 업그레이드가 대부분이다.


데이터베이스 업그레이드가 단순한 앱 업데이트와 다름을 이제 고객도 이식하고 있다. 타사의 프로젝트에서 들려오는 무수한 장애 소식이 데이터베이스에 대한 인식을 바꾼 것이다.

 

오라클 데이터베이스를 업그레이드하면 기존에 잘 수행되던 SQL 실행 계획이 변함을 알고 있을 것이다. 해당 변화가 버전이 높을수록 더 많은 혜택을 주는 것이 대부분이지만, 간혹 발생하는 악성 SQL로 인한 장애는 이러한 이점을 상쇄시킨다. 그래서인지 많은 고객들이 업그레이드 튜닝을 수행에 앞서 모든 SQL에 대한 전수 조사를 원한다.

 

오라클 업그레이드 튜닝 절차

오라클 업그레이드 튜닝의 핵심은 미래 시스템에서 성능에 악영향을 줄 수 있는 SQL을 선별해 튜닝하는 것이다. 그렇다면 수천 또는 수만 개가 넘는 SQL에서 어떻게 이를 선별할 수 있을까? 프로젝트에 제공된 시간과 재원이 한정된 만큼 SQL 선정이 프로젝트의 성패까지 좌우할 수 있다.

 

● SQL 검토 대상 수집

기존 시스템에서 수행시간이 길거나 문제가 된 SQL은 차기 시스템에서도 악성으로 수행될 가능성이 높다. 그러므로 AWR이나 GV$SQL 뷰를 조회해 수행시간이 길거나 빠르지만 수행 횟수가 많은 SQL을 대상으로 튜닝 검토 대상을 선정한다.
오라클 AWR과 GV$SQL 딕셔너리 뷰를 이용해 SQL 전수 조사도 수행하자. 오라클 10g 이상 버전이라면 AWR 기능이 기본으로 제공된다. DBA가 설정한 기간(기본 7일) 동안 DBMS에서 수행된 SQL 정보가 기록돼 있는데, 기본 설정일 경우 1시간마다 수집되기때문에 그 사이에 수행됐던 SQL 정보가 메모리에서 SWAP OUT될 수 있다. 이 경우 AWR에 해당 SQL이 없을 수 있다. 이러한 빈틈을 매우기 위해 GV$SQL 뷰에서도 SQL을 수집해야 한다.
GV$SQL 뷰는 현재 메모리에 파싱된 SQL 정보를 확인할 수 있기 때문이다. 이러한 방법들을 통해 거의 사용되지 않는 SQL을 제외한 대부분의 검토 대상을 추출할 수 있다(<리스트 1> 참조).

AWR을 활용한 수집 방법은 'DBA_HIST_SQL' 키워드로 시작되는 시스템 테이블을 조회하면 된다.

 

<리스트 1> GV$SQL 뷰에서 검토 대상을 추출하는 SQL 예

SELECT PARSING_USER_ID,      /* SQL을 수행한 사용자 ID */
       PARSING_SCHEMA_NAME , /* SQL을 수행한 사용자명 */
       SQL_ID,               /* SQL ID */
       SQL_FULLTEXT          /* SQL 텍스트 전체 내용 */
       PLAN_HASH_VALUE,      /* SQL의 실행계획 해시 값 */
       CASE
            WHEN BIND_DATA IS NULL THEN 'N'
            ELSE 'Y'
       END BIND_DATA         /* 바인드 변수 정보 유무 */
       EXECUTIONS,           /* 수행 횟수 (DBMS 기동 후) */
       CHILD_NUMBER          /* SQL의 버전 번호 */
  FROM GV$SQL
 WHERE PARSING_SCHEMA_NAME NOT IN ('SYS','SYSMAN','SYS TEM','MAXGAUGE') /* 시스템 스키마 제외 */
   AND COMMAND_TYPE IN ('3')
   /* SELECT 유형 SQL만 추출 */
   /* 제외할 모듈 정보 (개발자 SQL 툴 또는 비업무성 계정이 수행한 SQL 등) */
   AND MODULE NOT LIKE '%Orange for ORACLE%'
   AND MODULE NOT LIKE '%sqlservr.exe%'
   AND MODULE NOT LIKE '%SQL Developer%'
   AND MODULE NOT LIKE '%oracle@mid01 (TNS V1-V3)%'
   AND MODULE NOT LIKE '%oracle@hvocidb01ud (TNS V1-V3)%'
   AND MODULE NOT LIKE '%oracle@hscerpdb (TNS V1-V3)%'   /* 제외할 SQL 텍스트 정보 */'
   AND SQL_FULLTEXT NOT LIKE '%DBMS_%' AND SQL_FULLTEXT NOT LIKE 'EXEC % ';

 

● 실행 계획 수집

이제 튜닝 검토 대상인 SQL을 모두 수집했다. 지금부터 할 일은 해당 SQL에 대한 실행 계획을 수립하는 것이다.

오라클 버전 업그레이드 시 SQL 실행 계획이 변경되는 대상을 선별하는 것이 목적이므로 해당 TASK는 필수 과정이 아닐 수 없다.

앞서 추출한 SQL의 (SQL_ID,PLAN_HASH_VALUE) 값을 이용해 실행 계획 정보가 담긴 테이블을 조회하면 현 시스템에서 실제 수행됐던 실행 계획을 간단히 추출할 수 있다.

 

<리스트 2> AWR을 이용한 SQL 실행 계획 추출

SELECT SQL_ID
       ,PLAN_HASH_VALUE,
       ,ID
       ,PARENT_ID
       ,OPERATION
       ,OPTION
       ,OBJECT_NAME
  FROM DBA_HIST_SQL_PLAN
 WHERE (SQL_ID, PLAN_HASH_VALUE) IN (SELECT SQL_ID, PLAN_HASH_VALUE FROM 튜닝검토대상);

 

 

<리스트 3> PL/SQL을 이용한 미래 시스템에서의 실행 계획 수집

SQL>CREATE TABLE PLAN_EXEC_ERR (SQL_ID VARCHAR2(100), ERROR_TEXT VARCHAR2(1000));
     DECLARE v_schema VHARCHAR2(32);
     v_sql_text CLOB;
     v_commit VARCHAR2(32);
     v_sql_err VARCHAR2(100);
     CURSOR c_sql IS SELECT SQL_ID,
                            SQL_TEXT,
                            PARSING_SCHEMA_NAME
                       FROM 튜닝검토대상SQL;
     BEGIN v_commit := 'COMMIT';
     FOR r_sql IN c_sql
     LOOP BEGIN v_schema := 'ALTER SESSION SET CURRENT_SCHEMA = '||r_sql.PARSING_SCHEMA_NAME;
     v_sql_text := 'EXPLAIN PLAN SET STATEMENT_ID= '''|| r_sql.SQL_ID || ''' INTO PLAN_TABLE_TUN FOR ' || r_sql.SQL_TEXT;
     v_sql_err := 'INSERT INTO KHCHOI.ERR_SQL(sql_ id, sql_err) VALUES(''' || r_sql.SQL_ID|| '''';
     EXECUTE IMMEDIATE v_schema;
     EXECUTE IMMEDIATE v_sql_text;
     EXCEPTION
          WHEN OTHERS THEN EXECUTE IMMEDIATE v_sql_ err||','''||SUBSTR(SQLERRM, 11, 200)||''')';
   END;
    EXECUTE IMMEDIATE v_commit;

   END LOOP;
   END;

 

 

<리스트 4> 튜닝 검토 대상 필터링

/* 서로 다른 시스템에서 수집된 실행 계획 비교 */
SELECT A.SQL_ID as SQL_ID
       ,NVL(A.ID, B.ID) as 현행_실행계획_ID
       ,A.OPERATIONS as 현행_실행계획_내용
       ,NVL(B.ID, A.ID) as 미래_실행계획_ID
       ,B.OPERATIONS as 미래_실행계획_내용
  FROM (SELECT SQL_ID
               ,ID
               ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
          FROM 현행_수집_실행계획) A
        FULL OUTER JOIN
        (SELECT SQL_ID
                ,ID
                ,LPAD(' ', 1 + DEPTH * 3,' ') || OPERATION || ' ' || OPTIONS as OPERATIONS
           FROM 미래_수집_실행계획) B
        ON (A.SQL_ID = B.SQL_ID AND A.ID = B.ID)
 WHERE TRIM(A.OPERATIONS) <> TRIM(B.OPERATIONS)
 /* 실행계획이 다름을 비교하는 부분 */
    OR A.SQL_ID IS NULL
    OR B.SQL_ID IS NULL ;

 

<리스트 2>에서 만약 메모리 상주 SQL의 실행 계획을 추출하고자 하면 DBA_HIST_SQL_PLAN의 대상인 GV$SQL_PLAN을 이용하면 된다.

SQL 실행 계획을 추출했다고 아직 끝난 것은 아니다. 업그레이드된 시스템의 실행 계획도 추출이 아직 남아 있다.
하지만 해당 시스템에서는 수집된 SQL이 수행된 적이 없기 때문에 이러한 계획을 그냥 얻을 수 없다. 반드시 1회 이상 수행해 업그레이드된 시스템의 오라클 옵티마이저가 선택한 실행 계획을 생성해야 한다.

이를 위한 선행 작업으로 현행 시스템의 모든 오브젝트 및 데이터를 미래 시스템으로 이관해야 한다.

옵티마이저가 올바른 판단을 할 수 있는 강력한 무기가 바로 통계정보이므로 통계 정보도 최신으로 갱신해야 한다.

 

선행 작업까지 마무리됐다면 앞서 수집했던 SQL_FULLTEXT 정보를 이용해 실행 계획을 미래 시스템에서 수집하자. 일일이 수행할 필요없다. PL/SQL을 활용하면 일괄 수행이 가능하다.

 

 

● 실행 계획 비교

이제 모든 재료가 준비됐다. 마지막으로 수행할 일은 현행과 미래 시스템에서 수집된 SQL의 실행 계획 중 달라지는 SQL을 추출하는 것이다.

예외적으로 LITERAL SQL을 많이 이용하는 시스템을 제외하면 보통 10~20% 정도의 SQL 실행 계획이 변경된다. 이중에서도 상당 수는 오라클 버전 업그레이드를 통한 수행속도 향상 혜택을 얻게 되지만 그렇지 않은 경우도 있다.

이를 대비하기 위해 1차적으로 실행 계획이 달라진 모든 SQL을 검토해야 한다.
그러면 수집된 SQL 실행 계획을 서로 비교하는 <리스트 4>를 통해 튜닝 검토 대상을 최종적으로 필터링해 보자.

 

ASM DB Startup / Shutdown Guide

 

 

Startup 절차는 CRS > ASM > DB 순서대로 Startup 하고,

Shutdown 절차는 DB > ASM > CRS 순서대로 Shutdown 하도록 한다.

 

CRS Startup

[root@asmdb /]# su - grid

[grid@asmdb bin]$ ./crs_stat -t

Name Type Target State Host

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

ora.DATA.dg ora....up.type OFFLINE OFFLINE

ora....ER.lsnr ora....er.type ONLINE ONLINE asmdb

ora.asm ora.asm.type OFFLINE OFFLINE

ora.asmdb.db ora....se.type OFFLINE OFFLINE

ora.cssd ora.cssd.type ONLINE OFFLINE

ora.diskmon ora....on.type ONLINE OFFLINE

ora.evmd ora.evm.type ONLINE ONLINE asmdb

ora.ons ora.ons.type OFFLINE OFFLINE

[grid@asmdb bin]$

[grid@asmdb bin]$ ./crsctl start resource ora.cssd

CRS-2672: Attempting to start 'ora.cssd' on 'asmdb'

CRS-2672: Attempting to start 'ora.diskmon' on 'asmdb'

CRS-2676: Start of 'ora.diskmon' on 'asmdb' succeeded

CRS-2676: Start of 'ora.cssd' on 'asmdb' succeeded

 

ASM Startup

[root@asmdb /]# su - grid

[grid@asmdb bin]$ sqlplus '/as sysasm'

SQL*Plus: Release 11.2.0.2.0 Production on Fri Jan 3 23:50:44 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to an idle instance.

 

SQL>

SQL> startup

ASM instance started

 

Total System Global Area 284565504 bytes

Fixed Size 1343692 bytes

Variable Size 258055988 bytes

ASM Cache 25165824 bytes

ASM diskgroups mounted

SQL>

 

 

 

DataBase Startup

[oracle@asmdb ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.2.0 Production on Fri Jan 3 23:51:43 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to an idle instance.

 

SQL>

SQL> startup

ORACLE instance started.

 

Total System Global Area 849530880 bytes

Fixed Size 1347480 bytes

Variable Size 507510888 bytes

Database Buffers 335544320 bytes

Redo Buffers 5128192 bytes

Database mounted.

Database opened.

 

DataBase Shutdown

[oracle@asmdb ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.2.0 Production on Fri Jan 3 23:53:02 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

 

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

ASM Shutdown

[grid@asmdb ~]$ sqlplus '/as sysasm'

SQL*Plus: Release 11.2.0.2.0 Production on Fri Jan 3 23:54:03 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

With the Automatic Storage Management option

 

SQL> shutdown immediate;

ASM diskgroups dismounted

ASM instance shutdown

 

 

CRS Shutdown

[root@asmdb /]# su - grid

[grid@asmdb ~]$ crsctl stop resource ora.cssd

CRS-2673: Attempting to stop 'ora.cssd' on 'asmdb'

CRS-2677: Stop of 'ora.cssd' on 'asmdb' succeeded

 

[참고] 유저 생성

 DB Instance를 관리할 oracle 유저와 ASM Instance를 관리할 grid 유저를 생성한다.

groupadd g 1000 oinstall

groupadd g 1100 dba

groupadd g 1200 oper

groupadd g 1300 asmadmin

groupadd g 1400 asmoper

groupadd g 1500 asmdba

 

useradd g oinstall G dba,asmdba,oper oracle

useradd g oinstall G asmadmin,asmdba,asmoper,oper,dba grid

 



출처: https://sanai200.tistory.com/57 [늅늅이의 시스템 운영 따라하기]

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

파티션 Table 전환 (dbms_redefinition / Mview)  (0) 2019.11.20
Logdump Utility  (0) 2019.11.13
ASM - Tablespace 관리하기  (0) 2019.10.21
oracle 18c object 통계 정보 수집  (0) 2019.10.18
Log miner  (0) 2019.09.25

1. tablespace 생성하기 (ts_new 생성하기)
 
① 조회

SQL> show parameter db_create_file_dest;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      +DATA


 
 
② 생성

SQL> create tablespace ts_new datafile size 10M;
 
SQL>
set line 200
col tablespace_name for a10
col mb for 999
col file_name for a60
select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +DATA/testdb/datafile/ts_new.266.776453331  ← 새로 추가됨


 
 
 


2. 데이터 파일 추가하기
 

SQL> alter tablespace ts_new add datafile size 5M;
 
SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +DATA/testdb/datafile/ts_new.266.776453331
TS_NEW        5 +DATA/testdb/datafile/ts_new.267.776453579


 
 

※ 참고
Cf. 테이블스페이스나 데이터파일을 추가할때, 따로 데이터파일을 지정하지 않는다.

- 기존 file system 에서
: SQL> create tablespace ts_new datafile '/DIR/ts_new01.dbf' size 10M;
  SQL> alter tablespace ts_new add datafile '/DIR/ts_new02.dbf' size 5M;
 
- ASM 에서
: SQL> create tablespace ts_new datafile size 10M;
  SQL> alter tablespace ts_new add datafile size 5M;
 
▶ ASM에서 파일을 관리해준다.


 
 
 
 
 
3. offline 되는 데이터 파일 이동하기
 : ts_new 를 +DATA 에서 +FRA 로 이동시킴
 


① 현재 디스크 그룹 확인하기
 

+ASM> select name, state, type, total_mb, free_mb from v$asm_diskgroup;
 
NAME                                                         STATE                  TYPE           TOTAL_MB    FREE_MB
------------------------------------------------------------ ---------------------- ------------ ---------- ----------
DATA                                                         MOUNTED                EXTERN             9209       8309
FRA                                                          MOUNTED                EXTERN             3074       2847
NEW_ASM                                                      MOUNTED                EXTERN             2560       2510


 
 
 

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +DATA/testdb/datafile/ts_new.266.776453331
TS_NEW        5 +DATA/testdb/datafile/ts_new.267.776453579
 
6 rows selected.


 
 

 
② 해당 테이블스페이스(ts_new) offline
 

SQL> alter tablespace ts_new offline;
 
SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW          +DATA/testdb/datafile/ts_new.266.776453331   ← 용량 안보임
TS_NEW          +DATA/testdb/datafile/ts_new.267.776453579   ← offline 완료


 
 

 
③ RMAN으로 데이터 파일 복사하기
 

$ rman target /
rman: can't open target


 

※ 참고
10g에서 RMAN 실행 시키면 아래의 에러가 나는경우
$ rman target /
rman: can't open target
 : 원래 실행되는 RMAN 실행 파일은 $ORACLE_HOME/bin/rman 인데 리눅스의 경우 oracle을 설치 한 후 RMAN 파일을 조회해보면,
다른 경로에 있는 경우가 있다. 아래처럼 조치해 주면됨 (못쓰는 RMAN을 쓸수있는 RMAN으로 덮어 씌운다)
 
$ su -
Password:
# which rman
/usr/X11R6/bin/rman
[root@server110 ~]# cp /home/oracle/product/10g/bin/rman /usr/X11R6/bin/
cp: overwrite `/usr/X11R6/bin/rman'? y
[root@server110 ~]# exit
logout


 

$ rman target /
 
Recovery Manager: Release 10.2.0.5.0 - Production on Tue Feb 28 17:50:37 2012
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
connected to target database: TESTDB (DBID=2559693415)
 
 
 
RMAN> copy datafile '+DATA/testdb/datafile/ts_new.266.776453331' to '+FRA';
 
Starting backup at 28-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=143 devtype=DISK
channel ORA_DISK_1: starting datafile copy
input datafile fno=00005 name=+DATA/testdb/datafile/ts_new.266.776453331
output filename=+FRA/testdb/datafile/ts_new.260.776454711 tag=TAG20120228T175149 recid=1 stamp=776454711
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 28-FEB-12
 
 
 
RMAN> copy datafile '+DATA/testdb/datafile/ts_new.267.776453579' to '+FRA';
 
Starting backup at 28-FEB-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile fno=00006 name=+DATA/testdb/datafile/ts_new.267.776453579
output filename=+FRA/testdb/datafile/ts_new.261.776454737 tag=TAG20120228T175217 recid=2 stamp=776454738
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 28-FEB-12


 
 
 
 

※ 참고 - 주의!!!!!
 : RMAN에서 복사해주면 경로만 바뀌는게아니라 파일이름도 함께바뀐다.
SQL> alter database rename file '+DATA/testdb/datafile/ts_new.266.776453331'
  2  to '+FRA/testdb/datafile/ts_new.266.776453331';
alter database rename file '+DATA/testdb/datafile/ts_new.266.776453331'
*
ERROR at line 1: ← 그런파일 없다고 에러난다.
ORA-01511: error in renaming log/data files
ORA-01141: error renaming data file 5 - new file '+FRA/testdb/datafile/ts_new.266.776453331' not found
ORA-01110: data file 5: '+DATA/testdb/datafile/ts_new.266.776453331'
ORA-17503: ksfdopn:2 Failed to open file +FRA/testdb/datafile/ts_new.266.776453331
ORA-15173: entry 'ts_new.266.776453331' does not exist in directory 'datafile'

▶ 위의 copy과정에 진하게 표시해 놓은 부분을 보면 +FRA로 경로가 이동된 파일의 파일 이름도 달라 졌음을 확인할 수 있다. 


 
 


④ 내용 바꿔주고 테이블스페이스(ts_new) online
 

SQL>
alter database rename file '+DATA/testdb/datafile/ts_new.266.776453331'
to '+FRA/testdb/datafile/ts_new.260.776454711';
 
Database altered.
 
SQL>
alter database rename file '+DATA/testdb/datafile/ts_new.267.776453579'
to '+FRA/testdb/datafile/ts_new.261.776454737';
  
SQL> alter tablespace ts_new online;


 
 

 
⑤ 경로바뀌었나 조회해 보기
 

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +FRA/testdb/datafile/ts_new.260.776454711
TS_NEW        5 +FRA/testdb/datafile/ts_new.261.776454737
 
6 rows selected.


 
 
 
 
 
 
 
4. offline 안되는 데이터 파일 이동하기
 : SYSTEM 을 +FRA 로 이동하기
 


① 현재 상태 확인
 

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +DATA/testdb/datafile/system.260.776365321
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +FRA/testdb/datafile/ts_new.260.776454711
TS_NEW        5 +FRA/testdb/datafile/ts_new.261.776454737
 
6 rows selected.


 
 


② DB 종료 후 RMAN 으로 복사하기
 

SQL> shutdown immediate;
SQL> exit
$ rman target /
 
RMAN> startup mount;
 
RMAN> copy datafile '+DATA/testdb/datafile/system.260.776365321' to '+FRA';
 
Starting backup at 28-FEB-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=157 devtype=DISK
channel ORA_DISK_1: starting datafile copy
input datafile fno=00001 name=+DATA/testdb/datafile/system.260.776365321
output filename=+FRA/testdb/datafile/system.262.776456133 tag=TAG20120228T181532 recid=3 stamp=776456152
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
Finished backup at 28-FEB-12


 
 


③ 내용 바꿔주고 DB open
 

$ sqlplus / as sysdba
 
SQL>
alter database rename file '+DATA/testdb/datafile/system.260.776365321'
to '+FRA/testdb/datafile/system.262.776456133';
 
SQL> alter database open;


 
 
 

④ 경로바뀌었나 조회해 보기
 

SQL>
set line 200
col tablespace_name for a10
col mb for 999
col file_name for a60
select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
 
TABLESPACE   MB FILE_NAME
---------- ---- ------------------------------------------------------------
SYSTEM      300 +FRA/testdb/datafile/system.262.776456133
UNDOTBS1    200 +DATA/testdb/datafile/undotbs1.261.776365357
SYSAUX      120 +DATA/testdb/datafile/sysaux.262.776365365
USERS         5 +DATA/testdb/datafile/users.264.776365391
TS_NEW       10 +FRA/testdb/datafile/ts_new.260.776454711
TS_NEW        5 +FRA/testdb/datafile/ts_new.261.776454737
 
6 rows selected.


 

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

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

Logdump Utility  (0) 2019.11.13
ASM DB Startup / Shutdown Guide  (0) 2019.10.23
oracle 18c object 통계 정보 수집  (0) 2019.10.18
Log miner  (0) 2019.09.25
FGA(Fine-Grained Auditing) DBMS_FGA AUDIT..  (0) 2019.08.30

SQL Profile

SQL Profile은 Oracle 10g부터 도입된 기능으로 그 내부는 Stored Outline과 유사한 방식으로 구현됐다. Stored Outline이 실행계획을 고정해 튜닝하는 것이 목적이라고 본다면 SQL Profile은 실질적인 SQL Tuning이라고 보면 되며 그 절차는 다음과 같다.

  • 1. 성능 이슈가 있는 SQL의 실행계획에서 쿼리 블록을 가리키는 SEL$ 정보를 확인한다.
  • 2. 튜닝된 SQL의 실행계획에서 쿼리 블록을 가리키는 SEL$ 정보를 확인한다.
  • 3. 튜닝하고자 하는 SEL$ 정보에 대한 수정 부분을 Hidden Procedure인 DBMS_SQLTUNE. IMPORT_SQL_PROFILE을 이용해 수정한다.
  • 4. Outline을 적용 후 실행계획이 의도대로 변경됐는지를 확인한다.

SQL Profile을 이용하는 튜닝 절차는 Stored Outline과 조금 다르지만 Outline을 변경해 튜닝한다는 점에서 그 기능이 유사하다.

튜닝할 부분의 Outline 구간을 정확히 인식한다면 Stored Outline보다 쉽게 변경할 수 있는 장점이 있다.

그럼 이를 이용해 어떻게 튜닝을 진행하면 되는지 알아보자. [리스트 1]은 실행계획 및 SQL_ID와 Outline을 확인하는 단계로 성능 이슈가 있는 구간을 탐색하는 방법을 보여주고 있다. 이 예제에서는 성능 이슈가 중첩루프 조인에서 발생된다고 가정해보자.

  • [리스트 1] 성능 이슈가 되는 SQL 구문 조회
  • ?

    SELECT /*+ USE_NL(A B) */

           A.EMPLOYEE_ID, A.FIRST_NAME, B.DEPARTMENT_ID, B.DEPARTMENT_NAME

      FROM EMPLOYEES A, DEPARTMENTS B

     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID

       AND A.JOB_ID = 'SA_REP' AND A.DEPARTMENT_ID > 1;

        

        

    -- 생략 --

    SELECT PLAN_TABLE_OUTPUT 

      FROM TABLE(dbms_xplan.DISPLAY_CURSOR('', '', 'OUTLINE'));

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

    SQL_ID  88j03p40kgkwt, child number 0

     

     

    /*+   -- 생략 --

    ALL_ROWS

    OUTLINE_LEAF(@"SEL$1")

    INDEX_RS_ASC(@"SEL$1" "B"@"SEL$1" ("DEPARTMENTS". "DEPARTMENT_ID"))

    INDEX(@"SEL$1" "A"@"SEL$1" ("EMPLOYEES"."JOB_ID" "EMPLOYEES"."DEPARTMENT_ID"))

    LEADING(@"SEL$1" "B"@"SEL$1" "A"@"SEL$1")

    USE_NL(@"SEL$1" "A"@"SEL$1")

    END_OUTLINE_DATA

    */

[리스트 2]는 [리스트 1]을 튜닝한 결과에 대해 실행계획 및 Outline을 확인하는 단계를 보여준다. 이 예제에서는 성능 이슈를 해시 조인으로 해결한다고 가정해보자.

  • [리스트 2] 성능 이슈가 되는 SQL 구문 튜닝
  • ?

    SELECT /*+ USE_HASH(A B) */

           A.EMPLOYEE_ID, A.FIRST_NAME, B.DEPARTMENT_ID, B.DEPARTMENT_NAME

      FROM EMPLOYEES A, DEPARTMENTS B

     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID

       AND A.JOB_ID = 'SA_REP' 

       AND A.DEPARTMENT_ID > 1;

        

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

    |   0 | SELECT STATEMENT                |               | 

    |*  1 |  HASH JOIN                      |               | 

    |   2 |   TABLE ACCESS BY INDEX ROWID   | DEPARTMENTS   |

    |*  3 |    INDEX RANGE SCAN             | DEPT_ID_PK    |

    |*  4 |   TABLE ACCESS FULL             | EMPLOYEES     |

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

     

     

    SELECT PLAN_TABLE_OUTPUT 

      FROM TABLE(dbms_xplan.DISPLAY_CURSOR('', '', 'OUTLINE')) ;

      /*+  -- 생략 --

          ALL_ROWS

          OUTLINE_LEAF(@"SEL$1")

          INDEX_RS_ASC(@"SEL$1" "B"@"SEL$1" ("DEPARTMENTS". "DEPARTMENT_ID"))

          FULL(@"SEL$1" "A"@"SEL$1")

          LEADING(@"SEL$1" "B"@"SEL$1" "A"@"SEL$1")

          USE_HASH(@"SEL$1" "A"@"SEL$1")

          END_OUTLINE_DATA

     */

[리스트 3]은 성능 이슈 SQL_ID의 FULLTEXT를 찾아 이슈 구간의 쿼리 블록을 가리키는 SEL$ 정보에 대해 튜닝 적용 후의 Profile 정보로 등록해주는 예제다.

  • [리스트 3] Profile 수정
  • ?

    declare L_SQLTEXT CLOB;

    begin

    -- 튜닝전 SQL_ID

    SELECT SQL_FULLTEXT INTO L_SQLTEXT

      FROM V$SQL

     WHERE SQL_ID='88j03p40kgkwt';

       

      dbms_sqltune.import_sql_profile

      ( sql_text=> L_SQLTEXT

      , profile => sqlprof_attr('USE_HASH(@"SEL$1" "A"@"SEL$1")') );

    end;  /

[리스트 4]는 [리스트 3]에서 Profile 등록 후 동일한 SQL이 재수행될 때 SQL Profile(SYS_SQLPROF_014efe78724 e0006)을 참조해 실행계획이 수행되는지를 보여주는 예제다.

  • [리스트 4] 중첩루프 조인 시 SQL Profile을 참조해 해시 조인으로 수행
  • ?

    SELECT /*+ USE_NL(A B) */

           A.EMPLOYEE_ID, A.FIRST_NAME, B.DEPARTMENT_ID, B.DEPARTMENT_NAME

      FROM EMPLOYEES A, DEPARTMENTS B

     WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID

       AND A.JOB_ID = 'SA_REP' AND A.DEPARTMENT_ID > 1;

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

    |   0 | SELECT STATEMENT                 |               |

    |*  1 |  HASH JOIN                       |               |

    |   2 |   TABLE ACCESS BY INDEX ROWID    | DEPARTMENTS   |

    |*  3 |    INDEX RANGE SCAN              | DEPT_ID_PK    | 

    |*  4 |   TABLE ACCESS FULL              | EMPLOYEES     |  

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

    Note

    - SQL profile "SYS_SQLPROF_014efe78724e0006" used for this statement

비교적 간단하게 Outline 수정으로 실행계획을 최적으로 유도해 성능을 개선하는 방법을 설명했다.

이는 긴급하게 성능 개선이 필요할 때 유용하게 쓰일 수는 있으나 Outline은 의미 그대로 요약본을 저장하고 있다가 이를 참조해 실행계획을 수립하는 것이므로 상황에 따라 옵티마이저에 의해 100% 동작하지 않을 수 있음을 감안해야 한다.

 

여러분이 관리하는 운영 시스템에서 수정이 불가한 애플리케이션에 문제가 발생했을 때 이런 제어 방법을 알고 있다면 장애요인 예방이나 안정적인 운영에 큰 도움이 되리라 생각한다.

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

피벗(2) - PIVOT, UNPIVOT, (행을 열로, 열을 행으로)  (0) 2020.12.29
FETCH .. BULK COLLECT INTO  (0) 2020.07.22
SQL trace _ 참조  (0) 2019.10.02
복수행 함수 (그룹 함수)  (0) 2018.12.13
윈도우 함수(WINDOW FUNCTION)  (0) 2018.11.01

1. 수집 프로시저

dbms_stats.gather_schema_stats(~~)

dbms_stats.gather_table_stats(~~)

dbms_stats.gather_index_stats(~~)

dbms_stats.gather_column_stats(~~)

 

함수에 파라미터는 des dbms_stats으로 확인

 

2. 수집 정책 지정

dbms_stats.set_database_prefs
dbms_stats.set_schema_prefs
dbms_stats.set_table_prefs

 

* column일 경우 아래와 같이 histgram 관련 설정

exec dbms_stats.set_table_prefs(
  ownname=>'TEST',
  tabname=>'TEST',
  pname=>'method_opt',
  pvalue=>'FOR COLUMNS OBJECT_TYPE SIZE 1');

 

3. 수집 통계 export and import

dbms_stats.export_schema_stats(~~)

dbms_stats.export_table_stats(~~)

dbms_stats.export_index_stats(~~)


dbms_stats.import_schema_stats(~~)

dbms_stats.import_table_stats(~~)

dbms_stats.import_index_stats(~~)

 

* 파티션일 경우 기 통계 정보 신규 파티션으로 복사

dbms_stats.cop_table_stats(~~)

 

4. table  통계 정보 수집예

exec dbms_stats.gather_table_stats('user','test');
exec dbms_stats.create_stat_table('admin','stattab');
exec dbms_stats.exprot_table_stats('user', 'test', stattab=>'stattab', statown=>'admin');
delete from test;
exec dbms_stats.import_table_stats('test','test',stattab=>'stattab', statown=>'admin');

 



출처: https://semode.tistory.com/419?category=662330 [세모데]

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

ASM DB Startup / Shutdown Guide  (0) 2019.10.23
ASM - Tablespace 관리하기  (0) 2019.10.21
Log miner  (0) 2019.09.25
FGA(Fine-Grained Auditing) DBMS_FGA AUDIT..  (0) 2019.08.30
Direct Insert 로 Redo를 줄이기  (0) 2019.05.15

1. ogg 설치 ( silent 설치 )

  

  ./runInstaller -silent -waitForCompletion -responseFile /tmp/oggcore.rsp

  

   [oggcore]

 

   INSTALL_OPTION=ORA12c

   SOFTWARE_LOCATION=/ogg

   DATABASE_LOCATION=/u01/db

   INVENTORY_LOCATION=/u01/oraInventory

   UNIX_GROUP_NAME=oinstall

 

 

2. 설정

  

1) 테이블 스페이스 생성

   -- create tablespace tbsdat01 datafile "/tmp/test1.dat" size 1g;

 

2) ogg 계정 생성

   create user ogg identified by 'ogg'

   default tablespace tbs_ogg_dat temporary tablespace temp;

 

3) ogg 권한 부여 

   grant connect, resource to ogg;

   grant select any dictionary, select any table to ogg;  

   grant create table to ogg;

   grant flashback any table to ogg;

   grant execute on dbms_flashback to ogg;

   grant execute on utl_file to ogg;

   grant create any table to ogg;

   grant insert any table to ogg;

   grant update any table to ogg;

   grant delete any table to ogg;

   grant drop any table to ogg;

 

   GRANT CREATE SESSION, CONNECT, RESOURCE, ALTER SYSTEM TO ogg;

   EXEC DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGE(grantee=>'ogg');

 

   dbms_goldengate_auth.grant_admin_privilege

   grant_admin_privilege('ggadm')  

   grant_admin_privilege('ggadm',grant_select_privileges=>true)  => 11.2.0.3 이전

 

   # check point 정보 기록 테이블 생성

   dblogin userid ogg 

   add checkpointtable

    

 

  4) DB 설정 변경

   SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI, supplemental_log_data_min, supplemental_log_data_fk,          supplemental_log_data_all, FORCE_LOGGING FROM v$database;

 

   위에 쿼리 조회시 no로 나타나면 아래 명령어 수행

   ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

   ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

   ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

 

  5) ogg wallet 구성 (필요하면...)

   add credentialstore

   alter credentialstore add user ogg password xxxxxx alias ogg 

 

  6) DB 파라미터 변경

    enable_goldengate_replication  (parameter)

 

 

  7) DB PK 및 로깅 확인

 

    -- pk, uk check

    select t.table_name from dba_tables t where t.owner='HR' and

    t.table_name in ('COUNTRIES','DEPARTMENTS','EMPLOYEES','JOB_HISTORY','JOBS','LOCATIONS','REGIONS')

    minus

    select c.table_name from dba_constraints c where c.owner='HR' and c.constraint_type in ('P','U')

 

    -- logging check

    select table_name from dba_tables where owner='HR' and logging='NO' and table_name in        ('COUNTRIES','DEPARTMENTS','EMPLOYEES','JOB_HISTORY','JOBS','LOCATIONS','REGIONS')

 

 

     begin

     for r in ( select table_name from dba_tables where owner='HR' and logging='NO' and table_name in      ('COUNTRIES','DEPARTMENTS','EMPLOYEES','JOB_HISTORY','JOBS','LOCATIONS','REGIONS')) loop

         execute immediate 'alter table hr.'|| r.table_name ||' LOGGING';

     end loop;

     end;

 

 

   8) ogg 설정

      테이블 또는 스키마에 대한 로깅 설정

 

      -- 테이블

      add schematrandata hr

 

      -- 스키마

      info schematrandata hr

      info trandata hr.EMPLOYEES

 

      select owner, log_group_name, table_name

      from dba_log_groups where owner = 'HR';

 

       select * from table(logmnr$always_suplog_columns('SCHEMAUSER','HR'));

 

       -- replicat(타켓)쪽 check point 테이블 생성

       ADD CHECKPOINTTABLE

 

 

3. ogg extract/pump/replicat 설정

 

--- exttrail

EXTRACT finance

USERIDALIAS tiger1 

LOGALLSUPCOLS

ENCRYPTTRAIL AES192

EXTTRAIL /ggs/dirdat/lt

SEQUENCE hr.employees_seq;

TABLE hr.*;

 

 

DBOPTIONS DECRYPTPASSWORD AACAAAAAAAAAAAIALCKDZIRHOJBHOJUH AES256 ENCRYPTKEY mykey1

 

 

 

--- datapump

EXTRACT extpump

USERIDALIAS tiger1

RMTHOST fin1, MGRPORT 7809 ENCRYPT AES192, KEYNAME securekey2

RMTTRAIL /ggs/dirdat/rt

SEQUENCE hr.employees_seq;      (SOURCECATALOG pdb1)

TABLE hr.*;

 

 

--- replicat

REPLICAT financer

USERIDALIAS tiger2

ASSUMETARGETDEFS

MAP hr.*, TARGET hr2.*;

 

 

4. TDE 적용시 적용

sqlplus sys/as sysdba

"@?/app/oracle/product/orcl111/rdbms/admin/prvtclkm.plb"

GRANT EXECUTE ON DBMS_INTERNAL_CLKM TO psmith;

 

orapki wallet create -wallet . -auto_login[_local] 

mkstore -wrl . -createEntry ORACLE.TDE.HSM.AUTOLOGIN non-empty-string

mkstore -wrl ./ -createEntry ORACLE.SECURITY.CL.ENCRYPTION.ORACLEGG

 

mkstore -wrl . -list

출처: https://semode.tistory.com/261?category=663959 [세모데]

'ORACLE > 이중화(HA)' 카테고리의 다른 글

[OGG] FILTER 데이터 선택  (0) 2024.01.20
OGG 파일 설정  (0) 2022.11.30
integrated extract 구성  (0) 2019.10.18
parallel replicat  (0) 2019.10.18
OGG 연동 TABLE 누락으로 EXP/IMP/OGG Merge  (0) 2019.08.01

1. integrated extract 구조

 

 

2. integrated extract views

 

1) gv$goldengate_capture

 

2) v$logmnr_session

 

3) v$logmnr_stats

 

4) dba_xstream_outbound_progress,  gv$xstream_outbound_server

 

3. 구성 절차

 

1) 스트림풀 설정

 

ALTER SYSTEM SET streams_pool_size=5000M;

 

 

2) 권한 설정

 

BEGIN

  dbms_goldengate_auth.grant_admin_privilege

  (

    grantee => 'ogg',

    privilege_type => 'CAPTURE',

    grant_select_privileges => TRUE

  );

END;

/

 

3) 등록

 

DBLOGIN USERID ogg PASSWORD ogg

REGISTER EXTRACT ext1 DATABASE

 

 

4) 시작

 

ADD EXTRACT ext1 INTEGRATED TRANLOG, BEGIN NOW

 

start ext1



출처: https://semode.tistory.com/325?category=663959 [세모데]

'ORACLE > 이중화(HA)' 카테고리의 다른 글

OGG 파일 설정  (0) 2022.11.30
OGG 12c 설치 구성  (0) 2019.10.18
parallel replicat  (0) 2019.10.18
OGG 연동 TABLE 누락으로 EXP/IMP/OGG Merge  (0) 2019.08.01
[OGG] 트레일파일 오류  (0) 2019.05.16

target database에 병렬로 transaction 반영하기 위해 12.3부터 새롭게 등장한 기능

 

1. 구성도

2가지 type을 사용가능하고 ogg12.3 이상만 사용가능

- integrated parallel replicat

- non-integrated parallel repilcat

 

2. 설정 파일(parameter file)

 

각 replicat 종류별 설정 차이는 아래와 같음

 

3.  프로세스 추가

add replicat rep1, parallel, exttrail ./dirdat/et

 

 

db 에서 checkpoint 테이블 확인

 

select * from ogg.chkpt_rep1;    (자기 이름으로 chekpoint 테이블 생성)

 



출처: https://semode.tistory.com/356?category=663959 [세모데]

'ORACLE > 이중화(HA)' 카테고리의 다른 글

OGG 12c 설치 구성  (0) 2019.10.18
integrated extract 구성  (0) 2019.10.18
OGG 연동 TABLE 누락으로 EXP/IMP/OGG Merge  (0) 2019.08.01
[OGG] 트레일파일 오류  (0) 2019.05.16
[OGG] LOGDUMP  (0) 2019.05.16

* SQL 수행동안 oracle engine의 activity에 대한 로그정보

 

1. 로그 파일 위치

select value from v$diag_info where name='Default Trace File';

 

2. sql trace 생성

alter session set events '10046 trace name context forever, level 64';

select count(*) from test;

alter session set events '10046 trace name context off'

 

or

 

alter session set sql_trace=true;

select count(*) from test;

alter session set sql_trace=false;

 

3. 결과분석

위에 생성된 trace 파일을 가지고 report 생성

tkprof test_ora_4857_10046.trc  test_ora_4857_10046.txt

 

(1) 자기 세센에 트레이스 걸기

  1. 현재 자신이 접속해 있는 세션에만 트레이스 설정

    SQL> alter session set sql_trace = true;

    SQL> SELECT * FROM emp WHERE empno = 7788;

    SQL> SELECT * FROM dual;

    SQL> alter session set sql_trace = false;

    ** user_dump_dest에 지정된 디렉토리 밑에 트레이스(.trc) 파일이 생성됨

  2. 트레이스 파일찾는 스크립트 실행(trc 파일의 이름이 출력된다)

    SELECT r.value || '/' || LOWER(t.instance_name) || '_ora_' || ltrim(to_char(p.spid)) || '.trc' trace_file

    FROM v$process p, v$session s, v$parameter r, v$instance t

    WHERE p.addr = s.paddr

    AND r.name = 'user_dump_dest'

    AND s.sid = (SELECT sid FROM v$mystat WHERE rownum = 1) ;

     

     

     

     

     

     

    * TRACE_FILE 

    ----------------------------------------------------------- c:\app\manon94\diag\rdbms\orcl\orcl\trace/orcl_ora_2444.trc

     

TIP!
더 쉽게 자기 세션 트레이스 파일 찾기

SQL> alter session set tracefile_identifier ='oraking'

        orcl_ora_2444_oraking.trc

 

  • tkprof 사용하여 프로파일 파일 생성(report.prf를 생성)

$ tkprof orcl_ora_4000.trc report.prf sys=no;  //sys=no옵션: sql파싱과정에서 내부적으로 수행되는 sql문장 제외함

$ vi report.prf

==============================================

Call Count CPU Time Elapsed Time Disk Query Current Rows

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

 

Call통계 컬럼 의미

call 커서 상태에 따라 Parse, Execute, Fetch 세 개의 Call로 나누어 각각에 대한 통계정보를 보여줌
- Parse : 커서를 파싱하고 실행계획을 생성하는 데 대한 통계
- Execute : 커서의 실행 단계에 대한 통계
- Fetch : 레코드를 실제로 Fetch하는 데 대한 통계
count Parse, Execute, Fetch 각 단계가 수행된 횟수
cpu 현재 커서가 각 단계에서 사용한 cpu time
elapsed 현재 커서가 각 단계를 수행하는 데 소요된 시간
disk 디스크로부터 읽은 블록 수
query Consistent 모드에서 읽은 버퍼 블록 수
current Current모드에서 읽은 버퍼 블록수
rows 각 단계에서 읽거나 갱신한 처리건수

 

Auto Trace의 실행통계 항목과 비교

db block gets current
consistent gets query
physical reads disk
SQL*Net roundtrips to/from client fetch count
rows processed fetch rows

 

  1. 참고

Rows Row Source Operation

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

728 HASH JOIN OUTER (cr=32575 r=0 w=0 time=663883 us)  //us = microsecond

Rows 각 수행 단계에서 출력된 로우 수
cr Consistent 모드 블록 읽기
r(pr) 디스크 블록 읽기
w(pw) 디스크 블록 쓰기
time 소요시간

 

중요!
부도는 자식 노드 값을 누적한 값을 갖는다

  • 10046 이벤트 트레이스를 추가하는 방법 - 아래 명령어를 실행한 다음 위 (1),(2),(3) 과정 반복

    alter session set events '10046 trace name context forever, level 8';

레벨 값은 1,4,8,12로 설정 할 수 있음
레벨4 이상으로 설정할 경우 파일의 크기가 급격하게 커질 수 있으므로 주의해야함

레벨설명

레벨1 기본 정보
레벨4 기본 정보 + Binding 정보
레벨8 기본 정보 + Waiting 정보
레벨12 기본 정보 + Binding 정보 + Waiting 정보

주의
레벨이 4이상인 경우, 트레이스 파일이 급격히 커지므로, 모니터링 후 적정 시점에서 정지시켜야 함

Elapsed time = CPU time + Waint time = Response 시점 - Call 시점

select문 수행 = 최소 3번의 Call 발생
Parse call + Execute call + Fetch call 

다량의 데이터 전송 시, Fetch call = 전송 레코드 건수 / ArraySize 만큼 발생

DML문 수행 = 2번의 Call 발생
Parse call + Execute call

 

set timing on

set arraysize 100

alter session set evetns '10046 trace name context forever, level 8';

select * from big_table where id <= 1000;

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

1000개 행이 선택되었습니다.

경 과 : 00:00:08:71

[질의문 실행 흐름]

 

(2) 다른 세센에 트레이스 걸기

  • 9i

    exec dbms_system.set_ev(145, 3, 10046, 12, ''); //시리얼 번호가 3인 145번 세션에서 레벨 12로 10046 이벤트 트레이스 exec dbms_system.set_ev(145, 3, 10046, 0, ''); //해제

  • 10i

begin dbms_monitor.session_trace_enable( //시작 session_id=>145, serial_num=>3, waits=>TRUE, binds=>TRUE); end;

begin dbms_monitor.session_trace_disable( session_id=>145, serial_num=>3); end;

  • oradebug 명령어

oradebug setospid 3796 //트레이스 설정 oradebug unlimit /* 트레이스 파일의 크기를 없앰 */ oradebug event 10046 trace name context forever, level 8 oradebug tracefile_name /* 트레이스 파일 이름 확인 */ oradebug event 10046 trace name context off /* 트레이스 해제 */ oradebug close_trace

 

(3) Service, Modele, Action 단위로 트레이스 걸기

1. Service 이름에 트레이스 걸기

세션 이름이 eCRM인 세션에 모두 트레이스 걸기

begin

dbms_monitor.serv_mod_act_trace_enable(

service_name=>'eCRM',

module_name=>dbms_monitor.all_modules,

action_name=>dbms_monitor.all_actions,

waits=>true, binds=>true);

end;

 

트레이스 설정 확인

select primary_id service_name , qualifier_id1 module , qualifier_id2 action , waits , binds from dba_enabled_traces;

 

트레이스 해제

begin

dbms_monitor.serv_mod_act_trace_disable(

service_name=>'eCRM',

module_name=>dbms_monitor.all_modules,

action_name=>dbms_monitor.all_actions);

end;

2. 특정 module 트레이스 걸기

module 이름/ action 이름 변경

begin dbms_application_info.set_module(

module_name=>'emp manager',

action_name=>'select emp');

end;

 

특정 module에 트레이스 걸기

begin dbms_monitor.serv_mod_act_trace_enable(

service_name=>'eCRM',

module_name=>'emp manager',

action_name=>dbms_monitor.all_actions,

waits=>true,

binds=>true);

end;

 

트레이스 설정 확인

select primary_id service_name , qualifier_id1 module , qualifier_id2 action , waits , binds from dba_enabled_traces;

 

트레이스 해제

begin

dbms_monitor.serv_mod_act_trace_disable(

service_name=>'eCRM',

module_name=>'emp manager',

action_name=>dbms_monitor.all_actions);

end;

 

특정값으로 설정된 세션에만 트레이스 걸기

exec dbms_session.set_identifier('oraking');  //설정

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

begin dbms_monitor.client_id_trace_enable(

client_id=>'oraking',

waits=>false, binds=>false);

end;

 

 

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

FETCH .. BULK COLLECT INTO  (0) 2020.07.22
SQL Profile - plan 변경(응급조치)  (0) 2019.10.18
복수행 함수 (그룹 함수)  (0) 2018.12.13
윈도우 함수(WINDOW FUNCTION)  (0) 2018.11.01
PLSQL - 다차원 콜렉션  (0) 2018.01.24

Log miner

 -> redo log file 의 내용을 sql 문장으로 변환해 사용자가 sql 문장으로 조회해서 원하는 내용을 확인하는 것

 

log miner 조회 순서

 -> 1. log miner 전용 Dictionary 생성

      2. log miner 로 분석할 로그 보냄 (redo log buffer, archive log) = 등록

      3. log miner 에서 분석

      4. sql 로 분석 결과 조회

 

supplemental logging 기능

 -> 데이터에 DML이 발생할 경우 redo log 에 추가적인 내용을 기록 ( 기본값 보다 자세한 내용 기록 )

 

 - 최소 기록 (disable)  : 기본 모드       

 - 자세히 기록 (enable)                     

 

supplemental logging 활성화 여부 조회

SYS> select supplemental_log_data_min from v$database ;

 

SUPPLEMENTAL_LOG

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

NO              <- 기본값 

 

활성화 시키기

SYS> alter database add supplemental log data ;

 

SYS> select supplemental_log_data_min from v$database ;

 

SUPPLEMENTAL_LOG

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

YES

 

비활성화 시키기

SYS> alter database drop supplemental log data ;

 

SYS> select supplemental_log_data_min from v$database ;

 

SUPPLEMENTAL_LOG

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

NO

 

특정 테이블만 supplemental log 적용

SYS> alter table scott.emp add supplemental log data (all) columns ;

 

 



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

Log Miner 실습하기 1. - drop table 정보 찾기

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

step 1. 현재 상태 확인

 

SYS> @log

 

GROUP#  MEMBER                                            MB        seq  STATUS   arc

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

     1       /data/temp3/redo01.log                           5          1 CURRENT  NO

     2       /data/temp3/redo02.log                           5          0 UNUSED   YES

     3       /data/temp3/redo03.log                           5          0 UNUSED   YES

 

SYS> select supplemental_log_data_min from v$database ;

 

SUPPLEMENTAL_LOG

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

YES                        <-- 활성화 시키고 실습 시작

 

step 2. 새로운 테이블 생성 후 데이터 입력하고 삭제

 

SQL> create table scott.test1 (no number);

 

Table created.

 

SQL> insert into scott.test1 values(1);

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> drop table scott.test1 purge;

 

Table dropped.

 

SQL> @log

  6  ;

 

GROUP#  MEMBER                                            MB        seq  STATUS   arc

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

     1       /data/temp3/redo01.log                           5          1 CURRENT  NO     <-- 1번 그룹에서 진행 중

     2       /data/temp3/redo02.log                           5          0 UNUSED   YES

     3       /data/temp3/redo03.log                           5          0 UNUSED   YES

 

step 3. Log Miner 딕셔너리를 생성

 -> log miner 가 redo log file 을 분석해 그 안에 있는 테이블 이름이나 컬럼 이름들이 있는 부분을 딕셔너리를 확인해서 사용자가 볼 수 있도록 변환해줌

 ( 여기서 딕셔너리는 SQL Parse 단계에서 사용하는 딕셔너리가 아니라 Log Miner 가 사용하는 별도의 딕셔너리를 말함 )

 

딕셔너리 생성방법 3가지

1. Online Catalog 사용

2. Redo Log File 자체에 저장하는 방법

3. Flat file 에 저장하는 방법

※ 1,2 의 방법은 잘 사용 안함

 

1) DB 전체를 종료한 후 Parameter file 에 딕셔너리 파일의 위치를 아래와 같이 지정

 

SQL> shut immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

SQL> !

[oracle@localhost ~]$ vi /app/oracle/product/11g/dbs/inittestdb.ora

utl_file_dir=/app/oracle/logminer 

 

2) DB 시작

 

[oracle@localhost ~]$ exit

exit

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

Database opened.

 

3) 아래와 같이 딕셔너리 생성

 

SQL> exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat',-

> dictionary_location=>'/app/oracle/logminer');

 

PL/SQL procedure successfully completed.

 

4) Log Miner 에 분석할 로그 추가

 

SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo01.log',1);      

 -- 위 명령어 마지막 숫자의 의미는 1= 신규등록    2= 파일삭제   3= 추가등록

PL/SQL procedure successfully completed.

 

2,3 번 그룹을 추가 등록

 

SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo02.log',3);

 

PL/SQL procedure successfully completed.

 

SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo03.log',3);

BEGIN dbms_logmnr.add_logfile('/data/temp3/redo03.log',3); END;

 

*

ERROR at line 1:

ORA-01289: cannot add duplicate logfile /data/temp3/redo03.log

ORA-06512: at "SYS.DBMS_LOGMNR", line 68

ORA-06512: at line 1

 

3번 그룹을 추가할 때 위와 같은 에러가 나면 로그파일이 UNUSED 상태라서 그럼

alter system switch logfile 과 alter system checkpoint 를 실행시켜 Inactive 와 current 상태로 만들어주자

 

SQL> alter system switch logfile ;

 

System altered.

 

SQL> /

 

System altered.

 

SQL> /

 

System altered.

 

SQL> alter system checkpoint;

 

System altered.

 

SQL> @log

  6  ;

 

GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 CURRENT  NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE YES

     3 /data/temp3/redo03.log                           5          3 INACTIVE YES

 

 

 

위의 에러를 해결하고 redo log file 을 다시 등록해주고 log miner 에 등록된 log file을 확인

 

SQL> select db_name,filename from v$logmnr_logs;

 

DB_NAME         FILENAME

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

TESTDB          /data/temp3/redo01.log

TESTDB          /data/temp3/redo02.log

TESTDB          /data/temp3/redo03.log

 

5) Log Miner 를 시작해서 log 를 분석한 후 결과를 조회

 

SQL> exec dbms_logmnr.start_logmnr (dictfilename=>'/app/oracle/logminer/dict.dat',-

> options=>dbms_logmnr.ddl_dict_tracking+dbms_logmnr.committed_data_only);

 

PL/SQL procedure successfully completed.

 

SQL> col username for a10

SQL> col operation for a10

SQL> col sql_redo for a50

SQL> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS' ;

Session altered.

 

 

 

 

 

 

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

Log Miner 실습하기 2 - Update table 시간 확인하기

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

 

step1. 현재 상태 조회하기

 

SQL> @log

  6  ;

 

GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         19 INACTIVE YES

     2 /data/temp3/redo02.log                           5         20 INACTIVE YES

     3 /data/temp3/redo03.log                           5         21 CURRENT  NO          <-- redo03 에서 작업

 

SQL> select supplemental_log_data_min from v$database;

 

SUPPLEME

--------

 

YES

 

step2. 신규 테이블 생성 후 데이터 입력하고 update

 

SQL> create table scott.test2(no number,name varchar2(10));

 

Table created.

 

SQL> insert into scott.test2 values(1,'aaa');

 

1 row created.

 

SQL> insert into scott.test2 values(2,'bbb');

 

1 row created.

 

SQL> insert into scott.test2 values(3,'ccc');

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> select * from scott.test2;

 

        NO NAME

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

         1 aaa

         2 bbb

         3 ccc

 

SQL> update scott.test2 set name='ddd';

 

3 rows updated.

 

SQL> select * from scott.test2;

 

        NO NAME

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

         1 ddd

         2 ddd

         3 ddd

 

SQL> commit;

 

 

Commit complete.

 

step3. Log Miner 딕셔너리를 생성

 

SQL> show parameter utl

 

NAME                               TYPE        VALUE

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

create_stored_outlines        string

utl_file_dir                         string      /app/oracle/logminer

 

SQL> exec dbms_logmnr_d.build(dictionary_filename =>'dict2.dat',-

> dictionary_location=>'/app/oracle/logminer');

 

 

PL/SQL procedure successfully completed.

 

step4. 분석을 해야 할 Redo Log File 을 등록한 후 분석

 

SQL> @log

  6  ;

 

GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         19 INACTIVE YES

     2 /data/temp3/redo02.log                           5         20 INACTIVE YES

     3 /data/temp3/redo03.log                           5         21 CURRENT  NO          

 

SQL> select db_name,filename from v$logmnr_logs;             <--3번이 current 이기에 3번 등록

 

DB_NAME         FILENAME

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

TESTDB          /data/temp3/redo03.log

 

SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict2.dat')

 

 

PL/SQL procedure successfully completed.

 

step5. 분석결과 조회

 

SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';

 

Session altered.

 

SQL> select timestamp,username,operation,sql_redo

  2  from v$logmnr_contents

  3  where seg_name='TEST2'

 

  4  ;

 

 

 

 

 

 



출처: https://goalker.tistory.com/106?category=568848 [오라클 스터디]

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

ASM - Tablespace 관리하기  (0) 2019.10.21
oracle 18c object 통계 정보 수집  (0) 2019.10.18
FGA(Fine-Grained Auditing) DBMS_FGA AUDIT..  (0) 2019.08.30
Direct Insert 로 Redo를 줄이기  (0) 2019.05.15
DBMS_SCHEDULER  (0) 2019.04.11

+ Recent posts