1. HCC Compress 은 ? 


  - Exadata 를 국내에서 구매하는 경우, HCC(HYBRID COLUMNAR COMPRESSION) 라고 이름 붙여진 압축(Compress Option) 기능을 기본적으로 사용할 수 있습니다. 


  - 아래의 4가지 유형으로 구분되며, 구체적인 비교는 여기서는 생략합니다. (관련 자료는 구하기 어렵지 않습니다), 쉽게 아래쪽으로 갈 수록 예상 압축율이 높아집니다. (ex> 예상 압축율 - QUERY LOW : 4x,  ARCHIVE HIGH : 12x )

    > COMPRESS FOR QUERY LOW

    > COMPRESS FOR QUERY HIGH

    > COMPRESS FOR ARCHIVE LOW

    > COMPRESS FOR ARCHIVE HIGH 


  - 참고로) COMPRESS FOR OLTP 는 HCC 가 아니라.. ACO (Oracle DB 의 유료 압축옵션 - Advanced Compress Option - ) 를 별로로 구매한 경우에, 사용이 가능합니다. 


2. 4가지 유형 중.. 고객들이 선호하는 유형은 => "QUERY HIGH"


  - 저의 개인적인 경험, 주위에서 비슷한 일을 하는 친구 들의 증언?에 따르면, 대형 국내기업의 경우는 대부분 "COMPRESS FOR QUERY HIGH" 라고 합니다. 


  -  추가로, 보통, 테이블단위로 적용합니다. 좀 효율적으로 할려면...파티션단위로도 하시나 관리상의 이유로, 테이블 단위가 많습니다. ( OLTP 가 일어나면 압축이 깨지고 그래서..다시 압축하고, 이렇게 반복되다 보니 Table 단위를 선호하는 것 같네요 ) 


3. HCC 적용여부 확인방법


  -- Table 단위로, 적용 여부를 조회해 볼 수 있습니다.


SQL> select table_name, compression, compress_for from dba_tables where table_name = 'TEST1' ;


TABLE_NAME      COMPRESS      COMPRESS_FOR

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

TEST1                 ENABLED       QUERY HIGH


SQL>  


  - 간혹, Table 이 Compress 되어 있음에도.. 툴(Ex> Ora*, TO* 등)에서 보이지 않는 다는 이유로,  Compress 안 되 있다고 이야기 하는 분들이 있습니다만, 툴이 최신 버전이 아닌 경우, 나름 최신 DB 기술인 HCC 정보를 가져올 수 없어서 인 경우가 많습니다.

  




'IT-Tech > Appliance' 카테고리의 다른 글

[Exadata] Oracle ASM 에 Tablespace 생성  (0) 2016.08.09

0. 개요


  - ASM 은 Oracle DB 10g 이상에서 사용할 수 있는 Oracle 사의 Cluster File System 이지만, 사실상 (raw device 를 선호하는 국내 여건 상) Exadata 환경에서 보편적으로 사용되고 있습니다.  


  - Exadata 초기설정 시, DATA, FRA, ACFS, DBFS 등의 DG(DIsk Group)를 생성해 줍니다.

  - DB 에서는 Tablespace 를 기본적으로 +DATA DG 에 생성합니다.


  - 고객사 정책에 따라, 별도로 남긴 Disk(혹은 추가 Disk)를 이용해서, 아래 처럼 USRDATA1 라는 추가 DG 를 생성할 수는 있으나, Oracle 에서 권고하지는 않습니다. 또 이렇게 사용하는 고객사들도 거의 없습니다.


SQL> CREATE DISKGROUP USRDATA1 EXTERNAL REDUNDANCY DISK '/dev/d1','/dev/d2','/dev/d3','/dev/d4' ;

    혹은

SQL> CREATE DISKGROUP USRDATA1 EXTERNAL REDUNDANCY DISK '/dev/d*' ;

    이렇게 생성합니다.


    -- 이하, 하드웨어 기반의 미러링이 구성되지 않은 경우, ASM에서 “fail group” 을 지정해 디스크그룹을 생성 가능


SQL> CREATE DISKGROUP USRDATA1 NORMAL REDUNDANCY FAILGROUP failgrp1 DISK '/dev/d1', '/dev/d2', FAILGROUP failgrp2 DISK '/dev/d3', '/dev/d4' ; 



1. Tablespace 생성


  A. DATA DG 에 USERS 이름의 업무용 Tablespace 생성 

    

    -- 기본적으로 File System 에 생성하는 것과 동일합니다만, Oracle 에서 OMF (Oracle Managed Files) 로 관리하기 때문에,, Location 만 지정하고 (이것도 Default 로 잡히는 +DATA 에 생성 시 생략 가능) 수행하면 됩니다. 


SQL> CREATE TABLESPACE USERS DATAFILE SIZE 1024m ; 


    -- 동일하게 dba_data_files 에서 tablespace 와 datafile 정보를 볼 수 있습니다.


SQL> select tablespace_name, file_name, bytes/1024/1024/1024 Gb from dba_data_files order by tablespace_name, file_name ; 


    -- 물론,, 이름을 직정 지정해주고 싶은 경우, 아래 처럼도 가능합니다. 다만, Oracle 에서 권장하는 방법은 아니고, Data Guard 등으로 연계된 경우 등에서 이슈발생 가능성이 있읍니다. 


SQL> CREATE TABLESPACE USERS DATAFILE '+DATA1/users_data_01.dbf' SIZE 1024m ; 


    -- Exadata 에서는 여러개의 datafile 을 생성하는 것 보다는, 단일 datafile 의 size 를 크게 가져가는 것을 권고 합니다.

    -- 사례) 대형 고객사에서는 1개 Datafile 의 size 를 30Gb 크기로도 생성 합니다.

    -- 추가로, Oracle DB 에서는 (10g, 11gR2 까지는 그렇습니다. 12c 는 확인을 못 했습니다.) 1개 Tablespace 당 Datafile 을 1022개 까지인가? 추가할 수 있고, 일반 datafile 의 Max Size 는 약 31.9Gb 입니다. 


  B. USERS Tablespace 에 Datafile 추가 시  * << Oracle 권장방법 >>

 

 SQL> alter tablespace USERS add datafile size 1g ;


  C. DATA DG 에 Redo Log 를 생성하는 경우


    -- Online Redo Log File 도 DATA DG 에 생성 가능 합니다. 하기 SQL 은 Sample Query 입니다.


SQL> alter database add logfile GROUP 1 ('+DATA1/redo/group_1.258.3','+DATA2/redo/group_1.258.3') SIZE 8g ; 


2. ASM 관련된 DG 관리


  A. Location 확인 : data 파일 생성 기본위치


SQL> show parameter db_create_file_dest ; 


SQL> select group_number, name, state, type, total_mb, free_mb from v$asm_diskgroup;

SQL> select b.name group_number, a.name disk_name, a.header_status, a.state, a.free_mb 

        from v$asm_disk a, v$asm_diskgroup b 

        where a.group_number = b.group_number ; 

    

    -- 아래 처럼, 기본 위치를 변경 가능 


SQL> alter system set db_create_file_dest='+DATA1' ;   


