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

在數據庫安裝部署時須要考慮數據庫字符集的問題,最好在安裝實例時就設置好,不建議後續對數據庫字符集進行修改。

相關文章
相關標籤/搜索