2014年11月4日 星期二

Oracle 資料庫轉換字元集工具:csscan

# 主題
CSSCAN (Character Set Scanner) 


# 適用版本
Oracle Database - Enterprise Edition - Version 8.1.7.4 and later 
Oracle Database - Standard Edition - Version 8.1.7.4 and later 
Information in this document applies to any platform. 


# 現象/目的 
在從前建置Oracle DB時,我們會將字元集設定成BIG5,但是網路促成的無國界情境使得種種軟體包含資料庫本身都必須容納多國語系,所以公司內部的資料庫大多早早已轉換成UTF8,但是受限於商業軟體,或者是其他考量,少部分資料庫還是停留在BIG5,倘若有朝一日當資料庫需要做轉換時,如果來源端跟目的端的資料庫字元集不一致時,必須先使用csscan 工具來確認對資料的影響性。


# 解決方式/內容
1. 準備動作
  1.1 確認目前字元集: 
         SQL> select value 
                    from NLS_DATABASE_PARAMETERS 
                    where parameter='NLS_CHARACTERSET'; 

NLS_CHARACTERSET 定義存放在資料庫的是何種字元,而非由 NLS_LANGUAGE 或是 NLS_TERRITORY 決定的 

  1.2 DB Version小於10.2.0.4或是11.1.0.6,impdp會有資料毀損狀況,expdp不受影響,apply patch 5874989可解決此bug。這問題在10.2.0.4 and 11.1.0.7 patch set,或是11.2.0.1 以上版本被解決。

  1.3 清除recyclebin
        $ sqlplus / as sysdba


        SQL> SELECT OWNER, ORIGINAL_NAME, OBJECT_NAME, TYPE 
                   FROM dba_recyclebin ORDER BY 1,2;

        SQL> purge dba_recyclebin;

  1.4 compile invalid objects
        $ sqlplus / as sysdba

        SQL> SELECT owner,object_name,object_type,status
                   FROM dba_objects
                   WHERE status ='INVALID';


        SQL> @?/rdbms/admin/utlrp.sql

  1.5 可以移除sample schema:'HR', 'OE', 'SH', 'PM', 'IX', 'BI' and 'SCOTT',如果沒有用到APEX / HTML DB也可移除FLOWS_XXX 以及APEX_XXX Users。

2. 參考 Note 745809.1 安裝必要物件 (10g / 11g)
$ export ORACLE_SID=ORCL 
$ sqlplus /nolog 
SQL> conn / as sysdba 
SQL> set termout on 
SQL> set echo on 
SQL> spool csminst.log 
SQL> -- note the drop user 
SQL> drop user csmig cascade; 
SQL> @?/rdbms/admin/csminst.sql 

3. 執行 csscan
$ csscan \"system/password as sysdba\" USER=schema TOCHAR=UTF8 ARRAY=1024000 PROCESS=3 LOG=csscan_log

4. 檢查產出的報表並修正
  4.1  csscan_log.out ==> 執行csscan的過程
  4.2  csscan_log.txt ==> tables / column 有無異常的總表
  4.3  csscan_log.err ==> tables / column 有異常的資料明細
  4.4  通常BIG5轉UTF8欄位大小是除以2乘以3:column_size / 2 * 3 (因為一個中文字在BIG5中佔2個bytes,在UTF8中佔3個bytes)


# 參考文件
Note 225912.1 
Changing Or Choosing the Database Character Set ( NLS_CHARACTERSET ) 

Note 458122.1 
Installing and Configuring Csscan in 8i and 9i (Database Character Set Scanner) 

Note 745809.1 
Installing and configuring Csscan in 10g and 11g (Database Character Set Scanner) 

Note 444701.1 
Csscan output explained

(Doc ID 260192.1)
Changing the NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode) in 8i, 9i , 10g and 11g