Benjamin Zhang

目前就职于中科院计算机网络信息中心,主要兴趣集中在数据库,操作系统,中间件。

【ORACLE字符集】字符集扫描工具csscan的使用

25 Feb 2019 » Oracle

csscan工具

介绍csscan工具

解释:csscan的全名为Character Set Scanner,字符集扫描工具。

作用:查找出在做字符集转换后,哪些内容无法转换需要单独处理,也就是确定并报告在数据转换过程中会出现的错误。

文献参考:MetaLink : ‘Migrating an Applications Installation to a New Character Set.’

csscan会报如下三种异常:

  1. lossy conversions
  2. exceeded column length
  3. convertible or exceptional data in the data dictionary

为什么会用到这个工具?

原因:需求决定,由于生产环境的数据库使用的字符集为ZHS16GBK,在应用中无法录入个别的生僻字。例如:用户姓名(㼆)字

保证数据库字符集的正常转换,通过csscan验证。

安装csscan工具

csscan的工具默认已经有了,如下:

[oracle@db ~]$ which csscan
/u01/app/product/11.2.0/db_1/bin/csscan

通过strings命令,可以查询一些有趣的信息

[oracle@db ~]$ strings /u01/app/product/11.2.0/db_1/bin/csscan |more

csscan实战使用

  1. 第一步,以sys用户登陆,创建所需的CSMIG用户和数据字典对象。

    [oracle@db ~]$ sqlplus "/as sysdba"
    SQL> @?/rdbms/admin/csminst.sql
    SQL> exit;
    
  2. 对整个数据库,进行检查。是否能转换字符集。

    [oracle@db csscan]$cd /home/oracle/csscan
    [oracle@db csscan]$csscan userid="'"sys/sys as sysdba"'" full=y fromchar=ZHS16GBK tochar=AL32UTF8 log=check.log capture=y array=1000000 process=4
    

    出现如下日志:

    Character Set Scanner v2.2 : Release 11.2.0.4.0 - Production on Tue Feb 26 10:55:54 2019
       
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
       
       
    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
       
    Enumerating tables to scan...
       
    . process 1 scanning EX_LOG.ARP_DATADETAIL[AAAVnrAAXAAAAEAAAA]
    . process 2 scanning ARP_PLATFORM_TEST.QY_LOG[AAAWoDAAKAAAEAAAAA]
    . process 3 scanning IPC_HZ_DB.QY_LOG[AAAVrSAAKAAAAOAAAA]
    . process 4 scanning LMS_MANAGE.TAB_EOS_USERINFO_IRC[AAAVpBAAIAAAAHoAAA]
    
  3. 默认会出现三个日志文件:

    [oracle@db ~]$ ls -l scan.*
    -rw-r--r--. 1 oracle oinstall 3787693 2月  23 16:17 scan.err
    -rw-r--r--. 1 oracle oinstall  526312 2月  23 16:17 scan.out
    -rw-r--r--. 1 oracle oinstall 1706083 2月  23 16:16 scan.txt
    

    其中scan.err记录着我们非常关心的哪些数据会在转换之后出问题。需要重点关注这个文件。

    查看scan.err整个文件内容,如下:

    User  : FA
    Table : C_ASSET_INFO_HIST
    Column: ORIGIN_COUNTRY
    Type  : VARCHAR2(32)
    Number of Exceptions         : 2         
    Max Post Conversion Data Size: 33        
       
    ROWID              Exception Type      Size Cell Data(first 30 bytes)     
    ------------------ ------------------ ----- ------------------------------
    AAAV20AAOAAAMTlAAE exceed column size    33 绝对是离开飞机离开第三        
    AAAV20AAOAAAMTlAAG exceed column size    33 绝对是离开飞机离开第三        
    

    可以看到VARCHAR2(32)中的32代表的是字节长度,而不是字符长度。所以绝对是离开飞机离开第三超过了11*3等于33个字节,超过了32个字节,所以转换的时候是报错的。

    必须解决scan.err中的错误,才可能对数据库的字符集做转换。