3. 추가로.. ASM 사용량 보기 셈풀Query 입니다. ==> Tablespace Freespace 관리 시, OS File System Free 는 먼저 살펴봐야 합니다. 


  -- Query : 아쉽게..  실행 결과 화면은 없습니다. 


SET LINESIZE 350

SET PAGESIZE 1000


col name format a10

col USABLE_FILE_GB format 999,999.00

col TOTAL_GB       format 999,999.00

col FREE_GB        format 999,999.00

col USABLE_CALC_GB format 999,999.00


select name

     , USABLE_FILE_MB/1024 USABLE_FILE_GB

     , total_mb/1024 TOTAL_GB, free_mb/1024 FREE_GB

     , 100-round(free_mb/total_mb*100) "usgae(%)"

     , ((FREE_MB - REQUIRED_MIRROR_FREE_MB))/1024 USABLE_CALC_GB

     , state

     , type

     , group_number

  from v$asm_diskgroup

 order by name ; 







//-- Oracle DB 의 Datapump 를 이용한 DB 간 Data 이관 

//-- Draft 버전 



1. 개요 


  -- 필요한경우 

    > Oracle DB 간의 Data Migration

    > 사례1) 개발DB에 있는 특정한 Schema의 모든 Object들을 운영DB로 모두 옮기는 경우 등 

  -- 제약사항

    > Oracle DB 10.2.0.X 이상 (11.1.0.X 이상 권고) => 해당 버전 이상에서 제공하는 datapump 를 사용


  

2. 전체적인 가이드


  A. Datapump 를 떨어뜨릴 Directory를 소스/타켓 양쪽에 생성

  B. Datapump 명령어로, 해당 Data 를 OS File 형태로 추출

  C. FTP 로 타켓서버로 전송

  D. Datapump 명령어로, 해당 OS File 을 DB에 적재 



3. 세부방법


  A. (소스/타켓 양쪽 DB에) Directory 설정 


  -- 기존 Directory 중 적당한 것을 사용해도 되고, 새로 만들어 사용해도 됨

  -- DB 관리user 인 system 을 사용하는 것이 무난함 => 그렇지 않은 경우, 일반 User 에 필요한 권한을 설정 필요

  

  -- 기존 Directory 조회

  -- 아래의 경우, DATA_PUMP_DIR 가 사용하기에 무난

  

SQL> set linesize 350

SQL> set pagesize 100

SQL> col owner format a15

SQL> col directory_path format a80  

SQL> select * from dba_directories ; 


OWNER        DIRECTORY_NAME                 DIRECTORY_PATH

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

SYS          SUBDIR                            /app/oracle/product/11.2.0/db/demo/schema/order_entry/2002/Sep

SYS          SS_OE_XMLDIR                   /app/oracle/product/11.2.0/db/demo/schema/order_entry/

SYS          JOOYH_DIR                        /home/oracle/data_pump

SYS          LOG_FILE_DIR                     /app/oracle/product/11.2.0/db/demo/schema/log/

SYS          MEDIA_DIR                        /app/oracle/product/11.2.0/db/demo/schema/product_media/

SYS          XMLDIR                             /app/oracle/product/11.2.0/db/rdbms/xml

SYS          DATA_FILE_DIR                    /app/oracle/product/11.2.0/db/demo/schema/sales_history/

SYS          DATA_PUMP_DIR                 /app/oracle/admin/ogg25/dpdump/

SYS          ORACLE_OCM_CONFIG_DIR    /app/oracle/product/11.2.0/db/ccr/state

9 rows selected.

SQL> 


  -- 새로운 Directory 생성 (tran_pump 로 생성) 및 필요권한 부여

  -- system 에는 이미 권한이 있으나, 셈풀Query를 수행

  

[/home/oracle]$ id

 uid=401(oracle) gid=512(dba) groups=512(dba)

 [/home/oracle]$ cd /app/oracle/admin/ogg25/

 [/app/oracle/admin/ogg25/]$ mkdir tran_pump         --  dpdir 정도의 이름으로 만들어진 것을 사용하면 됨


-- 일반 User로 Directory 생성시 필요 (system 은 기 보유) 

SQL> GRANT CREATE ANY DIRECTORY TO SYSTEM ;   

-- 원하는 Directory 생성

SQL> CREATE DIRECTORY tran_pump AS '/app/oracle/admin/ogg25/tran_pump' ; 

-- DIRECTORY 에 개별권한 부여

SQL> GRANT READ, WRITE ON DIRECTORY tran_pump TO SYSTEM ;  

-- 일반 User로 추출/적재 시 필요 (system 은 이미 권한이 있음}

SQL> grant EXP_FULL_DATABASE, IMP_FULL_DATABASE to SYSTEM ;  


  B. Datadump 명령어로, 해당 Data 를 OS File 형태로 추출

  

  -- 추출대상 Object 확인 : 하단 참조

  

  -- 새로 생성한 tran_pump 에 Data 를 추출/적재

  -- tran_pump 이름의 directory 에 dumpfile 이 생성됨

  

[/home/oracle]$ expdp system/oracle directory=tran_pump schemas=BIGDATA01 job_name=bigdata01_expdp dumpfile=src_schema_bigdata01.dmp logfile=src_schema_bigdata01.expdp.log


[/app/oracle/admin/ogg25/tran_pump]$ du -hs *

5.1G    src_schema_bigdata01.dmp      -> 14:13:13 소요됨, tran_pump 란 directory 에 생성됨

12K     src_schema_bigdata01.expdp.log

[/app/oracle/admin/ogg25/tran_pump]$ 

  C. FTP 로 타켓서버로 전송 : 생략

  

  D. Datadump 명령어로, 해당 OS File 을 DB에 적재 

  

** 주의사항

     -- 사전에 적재 될 Schema 는 이미 만들어 두어야 함

     -- 이미 생성하지 않으면, 적재 시 생성하나 (동일 DB서버에 복구 하는 경우가 아니라면) 이미 생성해 두어야 함

     -- 적재된 Tablespace 에도 충분한 공간이 확보되어 있어야 함


SQL> drop user bigdata02 cascade ;          -- 해당 Schema 가 이미 있는 경우, 삭제하고 재생성 필요

SQL> create user bigdata02 identified by bigdata02

        default tablespace tmp_data

        temporary tablespace temp ; 

SQL> grant resource, connect to bigdata02 ; 

SQL> grant dba, sysdba to tranm ;          -- TRANManager DB User 에는  dba, sysdba 권한도 추가로 부여 


 ** 만약 impdp 가 퍼미션 문제로 실행되지 않는다면 SYSDBA 로 로그인한 후, 아래 Query 를 실행한 후 재시도.

SQL> execute dbms_metadata_util.load_stylesheets ;

-- 아래 명령어로 적재

-- 추출하는 Schema 와 적재되는 Schema 가 다른 경우 REMAP_SCHEMA 사용해야 함

-- 소스DB 의 Tablespace 명이 타켓DB에서 달라지는 경우, REMAP_TABLESPACE 를 사용해야 함


[/home/oracle]$ impdp system/oracle directory=tran_pump job_name=bigdata01_impdp dumpfile=src_schema_bigdata01.dmp logfile=src_schema_bigdata01.impdp.log REMAP_SCHEMA=bigdata01:bigdata02

    

 


