Oracle字符集转换(五):5.Oracle推荐实践
我们来看看Oracle推荐的字符集转换方法。可以查看CSALTER的使用方法及其限制、CSSCAN的使用方法及其执行顺序、执行结果文件、创建CSSCAN执行结果存储表的DDL。
这是上一篇文章的延续。
5、Oracle推荐的字符集转换方法(CSALTER、CSSCAN)
Oracle 推荐 Full Export & Import 方法和使用 CSALTER 脚本的方法。首先,让我们看一下如何使用CSALTER。
5.1。如何使用 CSALTER
可以在下面的 URL 中找到 Oracle 文档。
执行以下步骤更改数据库的字符集。
- 使用 SHUTDOWN IMMEDIATE 或 SHUTDOWN NORMAL 语句关闭数据库。
- 对数据库进行完整备份,因为无法回滚 CSALTER 脚本。
- 启动数据库。
- 运行数据库字符集扫描程序实用程序。
CSSCAN /AS SYSDBA FULL=Y… - 运行 CSALTER 脚本。
@@CSALTER.PLB
立即关机; — 或正常关机;
启动;
但是,CSALTER 不会转换用户生成的数据。 (以上网址部分摘录)
注意 CSALTER 脚本不执行任何用户数据转换。 它仅更改数据字典中的字符集元数据。因此,在 CSALTER 操作之后,Oracle 的行为就好像数据库是使用新字符集创建的一样。
这是CSALTER的局限性,使用CSALTER进行字符集转换并不适合大多数应用环境。
但是,CSSCAN(Database Character Set Scanner utility)值得使用,用于提前识别要转换的数据库可以转换的数据以及转换过程中有问题的数据。
5.2.如何使用 CSSCAN
您可以使用以下命令检查运行 csscan 所需的参数。
csscan 帮助=y
C:\Users\ymlee>csscan help=y Character Set Scanner v2.2 : Release 11.2.0.1.0 - Production on 일 3월 20 22:58:48 2022 Copyright (c) 1982, 2009, 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.
有关每个参数的详细说明,请参阅以下 URL。
数据库字符集扫描器参数 (https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#NLSPG498)
csscan 按以下顺序运行:
- 创建模式:执行$ORACLE_HOME/rdbms/admin/csminst.sql
- 创建目录:创建D:\temp\csscan(用于保存执行结果文件)
- 运行 csscan
- 查看csscan执行结果
作为 csscan 执行的结果,创建了三个文件。
- scan.txt:扫描结果汇总报告
- scan.out:扫描目标表信息
- scan.err:错误详情
scan.txt(扫描结果汇总报告)包含以下内容。 (点击进入oracle文档)
- 数据库大小
- 数据库扫描参数
- 扫描摘要
- 数据字典转换总结
- 应用程序数据转换摘要
- 每个列大小边界的应用程序数据转换摘要: 仅在指定 BOUNDARIES 参数时输出
- 每个表的可转换数据分布
- 每列可转换数据的分布
- 重建索引
- 字符语义截断
[Data Conversion Summary]中对Changeless、Convertible、Truncation、Lossy的描述可以在下面的文档中找到。
https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#g1019330
地位 | 描述 |
不变的 | 数据在新字符集中保持不变 – 转换字符集时无数据变化 |
敞篷车 | 数据可以成功转换为新的字符集 – 转换字符集时可以更改数据 |
截断 | 如果发生转换,数据将被截断 – 转换字符集时数据被截断 |
有损 | 如果发生转换,字符数据将丢失 – 转换字符集时数据丢失(损坏) |
5.2.1。保存 CSSCAN 执行结果的表
在执行csminst.sql时创建的几个表中,csscan的结果保存在下表中。
- CSM1TP4表
- CSM$COLUMNS
- CSM1TP4恐怖分子
注意,每次执行CSSCAN时,都会初始化这个表中的所有数据。(scan.txt、scan.out、scan.err文件也用同样的方式初始化)
如果要在多次执行 CSSCAN 时比较结果,建议将数据备份为单独的表。
备份时请参考下面的DDL。
CREATE TABLE Z_CSSCAN_COL_SUMMARY AS SELECT '20140507' BASE_DT, U.USERNAME, TC.TABLE_NAME, TC.COLUMN_NAME ,CC.NUMROWS, CC.NULCNT, CC.CNVCNT, CC.CNVTYPE, CC.ERRCNT, CC.SIZERR ,CC.CNVERR, CC.MAXSIZ, CC.CHRSIZ FROM CSMIG.CSM$COLUMNS CC INNER JOIN DBA_USERS U ON (CC.USR# = U.USER_ID) INNER JOIN DBA_OBJECTS O ON (CC.OBJ# = O.OBJECT_ID) INNER JOIN DBA_TAB_COLUMNS TC ON (CC.COL# = TC.COLUMN_ID AND O.OBJECT_NAME = TC.TABLE_NAME) WHERE 1=1 AND U.USERNAME = 'LEG' AND O.OBJECT_TYPE = 'TABLE' AND CC.ERRCNT <> 0;
上述DDL执行后生成的数据样本如下。
Row# | BASE_DT | 用户名 | TABLE_NAME | COLUMN_NAME | 数列 | NULCNT | 碳纳米管 | CNV类型 | 错误 | 西泽尔 | CNVERR | 最大尺寸 | 克里斯西斯 |
1 | 20140507 | 腿 | Z_测试 | 值 | 2 | 0 | 0 | 0 | 2 | 0 | 2 | 12 | 0 |
2 | 20140507 | 腿 | SUB_MON_STAT | LINE_NUM 行 | 7426 | 0 | 0 | 0 | 7426 | 3238 | 7426 | 38 | 0 |
3 | 20140507 | 腿 | SUB_MON_STAT | SUB_STA_NM | 7426 | 0 | 0 | 0 | 7426 | 1268 | 7426 | 54 | 0 |
4 | 20140507 | 腿 | SUB_MON_STAT | 通讯 | 7426 | 7425 | 0 | 0 | 1 | 1 | 1 | 9000 | 0 |
5 | 20140507 | 腿 | SUB_MON_STAT | REF_DES | 7426 | 7425 | 0 | 0 | 1 | 0 | 1 | 3000 | 0 |
到目前为止,我们已经了解了 Oracle 推荐的字符集转换方法(CSALTER、CSSCAN)。接下来,我们看看在US7ASCII和KO16MSWIN949测试环境下运行CSSCAN的结果。