10g中如何修改数据库字符集-5

对于Convertible, Truncated 的对象,我们可以使用expexpdp导出,然后drop原表,等字符集修改完以后再进行导入。

另外对于lossy的对象,我们可以借助plsql等工具将数据导出,然后手工转换编码。

关于cscan工具扫描以后产生的结果,如何去阅读的问题,以及在10g以后版本中如何安装的问题;

大家可以参考如下两篇文章:

Installing and configuring Csscan in 10gand 11g (Database Character Set Scanner) [ID 745809.1]

Csscan output explained [ID 444701.1]

10g 以前的版本可以参考下面的文档:

Installing and Configuring Csscan in 8i and 9i(Database Character Set Scanner) [ID 458122.1]

ok 我们继续,由于前面scan的结果中有[Distribution of Convertible,Truncated and Lossy Data by Table]

所以我们需要先将这部分表进行导出,不然直接进行字符集的转换肯定会不成功,如下:

SQL> @ ?/rdbms/admin/csalter.plb

0 rows created.

Function created.

Function created.

Procedure created.

This script will update the content of the Oracle DataDictionary.

Please ensure you have a full backup before initiatingthis procedure.

Would you like to proceed (Y/N)?y

old   6:     if (UPPER('&conf') <> 'Y') then

new   6:     if (UPPER('y') <> 'Y') then

Checking data validility...

Sorry only one session is allowed to run this script

PL/SQL procedure successfully completed.

Checking or Converting phrase did not finishsuccessfully

No database (national) character set will be altered

CSALTER finished unsuccessfully.

PL/SQL procedure successfully completed.

0 rows deleted.

Function dropped.

Function dropped.

Procedure dropped.

SQL>

1. scan.txt中所列出的部分表进行导出;

exp system/oracle file=exp.dmp tables=(MDSYS.SDO_COORD_OP_PARAM_VALS,MDSYS.SDO_GEOR_XMLSCHEMA_TABLE,MDSYS.SDO_STYLES_TABLE,MDSYS.SDO_XML_SCHEMAS        

,ROGER.HT01,SYS.METASTYLESHEET,SYS.RULE$,SYS.WRH$_SQLTEXT,SYS.WRH$_SQL_PLAN,SYS.WRI$_DBU_FEATURE_METADATA,SYS.WRI$_DBU_FEATURE_USAGE

,SYS.WRI$_DBU_HWM_METADATA) buffer=1000000log=exp.log  

2. 在原库中删除该部分对象;

SQL> drop table MDSYS.SDO_COORD_OP_PARAM_VALS; 

drop table MDSYS.SDO_GEOR_XMLSCHEMA_TABLE;

drop table MDSYS.SDO_STYLES_TABLE;       

drop table MDSYS.SDO_XML_SCHEMAS;         

drop table ROGER.HT01;                    

drop table SYS.METASTYLESHEET;            

drop table SYS.RULE$;                     

drop table SYS.WRH$_SQLTEXT;              

drop table SYS.WRH$_SQL_PLAN;             

drop table SYS.WRI$_DBU_FEATURE_METADATA; 

drop table SYS.WRI$_DBU_FEATURE_USAGE;    

drop table SYS.WRI$_DBU_HWM_METADATA;

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

SQL>

Table dropped.

3. 运行csalter修改数据库字符集;

SQL> @ ?/rdbms/admin/csalter.plb;

0 rows created.

Function created.

Function created.

Procedure created.

This script will update the content of the Oracle DataDictionary.

Please ensure you have a full backup before initiatingthis procedure.

Would you like to proceed (Y/N)?Y

old   6:     if (UPPER('&conf') <> 'Y') then

new   6:     if (UPPER('Y') <> 'Y') then

Checking data validility...

begin converting system objects

PL/SQL procedure successfully completed.

Alter the database character set...

CSALTER operation completed, please restartdatabase   ---操作完成,需要重启数据库

PL/SQL procedure successfully completed.

0 rows deleted.

Function dropped.

Function dropped.

Procedure dropped.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  230686720 bytes

Fixed Size                  1266776 bytes

Variable Size             150997928 bytes

Database Buffers           75497472 bytes

Redo Buffers                2924544 bytes

Database mounted.

Database opened.

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')

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

AMERICAN_AMERICA.ZHS16GBK   

补充一个自己写的简单方案:

