在RAC环境下修改Oracle字符集

非RAC环境字符集修改
 
   1 Oracle 字符集问题总结
 
   1 1 1 oracle 字符集概念
 
   oracle 字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。 ORACLE  支持国家语言的体系结构允许你使用本地化语言来 存储 ,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
 
  影响 oracle 数据库字符集最重要的参数是 NLS_LANG 参数。格式: NLS_LANG  language_territory charset
 
  其中: Language  指定 服务器 消息的语言, territory  指定 服务器 的日期和数字格式, charset  指定字符集。如: AMERICAN _ AMERICA  ZHS16GBK 。从 NLS_LANG 的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
 
   1 1 查询 Oracle 的字符集
 
  在做数据导入的时候,需要这三个字符集都一致:一是 oracel server 端的字符集,二是 oracle client 端的字符集;三是 dmp 文件的字符集。
 
   A 查询 oracle server 端的字符集
 
   SQL>select userenv 'language'  from dual
 
  结果类似: AMERICAN_AMERICA ZHS16GBK
 
  或者 select * from V$_NLS_PARAMETERS
 
   B 如何查询 dmp 文件的字符集
 
   dmp 文件的第 2 和第 3 个字节记录了 dmp 文件的字符集。小 dmp 文件用 UltraEdit 打开( 16 进制方式),看第 2 3 个字节的内容,如 0354 ,然后用以下 SQL 查出它对应的字符集:
 
   SQL> select nls_charset_name to_number '0354' 'xxxx' ))  from dual
 
  结果 ZHS16GBK
 
   dmp 文件很大如 2G 以上,用文本编辑器打开很慢或者完全打不开,可以用命令(在 unix 主机上):
 
   cat exp dmp |od  x|head  1|awk '{print $2 $3}'|cut  c 3 6
 
  然后用上述 SQL 也可以得到它对应的字符集。
 
   C 查询 oracle client 端的字符集
 
   windows 注册表里面相应 OracleHome NLS_LANG (如果装配置台等将总共有 3 个: ORACLE 下一个、 ID0 下有一个、 HOME0 下一个)。还可以在 dos 窗口里面自己设置,如: set nls_lang SIMPLIFIED CHINESE_CHINA ZHS16GBK 这样就只影响这个窗口里面的环境变量;
 
  在 unix 平台下,就是环境变量 NLS_LANG $echo $NLS_LANG  AMERICAN_AMERICA ZHS16GBK
 
  如果检查的结果发现 server 端与 client 端字符集不一致,请统一修改为同 server 端相同的字符集(建议导入时直接在服务器上导入)
 
   1 1 修改 oracle 的字符集
 
   oracle 的字符集有互相的包容关系。如 us7ascii 就是 zhs16gbk 的子集,从 us7ascii zhs16gbk 不会有数据解释上的问题,不会有数据丢失。在所有的字符集中 utf8 应该是最大,因为它基于 unicode ,双字节保存字符(也因此在 存储 空间上占用更多)。
 
  一旦数据库创建后,数据库的字符集理论上讲是不能改变的。字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受 oracle 支持的。一般来说,除非万不得已,我们不建议修改 oracle 数据库 server 端的字符集。特别说明,我们最常用的两种字符集 ZHS16GBK ZHS16CGB231280 之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
 
   A 修改 server 端字符集(不建议使用)
 
  在 oracle 8 之前,可以用直接修改数据字典表 props$ 来改变数据库的字符集。但 oracle8 之后,至少有三张系统表记录了数据库字符集的信息,只改 props$ 表并不完全,可能引起严重的后果。正确的修改方法如下:
 
   $sqlplus /nolog
 
   SQL>conn / as sysdba
 
  若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,然后执行以下命令:
 
   SQL>STARTUP MOUNT
 
   SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION
 
   SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES 0
 
   SQL>ALTER SYSTEM SET AQ_TM_PROCESSES 0
 
   SQL>ALTER DATABASE OPEN
 
   SQL>ALTER DATABASE CHARACTER SET ZHS16GBK
 
   SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK
 
   SQL>SHUTDOWN IMMEDIATE
 
   SQL>STARTUP
 
   B 修改 dmp 文件字符集
 
   dmp 文件的第 2 3 字节记录了字符集信息,因此直接修改 dmp 文件的第 2 3 字节的内容就可以 ' ' oracle 的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如 US7ASCII WE8ISO8859P1 ZHS16CGB231280 ZHS16GBK 基本都可以改。因为改的只是 dmp 文件,所以影响不大。
 
  具体的修改方法比较多,最简单的就是直接用 UltraEdit 修改 dmp 文件的第 2 和第 3 个字节。比如想将 dmp 文件的字符集改为 ZHS16GBK ,可以用以下 SQL 查出该种字符集对应的 16 进制代码:
 
   SQL> select to_char nls_charset_id 'ZHS16GBK' ),  'xxxx'  from dual
 
   0354
 
  然后将 dmp 文件的 2 3 字节修改为 0354 即可。
 
   RAC环境修改oracle字符集
 
   2 1 RAC 环境存在问题
 
  在 RAC 环境下修改 oracle 服务器的字符集仍然按非 RAC 模式方法修改过程会遇到 ORA 12720 的错误信息
 
   SQL>ALTER DATABASE CHARACTER SET ZHS16GBK
 
   ORA 12720 :,  operation requires database is in EXCLUSIVE mode  Cause :,
 
  上述错误信息标明在 RAC 方式下无法对服务端字符集进行修改,需要将数据库运行在但实例模式运行。
 
   2 解决该问题的尝试
 
  为解决上述遇到的问题,尝试将两台机器 cluster 软件停止,在单节点上手工激活 VG 并启动 oracle ,又会遇到 ORA 32700 的错误。错误信息如下:
 
   ora 32700 error occurred in DIAG Group Service
 
  在很多情况下都会报 ORA 32700 的错误,在此处的原因大概是因为没有启动双机 cluster 软件导致,如果将单节点的 cluster 进程启动, oracle 实例也会跟着启动,修改时又会出现 2 1 节遇到的错误。
 
   2 3 RAC 环境修改字符集步骤
 
   2 3 数据库参数文件目录备份
 
  为解决 2 1 节遇到错误就必须将数据库修改为单实例非 cluster 模式,需要对数据库参数文件进行修改,但进行参数文件修改需要一些窍门和方法。
 
  正常 RAC 模式下 ORACLE_HOME/dbs 目录下文件如下列表
 
  - rw r -- r --  1 oracle dba 8385 Aug 17 16 18 init ora
 
  - rw r -- r --  1 oracle dba 12920 Aug 17 16 18 initdw ora
 
  - rw r -- r --  1 oracle dba 1424 Aug 17 16 18 initora92 ora
 
  - rw r -- r --  1 oracle dba 25 Aug 17 16 18 initora921 ora
 
  - rw r -- r --  1 oracle dba 25 Aug 17 16 18 initora922 ora
 
  - rw r -----  1 oracle dba 1536 Aug 17 16 18 orapw
 
  - rwSr -----  1 oracle dba 1536 Aug 17 16 18 orapwora921
 
  - rw r -----  1 oracle dba 1536 Aug 17 16 18 orapwora922
 
  两个数据库实例的 pfile 文件内容如下:
 
   [icdnode1]$cat initora921 ora
 
   SPFILE '/dev/rlv_spfile'
 
   [icdnode1]$cat initora922 ora
 
   SPFILE '/dev/rlv_spfile'
 
  但 initora92 ora 文件是正常的有参数配置项目的文本文件,长度比较大,再次不列出内容。
 
  虽然在 dbs 目录下并没有 spfile 文件,数据使用 pfile 启动,但 pfile 又制定了 spfile 文件的位置,数据库使用 spfile 文件启动。
 
  上述的两个实例的 pfile 文件是无法修改的,需要将 pfile 文件修改为常规的文本文件配置项才能进行配置修改操作。
 
  备份操作:
 
   cd $ORACLE_HOME
 
   cp –r dbs dbs_bak
 
   2 3 修改数据库参数文件
 
  修改数据库参数文件目的是修改配置项 * cluster_database true → false ,因此需要对 pfile 进行操作,可以用如下方法还原 pfile 文件。
 
  正常启动 RAC 数据库的一个节点,另一个节点关机或停止 cluster 进程;
 
  连接启动的实例并使用 spfile 配置生成 pfile
 
   Sqlplus ‘/as sysdba’
 
   SQL>create pfile from spfile
 
   SQL>exit
 
  此时 ORACLE_HOME 目录的 dbs 目录中文件列表如下:
 
  - rw r -- r --  1 oracle dba 8385 Aug 17 16 15 init ora
 
  - rw r -- r --  1 oracle dba 12920 Aug 17 16 15 initdw ora
 
  - rw r -- r --  1 oracle dba 1425 Aug 17 16 29 initora92 ora
 
  - rw r -- r --  1 oracle dba 1425 Aug 17 16 32 initora921 ora
 
  - rw r -- r --  1 oracle dba 25 Aug 17 16 15 initora922 ora bak
 
  - rw r -----  1 oracle dba 1536 Aug 17 16 15 orapw
 
  - rwSr -----  1 oracle dba 1536 Aug 17 16 15 orapwora921
 
  - rw r -----  1 oracle dba 1536 Aug 17 16 15 orapwora922
 
  可以看到 initora921 ora 文件长度由原来的 25 字节变成 1425 ,与 initora92 ora 文件长度一致,也变成可编辑的文本文件。
 
   initora92 ora initora921 ora 配置文件前几行是一致的,将 true 修改为 false
 
   * aq_tm_processes 0
 
   * background_dump_dest '/home/oracle/app/oracle/admin/ora92/bdump'
 
   * cluster_database_instances 2
 
   * cluster_database true
 
   ora921 cluster_interconnects '192 168 1 1'
 
   ora922 cluster_interconnects '192 168 1 2'
 
   pfile 文件修改完成后关闭此节点的 cluster 服务,数据库也随 cluster 关闭而关闭。
 
   2 3 按非 RAC 模式操作指导修改字符集
 
  将数据修改为非 RAC 模式后可按非 RAC 模式的操作指导进行修改操作,操作时需要手工激活 oracle 系统 vg
 
   2 3 修改完成后备份恢复
 
  在非 RAC 模式完成字符集修改完成后,关闭数据库将原 dbs 目录恢复,重新启动 cluster 软件,在两台机器两个实例查询 oracle 服务器端字符集已经成功修改。
 
   2 4 RAC 环境修改字符集快速步骤
 
  总结上述操作步骤即操作过程,从理论上可以用以下步骤完成快速修改:
 
   2 4 先修改 spfile 的参数
 
  停止一个节点的 cluster 程序,在另一个节点执行
 
   Sqlplus ‘/as sysdba’
 
   SQL> Alter system set cluster_database false scope spfile
 
   SQL>exit
 
   2 4 进行字符集修改
 
  停止主节点的 cluster 程序,然后 varyonvg oravg
 
  然后用修改单机的操作步骤进行字符集修改。
 
   2 4 恢复 spfile 配置和 RAC 模式
 
   Sqlplus ‘/as sysdba’
 
   SQL> Alter system set cluster_database true scope spfile
 
   SQL>shutdown immediate
 
   SQL>exit
 
  启动两个节点的 cluster 进程,进行验证 测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值