DB(Database)/ORACLE

Oracle Character Set 변환(5): 5.Oracle 권장 방법

ProDA 2022. 3. 21.

이 글은 새로운 블로그로 옮겼습니다. 5초후 자동으로 이동합니다.

▶ 새로운 블로그 주소: https://prodskill.com/

▶ 새로운 글 주소: https://prodskill.com/oracle-character-set-migration-5-oracle-recommendation/

이 글에서는 Oracle에서 권장하는 Oracle Character Set 변환 방법에 대해 알아보고 한계점에 대해서도 함께 살펴본다.

목차


    5. Oracle 권장 Character Set 변환 방법 (CSALTER, CSSCAN)

    Oracle은 Full Export & Import 방법과 CSALTER script를 활용하는 방법을 권장하고 있다. 이 중 먼저 CSALTER를 사용하는 방법에 대해 살펴본다.

     

    5.1. CSALTER 사용 방법

    Oracle 문서는 아래 URL에서 확인할 수 있다.

    Migrating a Character Set Using the CSALTER Script (https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch11charsetmig.htm#NLSPG469)

     

    데이터베이스의 character set을 변경하기 위해서 다음 절차를 실행한다.

    1. Shut down the database, using either a SHUTDOWN IMMEDIATE or a SHUTDOWN NORMAL statement.
    2. Do a full backup of the database, because the CSALTER script cannot be rolled back.
    3. Start up the database.
    4. Run the Database Character Set Scanner utility.
      CSSCAN /AS SYSDBA FULL=Y...
    5. Run the CSALTER script.
      @@CSALTER.PLB
      SHUTDOWN IMMEDIATE; -- or SHUTDOWN NORMAL;
      STARTUP;

     

    하지만 CSALTER는 사용자가 생성한 데이터는 변환하지 않는다. (위 URL의 문서 내용 일부 발췌)

    Note that the CSALTER script does not perform any user data conversion. It only changes the character set metadata in the data dictionary. Thus, after the CSALTER operation, Oracle behaves as if the database was created using the new character set.

     

    이것은 CSALTER의 한계점이고, CSALTER를 character set 변환에 사용하는 것은 대부분의 application 환경에서 적합하지 않다.

     

    다만, CSSCAN(Database Character Set Scanner utility)는 변환 대상 데이터베이스에 대해 변환 가능한 데이터와 변환시 문제가 되는 데이터를 미리 파악하는 용도로 사용할만 하다.

     

    5.2. CSSCAN 사용 방법

    다음 명령어로 csscan 실행에 필요한 parameter를 확인할 수 있다.

    csscan help=y

    csscan help
    csscan help

     

    C:\Users\ymlee>csscan help=y
    
    
    Character Set Scanner v2.2 : Release 11.2.0.1.0 - Production on 일 3월 20 22:58:48 2022
    
    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
    
    
    You can let Scanner prompt you for parameters by entering the CSSCAN
    command followed by your username/password:
    
      Example: CSSCAN \"SYSTEM/MANAGER AS SYSDBA\"
    
    Or, you can control how Scanner runs by entering the CSSCAN command
    followed by various parameters. To specify parameters, you use keywords:
    
      Example:
        CSSCAN \"SYSTEM/MANAGER AS SYSDBA\" FULL=y TOCHAR=utf8 ARRAY=1024000 PROCESS=3
    
    Keyword    Default Prompt Description
    ---------- ------- ------ -------------------------------------------------
    USERID             yes    username/password
    FULL       N       yes    scan entire database
    USER               yes    owner of tables to be scanned
    TABLE              yes    list of tables to scan
    COLUMN             yes    list of columns to scan
    EXCLUDE                   list of tables to exclude from scan
    TOCHAR             yes    new database character set name
    FROMCHAR                  current database character set name
    TONCHAR                   new national character set name
    FROMNCHAR                 current national character set name
    ARRAY      1024000 yes    size of array fetch buffer
    PROCESS    1       yes    number of concurrent scan process
    MAXBLOCKS                 split table if block size exceed MAXBLOCKS
    CAPTURE    N              capture convertible data
    SUPPRESS                  maximum number of exceptions logged for each table
    FEEDBACK                  report progress every N rows
    BOUNDARIES                list of column size boundaries for summary report
    LASTRPT    N              generate report of the last database scan
    LOG        scan           base file name of report files
    PARFILE                   parameter file name
    PRESERVE   N              preserve existing scan results
    LCSD       N       no     enable language and character set detection
    LCSDDATA   LOSSY   no     define the scope of the detection
    HELP       N              show help screen (this screen)
    QUERY      N              select clause to scan subset of tables or columns
    ---------- ------- ------ -------------------------------------------------
    Scanner terminated successfully.

    각 parameter에 대한 자세한 설명은 다음 URL을 참고한다.

    Database Character Set Scanner Parameters (https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#NLSPG498)

     

    csscan은 다음 순서로 실행한다.

    1. schema 생성: $ORACLE_HOME/rdbms/admin/csminst.sql 실행
    2. directory 생성: D:\temp\csscan 생성 (실행결과 파일 저장 용도)
    3. csscan 실행
    4. csscan 실행결과 확인

     

    csscan 실행결과로 세 개의 파일이 생성된다.

    • scan.txt: scan 결과 요약 보고서
    • scan.out: scan 대상 테이블 정보
    • scan.err: 오류 상세 내역

     

    scan.txt (scan 결과 요약 보고서)는 다음의 내용으로 구성되어 있다. (클릭시 oracle 문서로 이동)

     

    [Data Conversion Summary] 내용에서 Changeless, Convertable, Truncation, Lossy에 대한 설명은 아래 문서에서 확인할 수 있다.

    https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#g1019330

    Status Description
    Changeless Data remains the same in the new character set
    - character set 변환시 데이터 변경없음
    Convertible Data can be successfully converted to the new character set
    - character set 변환시 데이터 변경 가능함
    Truncation Data will be truncated if conversion takes place
    - character set 변환시 데이터 잘림
    Lossy Character data will be lost if conversion takes place
    - character set 변환시 데이터 손실됨(깨짐)

     

    5.2.1. CSSCAN 실행 결과 저장 Table

    csminst.sql 실행시 생성되는 여러 table 중 아래 table에 csscan 결과가 저장된다.

    • CSM$TABLES
    • CSM$COLUMNS
    • CSM$ERRORS

     

    주의할 점은 매번 CSSCAN 실행시마다 이 table의 데이터는 모두 초기화된다는 점이다.(scan.txt, scan.out, scan.err 파일도 마찬가지로 초기화된다)

    CSSCAN을 여러 번 실행하면서 결과를 비교하고자 할 경우는 별도 table로 백업해 두는 것이 좋다.

     

    백업시에는 아래 DDL을 참고하기 바란다.

    CREATE  TABLE Z_CSSCAN_COL_SUMMARY
    AS
    SELECT  '20140507' BASE_DT, U.USERNAME, TC.TABLE_NAME, TC.COLUMN_NAME
           ,CC.NUMROWS, CC.NULCNT, CC.CNVCNT, CC.CNVTYPE, CC.ERRCNT, CC.SIZERR
           ,CC.CNVERR, CC.MAXSIZ, CC.CHRSIZ
      FROM  CSMIG.CSM$COLUMNS CC INNER JOIN DBA_USERS U
              ON   (CC.USR# = U.USER_ID)
            INNER JOIN DBA_OBJECTS O
              ON   (CC.OBJ# = O.OBJECT_ID)
            INNER JOIN DBA_TAB_COLUMNS TC
              ON   (CC.COL# = TC.COLUMN_ID
                AND O.OBJECT_NAME = TC.TABLE_NAME)
     WHERE  1=1
       AND  U.USERNAME = 'LEG'
       AND  O.OBJECT_TYPE = 'TABLE'
       AND  CC.ERRCNT <> 0;

     

    위 DDL의 실행결과로 생성되는 데이터 샘플은 다음과 같다.

    Row# BASE_DT USERNAME TABLE_NAME COLUMN_NAME NUMROWS NULCNT CNVCNT CNVTYPE ERRCNT SIZERR CNVERR MAXSIZ CHRSIZ
    1 20140507 LEG Z_TEST VAL 2 0 0 0 2 0 2 12 0
    2 20140507 LEG SUB_MON_STAT LINE_NUM 7426 0 0 0 7426 3238 7426 38 0
    3 20140507 LEG SUB_MON_STAT SUB_STA_NM 7426 0 0 0 7426 1268 7426 54 0
    4 20140507 LEG SUB_MON_STAT COMMT 7426 7425 0 0 1 1 1 9000 0
    5 20140507 LEG SUB_MON_STAT REF_DES 7426 7425 0 0 1 0 1 3000 0

    여기까지 Oracle 권장 Character Set 변환 방법 (CSALTER, CSSCAN)에 대해 살펴보았다. 다음에는 US7ASCII, KO16MSWIN949 테스트 환경에서 CSSCAN을 실행한 결과에 대해 살펴본다.

    댓글

    💲 추천 글