我们知道在oracle 10g以前版本,可以通过alter database Character set命令方式来直接修改数据库字符集,但是从oracle10g版本开始,oracle不推荐这样使用,风险很大。

10g 版本,oracle提供了csalter工具进行修改,步骤如下:

一、 对数据库进行全备,可以进行逻辑导出全备或rman全备(记得同时备份参数文件,密码文件以及controlfile);

二、 安装配置csscan工具;

用具有dba权限的用户执行@?/rdbms/admin/csminst.sql

三、 运行csscan进行扫描;

例如:

csscan system/oracle full=y FROMCHAR=WE8ISO8859P1TOCHAR=ZHS16GBK ARRAY=1024000 PROCESS=1

可以csscan help=y查看帮助

Csscan运行结束后,默认会在当前目前下生存如下3个文件:

[oracle@roger oracle]$ ls -ltr scan*

-rw-r--r--  1oracle dba  8239 Jul  4 16:56 scan.txt

-rw-r--r--  1oracle dba 73078 Jul  4 16:56 scan.out

-rw-r--r--  1oracle dba  1878 Jul  4 16:56 scan.err

 

Scan工具会把最近一次扫描的参数写入到同义词csm$parameters中,下次进行数据库字符集转换时,直接从该同义词读取信息;

检查scan.txt

对于convertible, truncated的对象可以通过exp/imp来完成;

对于lossy的对象,可以用plsql进行导出然后手工转换编码,然后删除对象,等运行csalter命令修改字符集完成后,再将前面的对象导入。

导出convetitbletruncate的对象后,需要重新运行csscan工具;

四、 运行csalter修改字符集;

我们知道在oracle 10g以前版本,可以通过alter database Character set命令方式来直接修改数据库字符集,但是从oracle10g版本开始,oracle不推荐这样使用,风险很大。

10g 版本,oracle提供了csalter工具进行修改,步骤如下:

一、 对数据库进行全备,可以进行逻辑导出全备或rman全备(记得同时备份参数文件,密码文件以及controlfile);

二、 安装配置csscan工具;

用具有dba权限的用户执行@?/rdbms/admin/csminst.sql

三、 运行csscan进行扫描;

例如:

csscan system/oracle full=y FROMCHAR=WE8ISO8859P1TOCHAR=ZHS16GBK ARRAY=1024000 PROCESS=1

可以csscan help=y查看帮助

Csscan运行结束后,默认会在当前目前下生存如下3个文件:

[oracle@roger oracle]$ ls -ltr scan*

-rw-r--r--  1oracle dba  8239 Jul  4 16:56 scan.txt

-rw-r--r--  1oracle dba 73078 Jul  4 16:56 scan.out

-rw-r--r--  1oracle dba  1878 Jul  4 16:56 scan.err

 

Scan工具会把最近一次扫描的参数写入到同义词csm$parameters中,下次进行数据库字符集转换时,直接从该同义词读取信息;

检查scan.txt

对于convertible, truncated的对象可以通过exp/imp来完成;

对于lossy的对象,可以用plsql进行导出然后手工转换编码,然后删除对象,等运行csalter命令修改字符集完成后,再将前面的对象导入。

导出convetitbletruncate的对象后,需要重新运行csscan工具;

四、 运行csalter修改字符集;

对于RAC环境:

1. 修改CLUSTER_DATABASE参数为flase

Alter system set cluster_database=flase scope=spfile

Alter system set job_queue_processes=0 scope=spfile;

alter system set aq_tm_processes=0  scope=spfile;

2. 启动数据库到单实例模式;

 startuprestrict

spool switch.log

3. 运行csalter

---- sys执行:@ ?/rdbms/admin/csalter.plb

---- 检查执行csalter的输出信息,是否有错误;

如果执行那么修改还原原始的参数:

Alter system set cluster_database=true scope=spfile

Alter system set job_queue_processes=old_value scope=both sid=*;

alter system set aq_tm_processes=old_value scope=both sid=*;

五、 重启数据库;

----shutdown immediate

----startup

----检查字符集是否修改成功

检查alert log或运行如下sql

select userenv('language') from dual;

六、 启动另外节点,检查clsuter状态。

七、 检查应用是否正常。

posted @ 2011-07-19 15:45  dbblog  阅读(1542)  评论(0)    收藏  举报