본문 바로가기

IT관련

오라클 Heatmap, ADO, ILM 기능 테스트 핸즈온 - Compression Tiering

지난번에 오라클 Heatmap, ADO 의 개요ADO 커맨드 샘플 을 정리해봤습니다.

이번에는 처음부터 끝까지 쭉 순차적으로 핸즈온(따라해보기)을 진행해보겠습니다.

오라클 ILM 에는 Compression Tiering 과 Storage Tiering 2가지가 있습니다. 여기에서는 Compression Tiering 만 먼저 해보겠습니다.

 

간단히 절차를 먼저 체크하면, 아래 순서로 작업하면 됩니다.

 

1) DB 파라메타 변경

2) 테스트할 샘플 테이블 생성 및 데이터 생성

3) ADO Policy 생성

4) ADO Policy 를 수동으로 강제 적용

5) ADO Policy 삭제

 

실제 운영에 적용하는 상황이라면 1), 3) 번만 있으면 됩니다.

운영DB에는 테이블이 이미 있으니 2)번은 필요없고, ADO Policy 는 만들어두면 알아서 자동적용(Triggering) 되기 때문에 수동으로 강제 적용할 필요가 없는 일이고, ADO Policy 를 삭제할 일도 없겠죠.. 그냥 쭉 가는 거니까..

 

 

1) DB 파라메타 변경

 

heat_map 이라는 파라메타를 변경해줘야 합니다. 디폴트로 off 로 되어 있습니다.

 

/*
   sys 유저에서 실행
*/
SQL> 
alter system set heat_map=on scope=both;
exec dbms_ilm_admin.set_heat_map_start(sysdate);

 

간혹, 위 set_heat_map_start() 에서 ORA-38327 에러가 나는 경우가 있습니다.

이 경우는 버그랍니다. (Bug #17303764)  12.1.0.1 에서 나는 경우고, 12.1.0.2 로 패치하면 된다고 합니다.

 

2) 테스트할 샘플 테이블 생성 및 데이터 생성

 

Oracle 샘플유저 scott 유저에 디폴트로 존재하는 EMP 테이블을 가지고 데이터를 증식해서 EMPLOYEE 라는 샘플테이블을 만듭니다.

 

/*
   scott 유저에서 실행
*/

-- 테이블 생성
CREATE TABLE scott.employee
       (EMPNO      NUMBER(4) NOT NULL,
        ENAME      VARCHAR2(10),
        JOB        VARCHAR2(9),
        MGR        NUMBER(4),
        HIREDATE   DATE,
        SAL        NUMBER(7,2),
        COMM       NUMBER(7,2),
        DEPTNO     NUMBER(2))
/


-- 데이터 Insert 처음
INSERT INTO scott.employee (empno, ename, job, mgr, hiredate, sal, comm, deptno) 
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno 
FROM scott.emp;


-- 데이터 증식 8 번 반복
DECLARE
  blowup PLS_INTEGER := 8; 
  sql_test clob; 
BEGIN
  for i in 1..blowup loop 
    sql_test := 'insert /*+ append */ into employee select * from scott.employee'; 
    execute immediate sql_test; 
    commit; 
  end loop; 
END; 
/

 

이렇게 하면 employee 테이블에는 3584 건의 데이터가 생성됩니다.

 

※ 여기에서는 Insert 구문으로 만들었는데, 테스트하면서 CTAS 로 테이블 복제해서 만들게되면 Heat Map 에 데이터가 안생겨서 아래에서 수동적용시 실행이 안될 수 있습니다. CTAS 로 만든경우는 select count(*) from ... 구문을 한번 실행해준 다음에 하면 Heat Map 데이터가 정상으로 생성됩니다.

Heat Map 데이터 생성유무는 아래 쿼리로 확인할 수 있습니다.

 

/*
   scott 유저에서 실행
*/
select object_name, subobject_name, segment_read_time, segment_write_time, full_scan, lookup_scan
from user_heat_map_segment;
   --> 여기에 테스트할 테이블이 나와야 합니다.

 

 

3) ADO Policy 생성

 

이제, employee 테이블에 ADO 정책을 만들어보겠습니다.

 

/*
   scott 유저에서 실행
*/
SQL>
alter table scott.EMPLOYEE ilm add policy 
row store compress advanced
segment
after 4 days
of no modification;
  -- Segment 단위

 

employee 테이블에 4일동안 아무 변경이 없는 경우 ACO 압축을 하라는 정책입니다.

segment 를 row 로 바꾸면 row 단위로 변경여부를 체크하고, 4일동안 변경이 없는 row 들만 block 단위로 압축을 합니다.

정책(Policy)에 대한 자세한 설정은 이전 문서를 참조하세요.

 

이제 생성한 정책을 딕셔너리뷰에서 아래와 같이 확인할 수 있습니다.

 

