love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

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

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 10g中如何修改数据库字符集?

从上面的安装结果输出信息来看,下面的2条授权语句执行失败了,

这两句授权的语句,是没什么用的,完全可以从scminst.sql脚本中删除,大家可以参考如下metalink文档:

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

关于csscan的运用,大家可以查看帮助信息,可以进行全库,用户等级别的扫描,我这里使用全库扫描。

scan默认会将扫描相关的信息写入到一个试图scm$parameters中,查询如下:

10g 中如何修改字符集?

对于oracle10g,已经完全跟8i 9i不一样了,不再使用alter database 命令,metalink解释如下:
Using the “ALTER DATABASE CHARACTER SET” command in 8i or 9i and CSALTER in 10g and up.

首先我们来看下scan.txt的内容:

对于Convertible, Truncated 的对象,我们可以使用exp或expdp导出,然后drop原表,等字符集修改完以后再进行导入。
另外对于lossy的对象,我们可以借助plsql等工具将数据导出,然后手工转换编码。
关于cscan工具扫描以后产生的结果,如何去阅读的问题,以及在10g以后版本中如何安装的问题;
大家可以参考如下两篇文章:
Installing and configuring Csscan in 10g and 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],
所以我们需要先将这部分表进行导出,不然直接进行字符集的转换肯定会不成功,如下:

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

我们知道在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=WE8ISO8859P1 TOCHAR=ZHS16GBK ARRAY=1024000 PROCESS=1

可以csscan help=y查看帮助

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

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

检查scan.txt:
对于convertible, truncated的对象可以通过exp/imp来完成;
对于lossy的对象,可以用plsql进行导出然后手工转换编码,然后删除对象,等运行csalter命令修改字符集完成后,再将前面的对象导入。

导出convetitble和truncate的对象后,需要重新运行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. 启动数据库到单实例模式;
startup restrict
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状态。

七、 检查应用是否正常。

One Response to “10g中如何修改数据库字符集?”

  1. fail Says:

    Make me an innovative house hold says the person.

Leave a Reply

You must be logged in to post a comment.