campspirit
作者campspirit·2011-02-15 10:25
技术经理·中科软

记一次oracle的rac环境下,字符集修改

字数 3577阅读 8656评论 4赞 0

一、系统版本和环境
系统版本:
# oslevel -s
5300-10-00-0000
oracle版本:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

# ./crsctl query crs softwareversion
Oracle Clusterware version on node [test115] is [11.2.0.1.0]

注:版本不同,修改的方法也基本一致,开始修改前,需要备份pfile或者spfile文件。

二、修改过程
查询目前字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252

    oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
  一旦数据库创建后,数据库的字符集理论上讲是不能改变的。字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。

安装单数据库的方式修改oracle字符集,oracle会报错ORA-12720
  SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
  ORA-12720:, operation requires database is in EXCLUSIVE mode. Cause:
因此需要使用以下方法修改

停止其中一个结点的cluster服务
./crsctl stop cluster

在另外一个结点执行
SQL> alter system set cluster_database=false scope=spfile;

如果有以下报错,说明数据库不是用spfile来启动的
alter system set cluster_database=false scope=spfile
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE is in use
可以通过以下语句来确认是否是用spfile来启动的,为空表示用pfile启动
SQL> show parameter spfile;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

使用以下语句来修改oracle来使用spfile启动
SQL> create spfile from pfile;
File created.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
或者在startup时加参数直接指定spfile文件

重新执行
SQL> alter system set cluster_database=false scope=spfile;

System altered.

关闭数据库
SQL>shutdown immediate
SQL>startup mount
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
System altered.
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
System altered.
SQL> alter database open;
Database altered.
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
Database altered.
如果上面这句执行不成功,则可以尝试下面的语句
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.
#我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验.这一方法在某些方面是有用处的,比如测试;应用于产品环境大家应该格外小心,除了你以外,没有人会为此带来的后果负责:
#很喜欢这句--------------对于DBA来说,有一个很重要的原则就是:不要把你的数据库置于危险的境地!

#这就要求我们,在进行任何可能对数据库结构发生改变的操作之前,先做有效的备份,或者在测试环境进行充分的测试,很多DBA没有备份的操作中得到了惨痛的教训


三、重新恢复数据库为rac模式

SQL> alter system set cluster_database=true scope=spfile;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup


启动其他节点的cluster服务,并进行验证

./crsctl start cluster

检查修改是否生效

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

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论4 条评论

campspiritcampspirit技术经理中科软
2011-02-16 12:46
给金币不
aixclubaixclub网站运营经理TWT
2011-02-15 11:43
能否在细化细化,然后投稿到AIX中国杂志上!
campspiritcampspirit技术经理中科软
2011-02-15 11:16
嗯,测试机,还是上次测试rac在5.3上安装时用的机器
aixclubaixclub网站运营经理TWT
2011-02-15 10:39
非常不错的文章,AIX系统版本是5.3?
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广