RAC環境下修改字符集

跟單實例多少有點區別
ORACLE 11g RAC 兩節點
第一步 查看字符集
PRIMARY-SYS@mydb2>select userenv('language') from dual;shell

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%';oracle

select * from nls_database_parameters;
*/app


第二步 關閉一個節點
[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;spa

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;
*/.net

第四步 修改參數blog

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。

三次編碼轉換
一、執行exp時,數據庫中數據的編碼會轉換爲導出客戶端編碼
二、執行imp時,dmp文件的編碼轉換爲導入客戶端編碼
三、導入客戶端編碼轉換爲目標端數據庫的數據庫編碼
處理辦法:經過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/,如需轉載,請註明出處,不然將追究法律責任。

相關文章
相關標籤/搜索