使用Ccscan進行資料字符集轉換驗證(上)

realkid4發表於2015-09-02

 

字符集問題是IT領域各個方面都需要面對的問題。從最早網頁程式設計亂碼,到資料庫報表顯示亂碼,搜尋引擎上IT方面最流行的幾個問題裡面,亂碼可能能排到前幾名關鍵字。

 

Oracle資料庫字符集合問題,也經常是網路同仁討論的問題。在進行資料遷移、備份還原的時候,字符集是一個不能迴避的問題。但是,有一點是可以明確的,資料從一個資料字符集轉換到另一個字符集,總會有一些潛在的問題和風險點。

 

1、“列長度不足”問題

 

我們在日常的遷移和備份還原中,經常遇到一種“列寬長度不足”的現象。原本資料表資料定義,匯入到新環境中就報錯長度不夠。這種是一種典型的字符集轉換錯誤。字符集最典型的特徵就是對一些非標準字元(非數字、英文字母)的表示,經常用到的ZHS16GBK是用兩個位元組表示一箇中文字元,例如varchar2(4)最多容納兩個中文字元。但是一些多位元組編碼方式,如AL32UTF8,就是三個位元組表示一箇中文字元。這樣問題就出現了,如果原來容納的字元是兩個中文字,varchar2(4)ZHS16GBK格式下是沒問題的,轉化到AL32UTF8格式下的時候,varchar2(4)就容納不下兩個漢字,就需要varchar2(6)來進行容納了。

 

究竟是否可以實現這種字符集轉換遷移,存在很大程度的偶然性。如果資料恰好可以滿足條件,從ZHS16GBKAL32UTF8這樣的轉換也是沒有過多問題的。即使存在問題,我們是可以考慮在遷移源中,人工加大特定欄位長度,確保遷移後容量,來解決這種問題。這個就存在一個“測試檢驗”過程。

 

Oracle中,就提供了一個簡單的工具程式Ccscan,幫助我們確定特定的資料集合在從一個字符集到另一個字符集轉換過程中是否存在問題,是否存在相容、截斷現象。我們可以透過這個分析結果,預先進行欄位處理或者截斷,便於後續的資料遷移工作。本篇主要介紹Ccscan這個古老工具的安裝和簡單的演示。

 

2Ccscan安裝

 

Ccscan是一個很古老的工具,之所以應用不是很廣泛就在於長期以來IT人員對於字符集和問題有迴避的心態。只要一次性的設定好了,不到萬不得已,絕不會輕易變更。所以Ccscan實際場景案例並不是很多。

 

每個版本的Ccscan安裝過程都有所差異,在官方MOS介紹中,針對不同版本有不同的步驟介紹。筆者選擇最普遍使用11.2.0.4作為實驗目標。

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

 

預設情況下Ccscan是沒有安裝的,安裝程式是一個SQL指令碼,放置在$ORACLE_HOME/rdbms/admin目錄中。同很多Oracle工具一樣,安裝Ccscan過程會自動建立一個鎖定lock使用者CSMIG作為基礎資料儲存的位置。

 

另外,預設情況下Ccscan使用system表空間。如果我們分析的資料庫比較大,資料量很多的話,最好可以指定一個專門的表空間用於CSMIG使用者使用。當然,這就需要手工進行指令碼修改了。

 

執行csminst.sql,可以啟動安裝程式。

 

 

SQL> drop user csmig cascade;

drop user csmig cascade

          *

ERROR at line 1:

ORA-01918: user 'CSMIG' does not exist

 

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

User created.

 

Grant succeeded.

