使用Ccscan進行資料字符集轉換驗證(上)
字符集問題是IT領域各個方面都需要面對的問題。從最早網頁程式設計亂碼,到資料庫報表顯示亂碼,搜尋引擎上IT方面最流行的幾個問題裡面,亂碼可能能排到前幾名關鍵字。
Oracle資料庫字符集合問題,也經常是網路同仁討論的問題。在進行資料遷移、備份還原的時候,字符集是一個不能迴避的問題。但是,有一點是可以明確的,資料從一個資料字符集轉換到另一個字符集,總會有一些潛在的問題和風險點。
1、“列長度不足”問題
我們在日常的遷移和備份還原中,經常遇到一種“列寬長度不足”的現象。原本資料表資料定義,匯入到新環境中就報錯長度不夠。這種是一種典型的字符集轉換錯誤。字符集最典型的特徵就是對一些非標準字元(非數字、英文字母)的表示,經常用到的ZHS16GBK是用兩個位元組表示一箇中文字元,例如varchar2(4)最多容納兩個中文字元。但是一些多位元組編碼方式,如AL32UTF8,就是三個位元組表示一箇中文字元。這樣問題就出現了,如果原來容納的字元是兩個中文字,varchar2(4)在ZHS16GBK格式下是沒問題的,轉化到AL32UTF8格式下的時候,varchar2(4)就容納不下兩個漢字,就需要varchar2(6)來進行容納了。
究竟是否可以實現這種字符集轉換遷移,存在很大程度的偶然性。如果資料恰好可以滿足條件,從ZHS16GBK到AL32UTF8這樣的轉換也是沒有過多問題的。即使存在問題,我們是可以考慮在遷移源中,人工加大特定欄位長度,確保遷移後容量,來解決這種問題。這個就存在一個“測試檢驗”過程。
在Oracle中,就提供了一個簡單的工具程式Ccscan,幫助我們確定特定的資料集合在從一個字符集到另一個字符集轉換過程中是否存在問題,是否存在相容、截斷現象。我們可以透過這個分析結果,預先進行欄位處理或者截斷,便於後續的資料遷移工作。本篇主要介紹Ccscan這個古老工具的安裝和簡單的演示。
2、Ccscan安裝
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用Ccscan進行資料字符集轉換驗證(下)
- 使用正規表示式進行xml資料驗證(轉)XML
- 使用SpringBoot進行優雅的資料驗證Spring Boot
- GoldenGate中使用strcat和strext進行資料轉換Go
- 遷移資料時oracle字符集的轉換遷移資料時oracle字符集的轉換Oracle
- PHP 對資料進行驗證和過濾PHP
- Laravel 的表單驗證 , 如何做到驗證並改變 ( 轉換 ) 資料 ?( 使用中介軟體 )Laravel
- 巧妙轉換ORACLE資料庫字符集Oracle資料庫
- oracle資料庫字符集的轉換Oracle資料庫
- 如何使用常用的6種方式對資料進行轉換(二)
- FastJson 進行資料轉換的 實力ASTJSON
- 使用 OAuth 2.0 進行 Kafka 身份驗證 - strimziOAuthKafka
- Spring Boot使用JWT進行token驗證Spring BootJWT
- 在實際使用智慧合約中需要預言機對資料進行驗證
- Struts資料驗證筆記 (轉)筆記
- Oracle 11g rac資料庫字符集轉換Oracle資料庫
- 字符集轉換
- ActionCable 中怎樣使用 devise 進行驗證dev
- 使用Moya庫,進行https證書校驗HTTP
- 在Linux Shell程式中進行身份驗證(轉)Linux
- ASP.NET MVC結合jQuery外掛進行資料驗證ASP.NETMVCjQuery
- IIS7上配置FTP7使用IIS管理憑據方式進行驗證FTP
- 透過 ForwardAgent ,在遠端機器上,使用本機 ssh key 進行驗證Forward
- 使用 gorilla/mux 進行 HTTP 請求路由和驗證GoUXHTTP路由
- Spring AI(使用Ollama大模型進行AI驗證)SpringAI大模型
- 在登入頁面中js進行正則驗證電話號碼和郵箱地址,並使用ajax進行使用者ID的資料庫驗證JS資料庫
- 資料轉換-16進位制字元字元
- 利用Kettle進行資料同步(上)
- 允許資料庫映象使用證書進行出站連線資料庫
- 資料驗證的asp.net程式 (轉)ASP.NET
- 使用表單驗證,建立資料驗證層,Ajax 統一返回驗證錯誤資訊
- 搞定了!OAuth2使用驗證碼進行授權OAuth
- 使用SQL_TRACE進行資料庫診斷(轉)SQL資料庫
- imp/exp 字符集轉換
- 字符集合轉換問題
- 使用validate驗證資料檢查資料壞塊
- 修改資料庫字符集(轉)資料庫
- 換種方式使用 Laravel 的 request 驗證Laravel