8. 관련 Query 


  A. 추출 대상 Schema 의 Object 정보 사전 확인


SQL> set linesize 350  

SELECT DB.NAME DBNAME

, USERNAME

        , NVL(ROUND(SUM(CASE WHEN SEGMENT_TYPE LIKE 'INDEX%' THEN NULL ELSE BYTES END)/1024/1024/1024,1),-1) TABLE_SIZE

, NVL(ROUND(SUM(CASE WHEN SEGMENT_TYPE LIKE 'INDEX%' THEN BYTES ELSE NULL END)/1024/1024/1024,1),-1) INDEX_SIZE

, COUNT(B.SEGMENT_NAME) SEGMENT_COUNT

, MAX(C.OBJ_CNT) OBJECT_COUNT

FROM DBA_USERS A

INNER JOIN

(SELECT NAME FROM V$DATABASE) DB

ON 1=1

LEFT OUTER JOIN DBA_SEGMENTS B

ON A.USERNAME=B.OWNER

AND SEGMENT_NAME NOT LIKE 'BIN%'

LEFT OUTER JOIN (SELECT OWNER OWNER2,COUNT(*) OBJ_CNT FROM DBA_OBJECTS GROUP BY OWNER) C

ON A.USERNAME = C.OWNER2

WHERE A.USERNAME IN ('BIGDATA01')

GROUP BY DB.NAME,USERNAME

ORDER BY USERNAME  


SQL> /


DBNAME    USERNAME                       TABLE_SIZE INDEX_SIZE SEGMENT_COUNT OBJECT_COUNT

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

OGG25     BIGDATA01                             4.7        1.4           126          134


SQL> 


select owner, object_type, count(1)

  from dba_objects 

 where owner in ('BIGDATA01') 

 group by owner, object_type

 order by owner, object_type


OWNER           OBJECT_TYPE           COUNT(1)

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

BIGDATA01       INDEX                       42

BIGDATA01       PACKAGE                      1

BIGDATA01       PACKAGE BODY                 1

BIGDATA01       PROCEDURE                    3

BIGDATA01       SEQUENCE                     1

BIGDATA01       TABLE                       84

BIGDATA01       VIEW                         2


7 rows selected.

SQL> 



9. 참조 사례/셈풀


  A. 추출 하지 않고, 생성될 dump file 의 Size 만 계산 : estimate_only 사용 

  

    -- 다음 옵션으로 expdp에 사용되는 공간을 추정할 수 있다.

$ expdp dpumpuser/dpumpuser full=y estimate_only=Y

  


  B. 추출/적재 시 병렬처리 하는 경우 : %U 를 사용


    -- parallel 파라메터는 몇 개의 스레드로 병렬 처리 할 것 인지 지정한다.

# expdp hr/hr tables=paratest directory=data_pump_test dumpfile=paratest%U.dmp parallel=4 job_name=parr_test;


    -- paratest01.dmp, paratest02.dmp, paratest03.dmp paratest04.dmp => 4 개의 파일이 생성된다.

# impdp hr/hr directory=data_pump_test dumpfile=paratest%U.dmp job_name=parr_test;


  C. 추출 시, 특정 Schema 데에터만 추출


    -- 특정 스키마의 구조와 데이터 추출 : schema 를 사용

$expdp dpumpuser/dpumpuser schema=PORTAL directory=data_pump dumpfile=portal_schema_20081031.dmp


  D. 추출 대상 정하기 - Metadata 만을 추출하거나, Table 의 Data 만 추출하는 경우 : content 를 사용

  

    -- content를 사용해 특정 스키마의 데이터만 추출 (all 전체 | metadata_only 껍데기만 | data_only table의Data만 ) 

$expdp dpumpuser/dpumpuser schemas=PORTAL content=data_only directory=data_pump dumpfile=portal_schema_data_20081031.dmp

  E. 적재 시, Schema 및 Tablespace 가 변경되는 경우 : REMAP_XXXXX 사용

    -- 데이터 파일, 테이블 스페이스, 유저는 각각 다음의 옵션으로 변경할 수 있다.

REMAP_DATAFILE='C:\user01.dbf':'/usr/data/user01.dbf'

REMAP_TABLESPACE='users':'user'

REMAP_SCHEMA=scott:stralth

    -- TABLESPACE 변경이 여러개인 경우, "," 를 구분자로 필요한 만큼 기술 가능

    --  ex) impdp system/oracle directory=datapump dumpfile=scott.dmp remap_tablespace =users1_data:users2_data, users1_index:users2_index schemas=scott;

 

  F. 적재 시 이미 Table 이 존재하는 경우 선택 가능 : table_exists 사용


$ impdp dpumpuser/dpumpuser table_exists_action=truncate directory=data_pump dumpfile=portal_schema_data_20081031.dmp  

    -- table_exists_action 옵션 사용, 기존의 데이터를 truncate 하도록 (skip | append | truncate | replace)

skip      : 존재하는 오브젝트에 대해 임포트 스킵

append : 기존 오브젝트에서 업는 행만을 임포트

truncate : 기존 테이블 truncate

replace : drop & recreate 



//-- 2012.04.18. 초안작성
//-- 2012.05.07. 수정 

 

1. CDC 제품을 활용한 Oracle DB 실시간 Migration 개념

 

  Source 시스템을 운영하는 동안 Source DB 을 백업 받아서 Target 시스템을 구축하고 구축하는 동안 Source 시스템에 유입된 변경 데이터를 정합성에 어긋남이 없이 Oracle GoldenGate 을 이용하여 작업을 하게 됩니다.

 

 

1.      GoldenGate 변경 데이터 추출 시작

2.      Source DB 백업

3.      백업 데이터를 Target DB 에 적용

4.      추출된 변경 데이터 Target DB에 적용

5.      APP 에서 기존 Source 시스템에서부터 신규 Target 시스템으로의 Connection 을 변경

 

Zero Down-Time Migration 에서 Source DB Backup Target DB Recovery 그리고  Oracle GoldenGate 을 이용한 데이터 복제는 아래와 같은 방법으로 진행됩니다.

 

 

본 간략 절차 사례에서는, 소규모 Size Oracle DB exp/imp dump 를 이용해 Target DB 로 옮겨 실시간 DB 동기화를 구성하는 방법으로 Zero Down-Time Migration 을 구현해 보았습니다.

 

2. Zero Down-Time Migration 실례 (간략 절차)

 

 

Source DB

Target DB

Step 1

CDC(Change Data Capture)를 위한 Oracle Golgdngate 설치 (DB 무 중단)

Step 2

Goldengate 변경 분 추출 Process (extract) 시작

 

Step 3

SCN 기반 데이터 추출 (expdp)

 

Step 4

 

추출된 데이터 DB 에 적재 (impdp)

Step 5

 

Goldengate 변경 분 반영 Process (replicat) 시작

Step 6

CDC(Change Data Capture) 기반, DB 동기화(sync) 중인 상태

 

2-A. Change Data Capture 를 위한 Oracle Golgdngate 설치

 

  Oracle 사의 CDC 제품인 Goldengate 제품을 설치합니다. 설치를 위한 Requirement Installation 과정은 이 문서에서는 생략하겠습니다.

 

