• Oracle数据库字符集修改


           Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。一般来说,数据库字符集在安装数据库实例时就指定好了,而且不建议安装完成后修改数据库字符集,理论上是不能改变的。如果确实存在字符兼容性的问题,数据库字符集也是可以修改的。

           Oracle的字符集命名遵循以下命名规则: <Language><bit size><encoding> 即: <语言><比特位数><编码>,Language指定服务器消息的语言,territory指定服务器的日期和数字格式,charset指定字符集。如CHINESE_CHINA.ZHS32GB18030。

           数据库字符集设计三个方面:(1)server端 (2)client端 (3)dmp文件

      查看server端字符集方法:

          1)SELECT * FROM Nls_Database_Parameters;

          2)SELECT Userenv('language') FROM Dual;

      查看client端字符集方法:

            Windows方法:

               C:Userszhang>SET NLS_LANG
               NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

            Unix方法:echo $NLS_LANG

       查看dmp文件字符集:

    oracle的exp工具导出的dmp文件也包含了字符集信息。dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

    SQL>SELECT Nls_Charset_Name(To_Number('0354', 'xxxx')) FROM Dual;
    NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'
    ----------------------------------------
    ZHS16GBK

    如果dmp文件很大如2G以上,可以用以下命令查看(在unix主机上): cat dbexp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

    一、修改单实例的数据库字符集

        接下来以数据库的字符集从ZHS16GBK修改为 ZHS32GB18030为例。

    操作步骤如下:

    --停监听
    lsnrctl stop
    --关闭数据库
    SQL>shutdown immediate;
    --开启数据库到mount状态
    SQL>startup mount ;
    --SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
    --sql_trace =true在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用,这个参数在10g之后是动态参数,可以随时调整,在某些诊断中非常有效。
    --提示: 通过在全局启用sql_trace,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程之间的紧密协调.
    SQL>alter session set sql_trace=true;
    --ALTER SYSTEM DISABLE RESTRICTED SESSION来取消数据库的受限制状态。在数据库受限制的过程中,只有对数据库拥有CREATE SESSION权限的用户才能够连接到数据库。这种状态有利于对数据库进行备份,恢复,导入,导出等操作。
    SQL>alter system enable restricted session;
    --首先设置JOB_QUEUE_PROCESSES=0,Oracle会杀掉CJQ0及相应job进程
    SQL>alter system set job_queue_processes=0;
    --aq_tm_processes值可选在1到10之间,0代表是关闭队列监视
    SQL>alter system set aq_tm_processes=0;
    --利用INTERNAL_USE 关键字修改区域设置,目的是让Oracle数据库绕过了子集与超集的校验
    SQL>alter database character set INTERNAL_USE ZHS32GB18030;
    --打开数据库
    SQL>alter database open;
    --再次关闭数据库
    SQL>shutdown immediate ;
    --再次打开数据库
    SQL>startup ;
    SQL>SET linesize 200
    SQL>SELECT *
      FROM Nls_Database_Parameters a
    WHERE a.Parameter = 'NLS_CHARACTERSET';
    SQL>SELECT '张王李赵' from dual;

    二、修改RAC环境下的数据库字符集

          Oracle11gR2中RAC环境下修改数据库字符集方法:

    (1) 停监听
    ps -ef |grep pmon
    lsnrctl stop
    (2) 停所有实例
    cd $ORACLE_HOME/crs_1/bin
    ./srvctl stop database -d testdb
    或者使用
    ./srvctl stop instance -d testdb -i rac1
    ./srvctl stop instance -d testdb -i rac2
    (3) 查看集群状态
    crs_stat -t
    (4) 只能在一个节点上操作,如rac1,否则会报ORA-12720错误,意为此操作只能在单实例下操作。
    startup
    (5) 先将数据库置于非集群状态
    alter system set cluster_database=false scope=spfile sid='testdb';
    (6) 修改数据库字符集
    shutdown immediate;
    startup mount;
    alter session set sql_trace=true;
    alter system enable restricted session;
    alter system set job_queue_processes=0;
    alter system set aq_tm_processes=0;
    alter database character set INTERNAL_USE ZHS32GB18030;
    (7) 再将数据库置于集群状态
    alter system set cluster_database=true scope=spfile;
    (8) 关闭数据库
    shutdown immediate;
    (9) 先启动一个节点进行验证,各节点都需要进行验证。
    startup
    sqlplus / as sysdba
    SELECT '张王李赵' FROM Dual;
    (10) 恢复集群状态
    ./srvctl start database -d testdb
    (11) 查看集群状态
    crs_stat –t

    在数据库安装部署时需要考虑数据库字符集的问题,最好在安装实例时就设置好,不建议后续对数据库字符集进行修改。

  • 相关阅读:
    CRM4.0多组织安装和设置
    如何找回你的VirtualPC2007控制台
    线性表
    时间复杂度
    栈与队列
    字符串排序问题
    浙江企业网喜讯之一
    初次体验到C#范型的魅力
    ajax 或 js 异步判断用户名是否存在
    html基础知识1(基本标签)20170307
  • 原文地址:https://www.cnblogs.com/oracle-dba/p/3791741.html
Copyright © 2020-2023  润新知