RAC环境下修改字符集

跟单实例多少有点区别
oracle 11g rac 两节点
第一步 查看字符集
primary-sys@mydb2>select userenv(‘language’) from dual;

userenv(‘language’)
—————————————————-
american_america.al32utf8
/*
也可以通过下面几种方式查询当前字符集
sql> select parameter, value from v$nls_parameters where parameter like ‘%characterset’;

parameter value
—————————————————————- —————————————————————-
nls_characterset zhs16gbk
nls_nchar_characterset al16utf16

下面2种结果一样
set pagesize 100
col value$ for a30
select name,value$ from props$ where name like ‘%nls%’;

select * from nls_database_parameters;
*/

第二步 关闭一个节点
[root@testdb2 ~]# /u01/app/11.2.0/grid/bin/crsctl stop cluster

第三步 在另一个节点修改启动参数
true改为false
primary-sys@mydb1>alter system set cluster_database=false scope=spfile;

primary-sys@mydb1>shutdown immediate;

/*
show parameter pfile; 若value为空是pfile启动,要修改为spfile启动,空的话如下
sql>create spfile from pfile;
sql>shutdown immediate;
sql>startup;
sql>alter system set cluster_database=false scope=spfile;
sql>shutdown immediate;
*/

第四步 修改参数

primary-sys@mydb1>startup mount;

primary-sys@mydb1>alter system enable restricted session;

system altered.

primary-sys@mydb1>alter system set job_queue_processes=0;

system altered.

primary-sys@mydb1>alter system set aq_tm_processes=0;

system altered.

primary-sys@mydb1>alter database open;

database altered.

第五步 修改字符集

primary-sys@mydb1>alter database character set internal_use zhs16gbk;

第六步 恢复rac

primary-sys@mydb1>alter system set cluster_database=true scope=spfile;

primary-sys@mydb1>shutdown immediate;

primary-sys@mydb1>startup mount;

primary-sys@mydb1>alter system disable restricted session;

primary-sys@mydb1>alter system set job_queue_processes=1;

primary-sys@mydb1>alter system set aq_tm_processes=1;

primary-sys@mydb1>alter database open;

第七步 启动开始停止的rac节点,并验证
另外一个节点
[root@testdb2 ~]# /u01/app/11.2.0/grid/bin/crsctl start cluster

primary-sys@mydb2>select userenv(‘language’) from dual;

userenv(‘language’)
————————————————————————————————————————————————————
american_america.zhs16gbk

【注意事项】
修改字符集要谨慎,不能回退,有必要的话备份下
db中有clob类型字段不允许字符集转换,可以导出-删除-导入(转换完成后)
超集解:如果s1集合包含s2集合中的每一个元素,并且s1集合中有可能包含s2集合中不含有的元素时,那么称s1是s2的超级。说明al32utf8包含zhs16gbk。

三次编码转换
1、执行exp时,数据库中数据的编码会转换为导出客户端编码
2、执行imp时,dmp文件的编码转换为导入客户端编码
3、导入客户端编码转换为目标端数据库的数据库编码
处理办法:通过nls_lang灵活设置,减少编码转换的次数,或者使得相互的转换能够兼容,可以最大程度减少乱码的出现。如果已经有了exp导出的dmp文件,然后在导入过程中出现乱码,一般处理建议nls_lang编码设置和dmp文件一致,让转换发生在导入客户端和数据库服务器间(要求:编码可以相互转换)

结论
1.不管是从al32utf8 到zhs16gbk 还是从zhs16gbk 到al32utf8 ,中文都不会乱码,会自动转换(导出导入过程中无报错),但是对于其他国家语言会有问题(比如印度,日本等文字)。
2.通过数据泵导出或导入的数据,与oracle用户操作系统参数nls_lang无关,编码自动与数据库参数nls_characterset相同。
3.al32utf8 字符集一个中文占用3个字节,zhs16gbk 字符集一个中文占用2个字节。如果确认应用程序只用到英文和中文,zhs16gbk会更加节省存储。如果不确定,建议使用al32utf8.
4.建表时指定列属性varchar(10),其中的10指的是字节,若是al32utf8 字符集,则只能存3个中文,若是zhs16gbk字符集,则可以存5个中文。这会导致从zhs16gbk字符集数据库通过数据泵导入到al32utf8字符集数据库过程中,有些列需要扩容。如果需要按字符指定列属性,应该为varchar2(10 char)。
5.al32utf8是zhs16gbk的超集,因为al32utf8包含了更多国家的文字。
6.通过securecrt或xshell查看到中文乱码时,只需要查看数据库nls_databse_parameters中nls_characterset的字符集是什么,然后保持操作系统用户nls_lang的设置和securecrt或xshell软件的编码设置与之一致即可。
来自 “ itpub博客 ” ,链接:http://blog.itpub.net/31441616/viewspace-2145085/,如需转载,请注明出处,否则将追究法律责任。

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