2-B. Source DB 에서 Goldengate 변경 분 추출 Process (extract) 시작

 

가.   GGSCI 에서 해당 extract pump 를 시작해 Data 변경분을 추출 시작하기

 

GGSCI> info all

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     RUNNING                                           

EXTRACT     STOPPED     EXTORCL     00:00:02      00:00:07   

EXTRACT     STOPPED     PMPORCL     00:00:04      00:00:03

GGSCI> start *ORCL

GGSCI> info all

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     RUNNING                                          

EXTRACT     RUNNING     EXTORCL     00:00:02      00:00:01   

EXTRACT     RUNNING     PMPORCL     00:00:01      00:00:02

GGSCI>

 

    역시, 이 문서가 Goldengate 제품 자체에 대한 문서는 아니기 때문에, 자세한 내용들은 생략하겠습니다.

 

2-C. Source DB 에서 SCN 기반 데이터 추출 (expdp)

 

가.   Long Transaction 유무를 확인하고, SCN 을 추출해 둡니다.

 

SQL> select min(start_time) from v$transaction ;

 

MIN(START_TIME)

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

                                             ---> 현재 수행중인 Transaction 이 없음

SQL> col a format 99999999999999999999

SQL> select dbms_flashback.get_system_change_number a from dual ;

 

                    A

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

       12478584165405                       ---> 추출 시점의 SCN 값 입니다.

 

SQL> select min(start_time) from v$transaction ;

 

MIN(START_TIME)

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

---> 현재 수행중인 Transaction 이 없음

SQL>

 

v$transaction 에 수행 중인 transaction 이 있더라도 상관 없습니다. 다만 수행중인 Transaction start_time 을 비교해서, 계속 변경되고 있는지 기존에 수행 중인 Transaction 이 종료 되고, 새로운 transaction 이 시작되었는지 확인 할 필요는 있습니다.

 

나.   Export dump 를 사용해, Source DB 해당 data 를 추출

 

Oracle ] expdp userid=\"system/password_of_system as sysdba\" job_name = 120418_boro_pm_exp dumpfile = 120418_boro_pm_exp.dmp logfile = 120418_boro_pm_exp.log schemas = SEI_PM flashback_scn = 12478584165405

 

    Oracle 10g 이상에서는 exp/imp 보다 속도 등이 개선된 exp dump가 지원됩니다. 이 사례에서는 특정한 DB User (SEI_PM) 의 모든 DB Data 120418_boro_pm_exp.dmp 이라는 OS File 로 추출한 것이고, flashback_scn 값을 앞서 dbms_flashback 을 통해 추출한 값으로 입력합니다.

    Dmp file 이 생성되는 기본 위치는 $ORACLE_BASE/admin/SID/dpdump 입니다.

 

    File 생성이 완료되면, Target DB dmp file 을 전송합니다. 보통은 compress ftp 를 이용합니다.

 

2-D. Target DB 로 추출된 데이터 DB 에 적재 (impdp)

 

가.   보통, 아래와 같이 간단히 DB에 적재할 수 있습니다. 해당 DB Schema 를 먼저 만들어 주어도 import 에 문제가 없습니다.

 

Oracle ] impdp userid=\"system/password_of_system as sysdba\" job_name = 120418_boro_pm_imp dumpfile = 120418_boro_pm_exp.dmp logfile = 120418_boro_pm_impdp.log

 

나.   다만, 여러 개의 Source DB 에서 1개의 Target DB DB Data 병합하는 경우, temp schema 를 통해 필요한 Data 만 적재할 수도 있습니다. 아래의 Query 를 참조하세요

 

2-D.-1. Temp Schema 를 사전에 생성합니다.


SQL> drop user tmp_sei_pm cascade ;

SQL> create user tmp_sei_pm identified by password_of_tmp_sei_pm default tablespace TMP_SEI_PM temporary tablespace TEMP_FIELD ;

SQL> grant resource, connect, dba to tmp_sei_pm ;

 

2-D.-2. Source DB 에서 추출한 Data Temp Schema 로 임시로 적재합니다


Oracle ] impdp userid=\"system/password_of_system as sysdba\" job_name = 120418_boro_pm_imp dumpfile = 120418_boro_pm_exp.dmp logfile = 120418_boro_pm_impdp.log remap_schema=sei_pm:tmp_sei_pm

    마찬가지로, 기본 위치는 $ORACLE_BASE/admin/SID/dpdump 입니다

 

2-D.-3. 임시로 적재된 Data 에서, 필요한 Data 만을 실 사용할 Schema 로 적재

 

실제 사용할 Schema 로 적재할 때는, 해당 시나리오에 따라, 특정 코드값의 Data 만을 삭제 하거나, 특정 코드값의 Data 를 제외하고 삭제, 특정 코드값에 해당하는 rows 만을 insert 하는 경우 등이 있겠습니다. 이 때 사용될 Query 들은 아래와 같습니다.

 

SQL> create table SEI_PM.PM_P_AREA as select * from TMP_SEI_PM.PM_P_AREA where job_no = 'SC2222' ;

SQL> delete SEI_PM.PM_P_AREA   where job_no <> 'SC2222' ;

SQL> insert into SEI_PM.PM_P_AREA         select * from TMP_SEI_PM.PM_P_AREA       where job_no = 'SC2222' ;

SQL> delete SEI_PM.PM_P_BM      where job_no = 'SC2222' ;

 

2-E. Target DB 에서 Goldengate 변경 분 반영 Process (replicat) 시작

 

GGSCI> info all

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     RUNNING                                           

REPLICAT     STOPPED     R_ORCL11     00:00:02      00:00:07   

REPLICAT     STOPPED     R_ORCL12     00:00:04      00:00:03

GGSCI> start replicat r_orcl11, aftercsn 12478584165405

GGSCI> start replicat r_orcl12, aftercsn 12478584165405

GGSCI> info all

Program     Status      Group       Lag           Time Since Chkpt

MANAGER     RUNNING                                          

REPLICAT     RUNNING     R_ORCL11     00:00:02      00:00:01   

REPLICAT     RUNNING     R_ORCL12     00:00:01      00:00:02

GGSCI>

 

3. CDC 제품(Oracle Goldengate)을 활용한 Zero Down-Time Migration 활용 사례들

 

      Oracle GoldenGate 을 운영하기 위해서 초기 데이터 구축을 위해서 사용

  - Source DB 에서 Target DB 로 데이터를 동일하게 일치 시키는 Initial Loading 작업

  - OGG을 이용한 조회 시스템, ODS/DW, 비상 시스템, 타 시스템 연계 시 사용

      System/DB 업그레이드 시 연속적인 서비스를 진행하기 위해서 사용

  - System 증설 또는 DB 버전 Upgrade 시 서비스 연속성 보장

      주 시스템의 PM 작업 (Planned Outage, Unplanned Outage) 시 사용

  - 주 시스템에 대해서 장시간 작업을 진행하기 위하여 임시 시스템에서 서비스의 연속성 보장

  - 주 시스템의 작업 완료 후 임시 시스템으로부터 주 시스템으로 서비스의 연속성 보장

      주 시스템/DB 을 이기종으로 변경하기 위해서 사용

  - 주 시스템의 H/W 또는 OS, DB 등을 이기종으로 변경 시 서비스의 연속성 보장


