ITPub博客

首页 > 数据库 > Oracle > 使用Ccscan进行数据字符集转换验证(上)

使用Ccscan进行数据字符集转换验证(上)

原创 Oracle 作者:realkid4 时间:2015-09-02 23:34:59 0 删除 编辑

 

字符集问题是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博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-1789859/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041220