Oracle Character Set 변환(5): 5. Oracle 권장 방법
Oracle 권장 Character Set 변환 방법 에 대해 살펴본다. CSALTER 사용 방법과 한계점, CSSCAN 사용 방법과 실행 순서, 실행결과 파일, CSSCAN 실행 결과 저장 Table을 생성하는 DDL을 확인할 수 있다.
이전 글에서 이어지는 내용이다.
Oracle Character Set 변환(4): 4.테스트 환경 구성
5. Oracle 권장 Character Set 변환 방법 (CSALTER, CSSCAN)
Oracle은 Full Export & Import 방법과 CSALTER script를 활용하는 방법을 권장하고 있다. 이 중 먼저 CSALTER를 사용하는 방법에 대해 살펴본다.
5.1. CSALTER 사용 방법
Oracle 문서는 아래 URL에서 확인할 수 있다.
데이터베이스의 character set을 변경하기 위해서 다음 절차를 실행한다.
- Shut down the database, using either a SHUTDOWN IMMEDIATE or a SHUTDOWN NORMAL statement.
- Do a full backup of the database, because the CSALTER script cannot be rolled back.
- Start up the database.
- Run the Database Character Set Scanner utility.
CSSCAN /AS SYSDBA FULL=Y… - 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
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을 참고한다.
csscan은 다음 순서로 실행한다.
- schema 생성: $ORACLE_HOME/rdbms/admin/csminst.sql 실행
- directory 생성: D:\temp\csscan 생성 (실행결과 파일 저장 용도)
- csscan 실행
- csscan 실행결과 확인
csscan 실행결과로 세 개의 파일이 생성된다.
- scan.txt: scan 결과 요약 보고서
- scan.out: scan 대상 테이블 정보
- scan.err: 오류 상세 내역
scan.txt (scan 결과 요약 보고서)는 다음의 내용으로 구성되어 있다. (클릭시 oracle 문서로 이동)
- Database Size
- Database Scan Parameters
- Scan Summary
- Data Dictionary Conversion Summary
- Application Data Conversion Summary
- Application Data Conversion Summary Per Column Size Boundary: BOUNDARIES parameter 지정한 경우만 출력
- Distribution of Convertible Data Per Table
- Distribution of Convertible Data Per Column
- Indexes To Be Rebuilt
- Truncation Due To Character Semantics
[Data Conversion Summary] 내용에서 Changeless, Convertible, 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을 실행한 결과에 대해 살펴본다.