End of document.

1. Oracle DB 에서 제공하는 변환형 함수(Conversion function)

 

주로 아래 3가지 변환함수가 많이 사용됩니다.

Parameter

Explanation

to_char

숫자나 날짜를 문자열로 변환

to_date

문자를 날짜로 변환

to_number

문자를 숫자로 변환

기타 참조할 만한 Conversion function 으로는

-       Bin_To_Num / NumToDSInterval / NumToYMInterval  

-       To_Single_Byte / To_Multi_Byte / To_Clob / To_NClob / To_Lob

-       From_Tz / To_Timestamp / To_Timestamp_Tz / To_YMInterval / To_DSInterval

-       HexToRaw / CharToRowid / RawToHex

등이 있으나, 이번에는 언급하지 않겠습니다.

 

가능한 DB 버전 : Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g

-       아마 곧 GA release Oracle 12c 에서도 지원되겠지요?

 

2. to_char function

 

Syntax : TO_CHAR(문자값,‘형식’) / to_char( value, [format_mask], [nls_language])

-       value can either be a number or date that will be converted to a string.

-       format_mask is optional. This is the format that will be used to convert value to a string.

-       nls_language is optional. This is the nls language used to convert value to a string.

 

Example : 숫자를 문자열로 변환

SQL> select TO_CHAR(350000,'$999,999') from dual ;

 