(篇幅原因,有省略……

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

 

當前資料庫字符集ZH16GBK

 

 

SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET';

PARAMETER                      VALUE

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

NLS_CHARACTERSET               ZHS16GBK

 

 

3、測試執行實驗

 

根據說明內容,進行安裝完成後的空轉測試。

 

 

[oracle@ddd ~]$ csscan table='(sys.sql_version$)' fromchar=zhs16gbk tochar=zhs16gbk log=instchkc capture=n process=1 array=1024000

csscan: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file: No such file or directory

 

 

這個錯誤雖然沒有遇到過,但是應該是系統配置方面的問題,經過查證資料,找到了處理方法。

 

首先進入$ORACLE_HOME/lib目錄,確定對應so檔案是否存在。

 

 

[root@ddd ~]# su - oracle

[oracle@ddd ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/lib/

 

[oracle@ddd lib]$ ls -l | grep libclntsh.so.10.1

lrwxrwxrwx. 1 oracle oinstall        56 Aug 25 14:17 libclntsh.so.10.1 -> /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclntsh.so

 

 

進入root使用者,修改/etc/ld.so.conf檔案,將$ORACLE_HOME/lib目錄加入到其中。

 

 

[oracle@ddd lib]$ exit

logout

 

[root@ddd ~]# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

/u01/app/oracle/product/11.2.0/dbhome_1/lib

 

 

使用ldconfig重新整理配置。

 

 

[root@ddd ~]# ldconfig

ldconfig: File /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnmevc.so.0 is empty, not checked.

(篇幅原因,有省略……

ldconfig: /u01/app/oracle/product/11.2.0/dbhome_1/lib/libexpat.so.1 is not a symbolic link

 

 

確定so檔案已經可以訪問到。

 

 

[oracle@ddd ~]$  ldd `which sysresv`

        linux-vdso.so.1 =>  (0x00007fff633ff000)

        libclntsh.so.11.1 => /u01/app/oracle/product/11.2.0/dbhome_1/lib/libclntsh.so.11.1 (0x00007f0f434ba000)

        libnnz11.so => /u01/app/oracle/product/11.2.0/dbhome_1/lib/libnnz11.so (0x00007f0f430eb000)

        libdl.so.2 => /lib64/libdl.so.2 (0x0000003733e00000)

        libm.so.6 => /lib64/libm.so.6 (0x0000003734a00000)

        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003734600000)

        libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003743a00000)

        libc.so.6 => /lib64/libc.so.6 (0x0000003734200000)

        libaio.so.1 => /lib64/libaio.so.1 (0x00007f0f42ed0000)

        /lib64/ld-linux-x86-64.so.2 (0x0000003733a00000)

 

 

呼叫程式確定正常。

 

 

[oracle@ddd ~]$ csscan help=y

 

Character Set Scanner v2.2 : Release 11.2.0.4.0 - Production on Wed Sep 2 10:28:28 2015

 

Copyright (c) 1982, 2011, 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.

 

 

重新執行測試程式。

 

 

[oracle@ddd ~]$ csscan table='(sys.sql_version$)' fromchar=zhs16gbk tochar=zhs16gbk log=instchkc capture=n process=1

 

Character Set Scanner v2.2 : Release 11.2.0.4.0 - Production on Wed Sep 2 10:29:07 2015

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

Username: system

Password:

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

Enter array fetch buffer size: 1024000 >

 

Enumerating table to scan...

. process 1 scanning SYS.SQL_VERSION$[AAAACVAABAAAASgAAA]

Creating Database Scan Summary Report...

Creating Individual Exception Report...

 

Scanner terminated successfully.

 

 

ccscan幫助中引數情況看,該工具和Exp/Imp相似,都支援表模式、使用者schema模式和全庫模式三種資料範圍。執行後,我們在當前目錄上是可以找到生成檔案的。

 

 

[oracle@ddd ~]$ ls -l

total 16

-rw-r--r--. 1 oracle oinstall 1357 Sep  2 10:29 instchkc.err

-rw-r--r--. 1 oracle oinstall  599 Sep  2 10:29 instchkc.out

-rw-r--r--. 1 oracle oinstall 7847 Sep  2 10:29 instchkc.txt

 

 

其中,.out檔案是工作日誌,程式工作過程中所有輸出在這個檔案中被儲存。.err檔案為掃描錯誤檔案,將掃描出的問題故障彙總分別記錄在其中。.txt檔案是彙總檔案,將掃描scan結果進行彙總。

 

具體資訊樣式在之後的演示實驗中進行詳細說明。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1789859/,如需轉載,請註明出處,否則將追究法律責任。

相關文章