• 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/,如需转载,请注明出处,否则将追究法律责任。

  • 相关阅读:
    团队开发-第一阶段冲刺-10
    团队开发-第一阶段冲刺-09
    Spring(三)
    第五周总结
    Spring(一)
    程序员修炼之道:从小工到专家阅读笔记1
    MyBatis(三)
    MyBatis(二)
    MyBatis
    第四周总结
  • 原文地址:https://www.cnblogs.com/ritchy/p/11390329.html
Copyright © 2020-2023  润新知