TO_CHAR(3

---------

 $350,000

 

SQL>

 

Example : 날짜를 문자열로 변환

SQL> select to_char(sysdate, 'yyyy/mm/dd HH24:MI:SS') from dual ;

 

TO_CHAR(SYSDATE,'YY

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

2012/05/03 13:24:25

 

SQL> select to_char(sysdate - 31, 'yyyymmdd') from dual ;

 

TO_CHAR(

--------

20120402

 

SQL> select to_char(sysdate, 'yyyy/mm/dd') from dual ;

 

TO_CHAR(SY

----------

2012/05/03

 

SQL> select to_char(sysdate, 'Month DD, YYYY') from dual ;

 

TO_CHAR(SYSDATE,'MONTHDD,YYYY')

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

May       03, 2012

 

SQL> select to_char(sysdate, 'FMMonth DD, YYYY') from dual ;

 

TO_CHAR(SYSDATE,'FMMONTHDD,YYYY')

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

May 3, 2012

 

SQL> select to_char(sysdate, 'MON DDth, YYYY') from dual ;

 

TO_CHAR(SYSDATE,'MONDDT

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

MAY 03RD, 2012

 

SQL> select to_char(sysdate, 'FMMON DDth, YYYY') from dual ;

 

TO_CHAR(SYSDATE,'FMMOND

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

MAY 3RD, 2012

 

SQL> select to_char(sysdate, 'FMMon ddth, YYYY') from dual ;

 

TO_CHAR(SYSDATE,'FMMOND

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

May 3rd, 2012

 

SQL>

 

Frequently Asked Questions

Question:

Why doesn't this sort the days of the week in order?

 

    select ename, hiredate, to_char((hiredate),'fmDay') "Day"

    from emp

    order by "Day";

 

Answer:

In the above SQL, the fmDay format mask used in the to_char function will return the name of the Day and not the numeric value of the day.

To sort the days of the week in order, you need to return the numeric value of the day by using the fmD format mask as follows:

 

    select ename, hiredate, to_char((hiredate),'fmD') "Day"

    from emp

    order by "Day";

 

3. to_date function

 

Syntax : TO_DATE(문자값, ‘형식’) / to_date(string1, [format_mask], [nls_language])

-       string1 is the string that will be converted to a date.

-       format_mask is optional. This is the format that will be used to convert string1 to a date.

-       nls_language is optional. This is the nls language used to convert string1 to a date.

 

Example : 문자를 날짜로 변환

SQL> select TO_DATE('May 3 2012','MONTH DD YYYY') from dual ;

 

TO_DATE('

---------

03-MAY-12

 

SQL> select sysdate - to_date('20120101', 'yyyymmdd') from dual ;

 

SYSDATE-TO_DATE('20120101','YYYYMMDD')

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

                            123.577465

 

SQL> select to_date('2012/05/03', 'yyyy/mm/dd') from dual ;

 

TO_DATE('

---------

03-MAY-12

 

SQL> select to_date('050312', 'MMDDYY') from dual ;

 

TO_DATE('

---------

03-MAY-12

 

SQL> select to_date('20120503', 'yyyymmdd') from dual ;

 

TO_DATE('

---------

03-MAY-12

 

SQL>

 

4. to_number function

 

Syntax : TO_NUMBER(문자값) / to_number( string1, [format_mask], [nls_language] )

-       string1 is the string that will be converted to a number.

-       format_mask is optional. This is the format that will be used to convert string1 to a number.

-       nls_language is optional. This is the nls language used to convert string1 to a number.

 

Example : 문자를 숫자로 변환

SQL> select TO_NUMBER('1234567') from dual ;

 

TO_NUMBER('1234567')

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

             1234567

 

SQL> select to_number('1210.73', '9999.99') from dual ; 

 

TO_NUMBER('1210.73','9999.99')

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

                       1210.73

 

SQL> select to_number('546', '999') from dual ; 

 

TO_NUMBER('546','999')

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

                   546

 

SQL> select to_number('23', '99') from dual ; 

 

TO_NUMBER('23','99')

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

                  23

 

SQL>

 

5. Syntax 의 형식에 대해서

 

형식 : 숫자를 문자로 변환시에 형식에 사용되는 요소

Parameter

Explanation

9

일반적인 숫자를 나타냄

0

앞의 빈자리를 0으로 채움

$

dollar를 표시함

L

지역 통화 단위

.

소숫점을 표시함

,

천단위를 표시함

 

  형식 : 날짜를 문자로 변환시에 형식에 사용되는 요소

Parameter

Explanation

SCC

세기를 표시 S는 기원전(BC)

YEAR

연도를 알파벳으로 spelling

YYYY

4자리 연도로 표시

YYY / YY / Y

끝의 3 / 2 / 1 자리 연도로 표시

Q

Quarter(분기) of year (1, 2, 3, 4; JAN-MAR = 1).

MONTH

월을 알파벳으로 spelling

MON

월의 알파벳 약어

MM

월을 2자리 숫자로 표시

RM

Roman numeral month (I-XII; JAN = I).

WW

Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.

W

Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.

DAY

일에 해당하는 요일, Name of day.

DY

일에 해당하는 요일의 약어

DDD

연도,,일 중의 날짜를 숫자로 표시, Day of year (1-366).

DD

Day of month (1-31).

D

Day of week (1-7).

HH

시간을 표시, Hour of day (1-12).

HH12

시간을 표시, Hour of day (1-12).

HH24

시간을 표시, Hour of day (0-23).

MI

분을 표시, Minute (0-59).

SS

초를 표시, Second (0-59).

SSSSS

Seconds past midnight (0-86399).

FF

Fractional seconds. Use a value from 1 to 9 after FF to indicate the number of digits in the fractional seconds. For example, 'FF4'.

AM(A.M.),PM(P.M.)

오전인지 오후인지를 표시

AD or A.D

AD indicator

BC or B.C.

BC indicator

TZD

Daylight savings information. For example, 'PST'

TZH

Time zone hour.

TZM

Time zone minute.

TZR

Time zone region.

 

Reference : http://www.techonthenet.com/oracle/functions/index.php

End of dicument.

// Subject : [OracleDB] 공통 Invalid Object Compile 방법

// Tag : Oracle DB Invalid Object Compile Manually Recompile script

 

1. Oracle DB 에서 왜 주기적인 Invalid Object ReCompile 이 필요한가 ?

 

아래의 여러 가지 사유들로, Object 들이 Invalid 상태로 빠지게 됩니다.

-       Oracle DB 에 대한 Major, Minor Upgrade 수행 후

-       Function 이 사용하는 Table Column 추가/삭제/변경이 발생되는 경우

 

보통은 Object 들을 CALL/USE 하게 되면, 다시 Valid 상태로 자동 Compile 이 되나,

때로는 아래의 문제들을 발생시키기도 합니다. DB 장애의 원인이 되기도 합니다.

-       ORA-4020 : Deadlock 이 감지된 상태에서의 library object 에 대한 lock을 획득 실패, <Note:130409.1> 참조

-       ORA-00911 : User miss (Descriptive Flexfield 등을 신규생성/수정 시, Segment name 의 첫 CHARACTER 로 숫자나 알파벳 혹은 한글이 아닌 특수문자(ex> "[]")를 사용) Object Compile 불가 상태로 변경된 경우

 

따라서, DBA 들은, 주기적으로 Invalid Object 들을 조사해서, 사전에 Recompile 을 통해, 관련 Object 들의 문제를 조치하고, 예기치 못한 Issue 발생에 대비하고 있습니다.

 

2. Invalid Object Re compile 하는 방법

 

기본적으로 Oracle DB 에는 Invalid Object 들을 Compile 하는 5가지 방법이 존재합니다.

- DBMS_DDL

- DBMS_UTILITY

- UTL_RECOMP

- UTLRP.SQL

- Manually Recompile

 

 저는 간단한 Script 를 이용해서, Manual recompile 하기를 좋아 하는데, text mode telnet 창에 접속하여, 다수의 서버들에서 logging 하면서 동시 작업하기가 편하기 때문입니다. 각각의 방법들은 장단점들이 있지만, 여기서는 언급하지 않고, 수행 방법들만 기술하도록 하겠습니다.

 

2-A. DBMS_DDL.ALTER_COMPILE

 

    Definition : ALTER PROCEDUREFUNCTIONPACKAGE [.] COMPILE [BODY]

    Syntax : Exec dbms_ddl.alter_compile ( type , schema, name);

-       Type : Must be either PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY or TRIGGER.

 

    Example

SQL> exec dbms_ddl.alter_compile ('PROCEDURE','SCOTT','TEST');

PL/SQL procedure successfully completed.

SQL>

 

2-B. DBMS_UTILITY.COMPILE_SCHEMA

 

    Definition : This procedure compiles all procedures, functions, packages, and triggers in the specified schema.

    Syntax : Exec dbms_utility.compile_schema ( schema,compile all)

-       Compile All : Object type ( procedure, function, packages,trigger)

 

    Example

SQL> exec dbms_utility.compile_schema('SCOTT');

PL/SQL procedure successfully completed.

SQL>

 

2-C. UTL_RECOMP

 

    Definition : This script is particularly useful after a major-version upgrade that typically invalidates all PL/SQL and Java objects.

    Syntax : Exec UTL_RECOMP.RECOMP_SERIAL ();

-       Note: Required SYS user to run this package.

 

    Example

SQL> Exec UTL_RECOMP.RECOMP_SERIAL ();

PL/SQL procedure successfully completed.

SQL>

 

2-D. UTLRP.SQL scripts

 

    Definition : Recompiles all existing PL/SQL modules that were previously in an INVALID state, such as packages, procedures, and types.

    Syntax : Located: $ORACLE_HOME/rdbms/admin

-       Note: Required SYS user to run this script.

-       Recommended: After upgrade or migrate database.

 

    Example

SQL> @ c:\oracle\product\10.2.0\db_1\rdbms\admin\UTLRP.SQL

    TIMESTAMP

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

    COMP_TIMESTAMP UTLRP_BGN 2012-02-03 10:40:22

    PL/SQL procedure successfully completed.

    COMP_TIMESTAMP UTLRP_END 2012-02-03 10:40:29

    PL/SQL procedure successfully completed.

SQL>

 

2-E. Manually recompiling : Best Approach to Recompile all Invalid Objects

 

    Syntax : ALTER OBJECT_TYPE.OBJECT_NAME COMPILE ;

-       Note: VIEW, SYNONYM, PUBLIC SYNONYM, PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY, TRIGGER, UNDEFINED (MATERIALIZED VIEW), JAVA CLASS, TYPE, TYPE BODY

 

    Example : Object Type 에 따라, 몇 개의 Script 로 나눌 수 있습니다.

 

SQL> Spool recompile.sql

SQL> Select ‘alter ‘object_type’ ’object_name’ compile ; ’ From user_objects where status <> ‘VALID’ and object_type IN (‘VIEW’, ’SYNONYM’, ‘PROCEDURE’, ’FUNCTION’,     ‘PACKAGE’, ’TRIGGER’) ;

SQL> spool off

SQL> @ recompile.sql

-       Note : VIEW, SYNONYM, PROCEDURE, PACKAGE, FUNCTION, TRIGGER

 

SQL> Spool pkg_body.sql

SQL> Select ‘alter package ’object_name’ compile body ; ’ from user_objects where status <> ‘VALID’ and object_type = ‘PACKAGE BODY’ ;

SQL> spool off

SQL> @ pkg_body.sql

-       Note : PACKAGE BODY

 

SQL> Spool undefined.sql

SQL> select ‘alter materizlized view ’object_name’ compile ; ’ from user_objects where status <> ‘VALID’ and object_type =‘UNDEFINED’ ;

SQL> spool off

SQL> @ undefined.sql

-       Note : UNDEFINED

 

SQL> Spool javaclass.sql

SQL> Select ‘alter java class ’object_name’ resolve ; ’ from user_objects where status <> ‘VALID’ and object_type =‘JAVA CLASS’ ;

SQL> spool off

SQL> @ javaclass.sql

-       Note : JAVA CLASS’

 

SQL> Spool typebody.sql

SQL> Select ‘alter type ‘object_name’ compile body ; ’ from user_objects where status <> ‘VALID’ and object_type =‘TYPE BODY’ ;

SQL> spool off

SQL> @ typebody.sql

-       Note : TYPE BODY

 

SQL> Spool public_synonym.sql

SQL> Select ‘alter public synonym ‘object_name’ compile ; ’ from user_objects where status <> ‘VALID’ and owner = ‘PUBLIC’ and object_type = ‘SYNONYM’ ;

SQL> spool off

SQL> @ public_synonym.sql

-       Note : PUBLIC SYNONYM

 

End of document.

1.1.1  Windows 7 에서 Oracle 10g 설치시 Error 발생

 

A.    개요

 

Oracle Database 12c(Cloud version)이 곧 GA release를 앞두고 있으나, 아직도 많은 고객들이 Oracle 8.0.x, 8i, 9i, 10g, 11g를 사용하고 있고, 이를 최신 Windows 7 (혹은 Vista)에 설치하는 경우가 있다. 설치할 DB version 은 정책적 결정 사항이다.

현재 가장 많이 사용되고 있는 Oracle DB 10g 버전을 Windows 7 환경에서 설치하기 위해 Tip이 필요한 이유는, 10g 출시 때에는 windows 7 등이 아직 출시되지 않았기 때문이다. 이미 많은 사례들을 통해, Support 가 확인되었으므로, 아래의 Tip을 통해, 설치가 가능하다

아래의 Tip 은 10g DBMS 혹은 Client 설치 모두에 적용 가능합니다. 


B.    Windows 7/Vista/2008R2 에서, Oracle 10g DBMS/Client 설치 시, Error 발생

 

발생 Error Message 생략

특정한 화일을 찾을 수 없다거나, 현제 버전을 지원할 수 없다는 메세지가 출력된다.

 

1.1.2  W/A(Support List 추가) 조치 후 Install 가능

 

A.    설치 Binary 선택

 

Windows 7 64 bit 인 경우 10204_vista_w2k8_x64_production_db.zip 을 사용

 

B.    설치 Binary 수정

설치 환경화일 중에, 아래 3개 file 에 Windows 7 에 해당하는 Code 6.1 을 넣은 후, 고급설치를 선택해 설치를 진행하면 됩니다. OS, DB 세부 version 에 따라 유사 이름의 다른 폴더에 화일이 존재하거나, 동일 폴더에 유사한 이름의 화일이 존재하기도 합니다. 

위치 : \10204_vista_w2k8_x64_production_db\database\install\oraparam.ini

수정사항 : Windows 7 을 의미하는 6.1을 추가

[Certified Versions]

#You can customise error message shown for failure, provide value for CERTIFIED_VERSION_FAILURE_MESSAGE

Windows=5.0,5.1,5.2,6.0,6.1

 

위치 : \10204_vista_w2k8_x64_production_db\database\stage\prereq\db\refhost.xml

수정사항 : Windows 7 을 의미하는 6.1라인들을 추가

<CERTIFIED_SYSTEMS>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.0"/>

      <SERVICE_PACK VALUE="1"/>

    </OPERATING_SYSTEM>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.1"/>

      <SERVICE_PACK VALUE="1"/>

    </OPERATING_SYSTEM>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.2"/>

    </OPERATING_SYSTEM>

    <!--Microsoft Windows Vista-->

    <OPERATING_SYSTEM>

      <VERSION VALUE="6.0"/>

    </OPERATING_SYSTEM>

    <!--Microsoft Windows 7-->

    <OPERATING_SYSTEM>

       <VERSION VALUE="6.1"/>

    </OPERATING_SYSTEM>

  </CERTIFIED_SYSTEMS>

 

위치 :  \10204_vista_w2k8_x64_production_db\database\stage\prereq\db_prereqs\db\refhost.xml

수정사항 : Windows 7 을 의미하는 6.1라인들을 추가

<CERTIFIED_SYSTEMS>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.0"/>

      <SERVICE_PACK VALUE="1"/>

    </OPERATING_SYSTEM>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.1"/>

      <SERVICE_PACK VALUE="1"/>

    </OPERATING_SYSTEM>

    <OPERATING_SYSTEM>

      <VERSION VALUE="5.2"/>

    </OPERATING_SYSTEM>

    <!--Microsoft Windows Vista-->

    <OPERATING_SYSTEM>

      <VERSION VALUE="6.0"/>

    </OPERATING_SYSTEM>

    <!--Microsoft Windows 7-->

    <OPERATING_SYSTEM>

      <VERSION VALUE="6.1"/>

    </OPERATING_SYSTEM>

  </CERTIFIED_SYSTEMS>

 

C.    Installer 에서 고급설치를 선택


기본 설치로 진행 할 경우 오류가 발생합니다. “고급 설치로 진행합니다.

 

End of Documents.

1. (CDC 제품에서 일반적으로) Supplemental Logging 이 필요한 이유

   복제의 원본이 되는 "소스DB"에서 Update Query 등이 수행될 때, Update Query 등으로 실제 변경이 발생된 column 뿐 아니라, 나머지 Column 들의 정보를 함께 Archive Log 에 남기기 위해서는  Supplemental Logging 이 활성화 되어야만 합니다.

   
    SQL> select * from emp;   
      
         EMPID        SAL    
    ---------- ----------            
            10     100000     

    SQL> update emp set sal=150000;      

    1 row updated.
 
    SQL>


<< 해설 >>

    The EMP table has a primary key defined on the EMPID column.
    --> If supplemental logging is turned on for primary key columns, then any update to EMP logs the EMPID column.
    --> Without supplemental logging, We can find following data in redo/Archive log :      

        update "SCOTT"."EMP" set "SAL" = '150000' where "SAL" = '100000' and ROWID ='AAABOaAABAAANZ/AAA';     

    --> But, with the log group test_always defined above :     

        update "SCOTT"."EMP" set "SAL" = '150000' where "EMPID" = '10' and "SAL" ='100000' and ROWID = 'AAABOaAABAAANZ/AAA';    


2. Supplemental Logging 개요 (Level 및 방법)

   Database-Level 과 Table-Level 로 나눌 수 있습니다.
    --> Oracle Documents : http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL1582

   일반적으로,

   Database-Level 로 설정하는 경우, 해당 DB Instance 의 모든 Table 들에 대해, 자동으로 Supplemental Logging 이 됩니다.  따라서, 기존 대비 많은 양의 Rodo log switch 가 발생되고 (Archive Log 량이 증가), log switch 에 따른 overhead 가 증가됩니다.

   Table-Level 로 설정하는 경우, 각 대상 table 들에 대해서 각각 alert 해 주어야 하는 불편함이 있지만
   Database-Level 설정 대비, overhead 가 감소되어 운영 부담이 줄어드는 장점이 있습니다.  


  2-A. Database-Level Supplemental Logging
 
    -- 최소 단위 (MIN) 으로 설정하는 방법

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA ;
SQL> ALTER SYSTEM SWITCH LOGFILE


    -- 확인하는 방법

SQL> select SUPPLEMENTAL_LOG_DATA_MIN S_MIN, SUPPLEMENTAL_LOG_DATA_PK S_PK, SUPPLEMENTAL_LOG_DATA_UI S_UI,
      2  SUPPLEMENTAL_LOG_DATA_FK S_FK, SUPPLEMENTAL_LOG_DATA_ALL S_ALL from v$database ;

    S_MIN            S_PK   S_UI   S_FK   S_ALL
    ---------------- ------ ------ ------ ------
    YES              NO     NO     NO     NO

SQL


    -- PK/UK 정보를 추가로 남기기 위해서 설정하는 방법

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE KEY) COLUMNS ;
SQL> ALTER SYSTEM SWITCH LOGFILE


    -- 확인하는 방법

SQL> select SUPPLEMENTAL_LOG_DATA_MIN S_MIN, SUPPLEMENTAL_LOG_DATA_PK S_PK, SUPPLEMENTAL_LOG_DATA_UI S_UI,
      2  SUPPLEMENTAL_LOG_DATA_FK S_FK, SUPPLEMENTAL_LOG_DATA_ALL S_ALL from v$database ;

    S_MIN            S_PK   S_UI   S_FK   S_ALL
    ---------------- ------ ------ ------ ------
    YES              YES    YES    NO     NO

SQL>



  2-B. Table-Level Supplemental Logging

   Table 전체(모든 Column)를 지정하는 방법과 Table 의 특정 Column 들만 지정하는 방법이 있습니다.

   Table 전체(모든 Column)를 지정하면, 해당 table 의 모든 column 에 Supplemental Logging 이 활성화 됩니다.
   해당 table 의 column 이 추가되면, 자동으로 추가된 column 에 Supplemental Logging 이 활성화 됩니다.

   Table 의 특정 Column 들만 지정하면, 해당 table 의 지정된 column 들에 Supplemental Logging 이 활성화 됩니다.
   해당 table 의 column 이 추가되면, 추가된 column 들은 자동으로 Supplemental Logging 되지 않습니다.
   추가로 alter 를 수행하여, 새로운 column 에 Supplemental Logging 을 활성화 해야만 합니다

    -- Table 의 전체 Column 을 지정하는 방법

SQL> ALTER TABLE SAPP.T1121_B ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS ;
SQL> ALTER TABLE SAPP.T1121_B DROP SUPPLEMENTAL LOG DATA (ALL) COLUMNS ;

    -- 확인하는 방법 : 하기 참조

    -- Table 의 특정 Column 을 지정하는 방법

SQL> ALTER TABLE SAPP.T1121_B ADD SUPPLEMENTAL LOG GROUP GGS_T1121_B_1 (AA, AA_2) ;
SQL> ALTER TABLE SAPP.T1121_B DROP SUPPLEMENTAL LOG GROUP GGS_T1121_B_1


    -- 확인하는 방법 : 하기 참조


  2-C. Table-Level Level Supplemental Logging 설정 및 조회 방법

    -- GGSCI 에서 add trandata 수행

GGSCI> add trandata sapp.t1121_b

    -- SQL Plus 에서 add supplemental log 수행

SQL> alter table sapp.t1121_b add supplemental log group ggs_t1121_b_1 (AA, AA_2) ;

Table altered.

SQL>


    -- 결과 조회 (column 단위 Logging)

SQL> select LOG_GROUP_NAME, TABLE_NAME, COLUMN_NAME, POSITION from dba_log_group_columns where table_name = 'T1121_B' ;

LOG_GROUP_NAME    TABLE_NAME    COLUMN_NAME           POSITION
--------------- --------------- -------------------- ----------
GGS_T1121_B_1    T1121_B     AA             1
GGS_T1121_B_1    T1121_B     AA_2             2

SQL> select * from dba_log_groups where table_name = 'T1121_B' ;

OWNER                   LOG_GROUP_NAME    TABLE_NAME      LOG_GROUP_TYPE         ALWAYS      GENERATED
------------------------------ ---------------   --------------- ------------------- ----------- --------------
SAPP                   GGS_T1121_B_1     T1121_B     USER LOG GROUP         CONDITIONAL USER NAME
SAPP                   GGS_T1121_B_74844 T1121_B     USER LOG GROUP         ALWAYS      USER NAME

SQL>


    -- SQL Plus 에서 모든 Column 에 대한 Logging 수행

SQL> ALTER TABLE SAPP.T1121_B add SUPPLEMENTAL LOG DATA (ALL) COLUMNS ;

Table altered.

SQL> select * from dba_log_groups where table_name = 'T1121_B' ;

OWNER                   LOG_GROUP_NAME    TABLE_NAME      LOG_GROUP_TYPE         ALWAYS      GENERATED
------------------------------ ---------------   --------------- ------------------- ----------- --------------
SAPP                   GGS_T1121_B_1     T1121_B     USER LOG GROUP         CONDITIONAL USER NAME      << alter table (col1, col2) 로 한 것
SAPP                   GGS_T1121_B_74844 T1121_B     USER LOG GROUP         ALWAYS      USER NAME      << ggsci 에서 add trandata 로 건 것
SAPP                   SYS_C0011504      T1121_B     ALL COLUMN LOGGING  ALWAYS      GENERATED NAME << dba 가 all column 으로 설정한 것

SQL>


3. OGG 제품에서 Supplemental Logging 설정 Review

  3-A. 일반적인 복제(1:1) 요건을 충족하기 위한 Logging 설정 시

   OGG 설치 단계중에서 CDC 대상 Table 에 대한 Add TranData 작업은 Table Level 의 Supplemental logging 처리이며, Log Group Name 은 기본적으로 OGG_[Table Name]_[Object ID] 가 됩니다.

   즉

SQL> ALTER TABLE [Table Owner].[Table Name] ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

   이 아니라 아래의 DDL 이 수행된 결과입니다.

SQL> ALTER TABLE [Table Owner].[Table Name] ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;

   추가로, Add TranData 작업을 하기 위해서는,  Database-Level Supplemental logging 의 SUPPLEMENTAL_LOG_DATA_MIN 이 YES 이여야만 합니다.


  3-B. Historial Table 을 모든 Column 을 기준으로 남기기 위한 Logging 설정 시

   특정 Table 에 대해서 Table 의 모든 column 에 대하여 Supplemental logging 처리를 위해서 다음과 같이 수행한다.

SQL> ALTER TABLE [Table Owner].[TABLE Name] ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;


   특정 Table 에 대해서 특정 column 에 대해서 Supplemental logging 처리를 위해서 다음과 같이 수행한다. 

SQL> ALTER TABLE [Table Owner].[Table Name] ADD SUPPLEMENTAL LOG GROUP [LOG Group Name] (column1, column2, ...); 


   S사의 사례처럼, Historial Table 을 모든 Column 을 기준으로 남기기 위해서

SQL> ALTER TABLE [Table Owner].[TABLE Name] ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

   을 수행하는 경우,

   Database-Level Supplemental logging 의 SUPPLEMENTAL_LOG_DATA_MIN 이 YES 이여야만 합니다.
   Add TranData 작업은 불필요 합니다. (Add TranData 작업을 하게 되면, 중복해서 Logging 설정됨)
      
   
4. S사 환경에서, 향후(2012.01.26 이후) 복제대상으로 새로운 Table 이 추가시 절차 (간략 흐름도)

  4-A. 추가 Table 에 대한 SUPPLEMENTAL Logging

    - DBA 가 해당 table 에 대한 ALTER TABLE [Table Owner].[TABLE Name] ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; 수행

      cf> GGSCI> add trandata owner.table 은 수행하지 않는다.

  4-B. 추가 Table 을 OGG Configuration 에 반영
 
    - 해당 extract, pump 및 replicat 에 해당 table mapping 을 반영
    - 소스서버#] defgen 으로 새로운 table layout 을 추출해, 타켓서버에 반영

  4-C. OGG 에서 복제 반영을 시작

    - (필요시 pump 및) Replicat 을 restart 하여, 복제를 반영할 준비 완료 후
    - Extract 를 restart 하여, 새로운 table 에 대한 추출을 시작

End of Documents.

+ Recent posts