Oracle数据库字符集修改

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

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

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

  查看server端字符集方法:session

      1)SELECT * FROM Nls_Database_Parameters;oracle

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

  查看client端字符集方法:性能

        Windows方法:编码

           C:\Users\zhang>SET NLS_LANG
           NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBKspa

        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

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

    接下来以数据库的字符集从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;

2、修改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

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

相关文章
相关标签/搜索