/*
   scott 유저에서 실행
*/
SQL>
set numwidth 10
column policy_name format a8
column compression_level format a17

SELECT policy_name, action_type, scope, compression_level, condition_type, condition_days
FROM   user_ilmDatamovementPolicies
ORDER BY policy_name;


POLICY_N ACTION_TYPE SCOPE   COMPRESSION_LEVEL CONDITION_TYPE         CONDITION_DAYS
-------- ----------- ------- ----------------- ---------------------- --------------
P85      COMPRESSION SEGMENT ADVANCED          LAST MODIFICATION TIME              4

 

저는 Policy_Name 이 P85 입니다. 여러번 테스트해서 그런것이고, 처음 하는 경우는 P1 부터 시작합니다.

위 ilm add policy 문에서 지정한대로 설정이 되어 있는것을 확인할 수 있습니다.

 

이제는 4일 동안 employee 테이블을 변경하지 않고 기다리면 됩니다. 4일뒤에 뵙겠습니다.ㅎㅎ

 

 

4) ADO Policy 를 수동으로 강제 적용

 

but, 우리는 성질이 급하기 때문에 기다릴 수 없죠~

그냥 아래 커맨드를 scott 유저에서 실행해주면 ADO 정책을 실행해 버립니다.

 

아래 SQL을 실행하기 전에 실행전과 실행후를 비교할 필요가 있습니다. 즉, 정책이 적용되기 전에 비압축상태를 확인하고, 정책을 적용하고나서 압축이 되는 것을 확인해야 겠죠.

 


/*
   sys 유저에서 실행
*/
EXEC dbms_ilm_admin.customize_ilm(dbms_ilm_admin.POLICY_TIME, dbms_ilm_admin.ILM_POLICY_IN_SECONDS);
   -- 빠른 적용을 위해 Triggering 체크시간을 초단위로 체크하도록 변경

 

위 커맨드는 Triggering 체크시간을 초단위로 체크하도록 변경하는 것인데, 안그러면 디폴트가 일단위라 아래 커맨드를 실행해도 체크 자체를 다음날이 되어야 체크하기 때문에 하루를 기다려야 하기 때문입니다.

이걸 다시 원복하려면 위 커맨드에서 ILM_POLICY_IN_SECONDS 부분을 ILM_POLICY_IN_DAYS 로 바꿔서 실행해주면 됩니다.

 


/*
   scott 유저에서 실행
*/
EXEC dbms_ilm.flush_all_segments;
  -- 이거 반드시 해줘야 합니다. 이거 안하고 아래만 실행하면 동작 안합니다.

DECLARE 
   v_executionid number;
BEGIN
   dbms_ilm.execute_ILM (ILM_SCOPE      => dbms_ilm.SCOPE_SCHEMA, 
                         execution_mode => dbms_ilm.ilm_execution_offline, 
                         task_id        => v_executionid);
END;
/

 

저번에 포스팅했었던 "테이블 압축방식 체크 스크립트" 페이지에 있는 스크립트에서 EMP 테이블을 EMPLOYEE 로 바꿔주고 실행해봅니다.

 

 

3,584건 모두 No Compression 으로 나오는 것을 확인할 수 있습니다.

 

그럼, 이제 위 강제로 정책을 적용하는 스크립트를 실행한 후에 다시 조회해 봅니다.

 

 

정책이 segment 단위로 걸려있어, 테이블의 모든 데이터가 ACO 압축이 되어진 것을 확인할 수 있습니다.

!!! Mission Complete !!!

 

5) ADO Policy 삭제

 

요리의 끝은 설거지라고 하죠~ 아래와 같이 내가 테스트한 정책을 지워주면 되겠습니다.

 


/*
   scott 유저에서 실행
*/
alter table EMPLOYEE ilm delete policy P85;
   -- P85 Policy를 삭제

/*
   sys 유저에서 실행
*/
EXEC dbms_ilm_admin.customize_ilm(dbms_ilm_admin.POLICY_TIME, dbms_ilm_admin.ILM_POLICY_IN_DAYS);
   -- 초단위로 동작하도록 바꿨던 부분을 다시 원래대로 일단위로 동작하도록 변경

 

 

※ 참고)

위에서 정책을 segment 로 설정했었는데, row 단위로 하면 Advanced compression level 로 안나오고,

basic compression 으로 나오는 경우가 있습니다. 이 경우는 버그라고 하네요. 패치하면 됩니다. (MOS #17947871)

 

 

※ 이전글 참고)

   - 오라클 Heatmap, ADO, ILM 기능 설명

   - 오라클 Heatmap, ADO, ILM 기능 샘플 커맨드 예제

   - 테이블 압축방식 체크 스크립트

   - 오라클 Heatmap, ADO, ILM 기능 테스트 핸즈온 - Storage Tiering

   - 오라클 Heatmap, ADO, ILM 기능관련 딕셔너리 조회 스크립트 모음