利用csscan转换ORACLE数据库的字符集(一)

2014-11-24 08:33:56 ? 作者: ? 浏览: 0

1. 安 装Character Set Scanner

参考:

http://www.oracle.com/technetwork/database/globalization/index-085942.html

一般地。安装oracle 系统就会有这个工具。

bash-3.00$ which csscan

/orahome/oracle/product/11.2.0/dbhome_1/bin/csscan

2.

执行下面的命令:

Csscan\"sys/@ as sysdba\" FULL=Y FROMCHAR=WE8MSWIN1252 TOCHAR=AL32UTF8LOG=dbcheck CAPTURE=N ARRAY=1000000 PROCESS=2

3. 检查相关的输出文件

$ ls dbch*

dbcheck.err dbcheck.out dbcheck.txt

charcheck.out – 所有经过扫描的扫描项列表

charcheck.txt – 扫描结果的总结

charcheck.err – 扫描项中的异常

对于某些可能在转换过程中丢失的数据或不能被转换成目标字符集的数据可以通过下面的SQL语句查询得到:f

SELECT DISTINCTz.owner_name

|| '.'

|| z.table_name

|| '('

|| z.column_name

|| ') - '

|| z.column_type

|| ' ' LossyColumns

FROMcsmig.csmv$errors z

WHERE z.error_type='DATA_LOSS'

ORDER BYLossyColumns;

如果有ORA-01401或者ORA-12899的错误,你可以利用利用import再做处理,首先通过查看哪些列被标识成了”Truncation”,然后看哪些表中的列可能会被影响了。mportgo p

你可通过下面的查询查看哪些列被标识了"Truncation" 和新列所需要的最小长度。

conn / AS sysdba

SET serveroutput ON

DECLARE

newmaxsz NUMBER;

BEGIN

FOR rec IN

( SELECT DISTINCT u.owner_name,

u.table_name,

u.column_name ,

u.column_type,

u.owner_id,

u.table_id,

u.column_id,

u.column_intid

FROM csmv$errors u

WHERE u.error_type='EXCEED_SIZE'

ORDER BY u.owner_name,

u.table_name,

u.column_name

)

LOOP

SELECT MAX(cnvsize)

INTO newmaxsz

FROM csm$errors

WHERE usr# =rec.owner_id

AND obj# =rec.table_id

AND col# =rec.column_id

AND intcol#=rec.column_intid;

DBMS_OUTPUT.PUT_LINE(rec.owner_name ||'.'|| rec.table_name||' ('||rec.column_name ||') - '|| rec.column_type ||' - '|| newmaxsz || ' Bytes');

END LOOP;

END;

/

4. 可以通过查询dbcheck.err来了解转换过程可能发生的错误。

bash-3.00$more dbcheck.err

DatabaseScan Individual Exception Report

[DatabaseScan Parameters]

Parameter Value

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

CSSCANVersion v2.1

InstanceName XXX

DatabaseVersion 11.2.0.2.0

Scantype Full database

Scan CHARdata YES

Databasecharacter set WE8MSWIN1252

FROMCHAR WE8MSWIN1252

TOCHAR AL32UTF8

Scan NCHARdata NO

Array fetchbuffer size 1000000

Number ofprocesses 2

Captureconvertible data NO

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

[DataDictionary individual exceptions]

[Applicationdata individual exceptions]

然后通过查询dbcheck.out对发生的异常进行处理。

如果重新收集直方图的数据:

$ORACLE_HOME/nls/csscan/sql/analyze_histgrm.sql

EXECDBMS_STATS.DELETE_TABLE_STATS ('SERV_INFRA', ' SC_T_SERVICE_UP');

EXECDBMS_STATS.DELETE_TABLE_STATS ('CAM', ' USERS');

清除没有正确转换的应用

/orahome/oracle/product/11.2.0/dbhome_1/apex

connect /as sysdba

@apxremov.sql

5. 再次执行转换:

Conn/ as sysdba

exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB')

--execdbms_workload_repository.modify_snapshot_settings(interval => 0,retention=>1440);

EXECDBMS_STATS.DELETE_TABLE_STATS ('SERV_INFRA', 'SC_T_SERVICE_UP');

selectsystimestamp - d

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: