Oracle 10中修改字符集(character set)
Oracle 10.2.0.3數據庫原來的字符集是ZHS16GBK,為了支持更多的漢字,需要修改為ZHS32GB18030。
我首先想到原來在9i上修改字符集的方法,過程如下:
| sys@CNHTM> shutdown immediate sys@CNHTM> alter system enable restricted session; |
暈啊,ZHS32GB18030字符集明明是ZHS16GBK的超集,查metalink才知道,原來在Oracle 10G中,修改字符集需要用csalter配合csscan完成。過程如下:
% cd $ORACLE_HOME/rdbms/admin% sqlplus sys/password as sysdba
SQL> START csminst.sql
安裝csscan
| oracle@oracle[/home/oracle]> sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 23 19:58:21 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options sys@CNHTM> set termout on sys@CNHTM> set echo on sys@CNHTM> spool /tmp/csminst.log sys@CNHTM> @?/rdbms/admin/csminst.sql sys@CNHTM> rem sys@CNHTM> rem NAME sys@CNHTM> rem csminst.sql ... 省略n行 ... sys@CNHTM> rem ***************************************************************** sys@CNHTM> rem CSMV$EXTABLES lists all distinct objects to be scaned sys@CNHTM> rem ***************************************************************** sys@CNHTM> create or replace view csmig.csmv$extables 2 (obj#, usr#, property) 3 as 4 select distinct(obj#), usr#, property 5 from csm$extables where property=0; View created. sys@CNHTM> / View created. sys@CNHTM> commit 2 / Commit complete. sys@CNHTM> exit; Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options |
安裝后會自動退出plsql,可以檢查/tmp/csminst.log文件,查看安裝的詳細日志。
測試csscan是否安裝成功
| oracle@oracle[/home/oracle]> csscan table=sys.sql_version$ fromchar=zhs16gbk tochar=zhs32gb18030 log=instchkc capture=n process=1 array=1024000 Character Set Scanner v2.1 : Release 10.2.0.0.0 - Production on Wed Dec 23 20:15:30 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. Username: / as sysdba (這里輸入用戶名密碼) Password: Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options Enumerating table to scan... . process 1 scanning SYS.SQL_VERSION$[AAAAIDAABAAAA/xAAA] Creating Database Scan Summary Report... Creating Individual Exception Report... Scanner terminated successfully. |
如果顯示Scanner terminated successfully.證明csscan安裝成功,會生成如下三個文件。把這三個文件刪除。
| oracle@oracle[/home/oracle]> ls -l instchkc* -rw-r--r-- 1 oracle oinstall 1357 Dec 23 20:16 instchkc.err -rw-r--r-- 1 oracle oinstall 504 Dec 23 20:16 instchkc.out -rw-r--r-- 1 oracle oinstall 5481 Dec 23 20:16 instchkc.txt |
開始正式運行csscan,下一步的csalter過程依賴這一步的運行結果。
| oracle@oracle[/home/oracle]> csscan full=y tochar=zhs32gb18030 array=1024000 process=2 Character Set Scanner v2.1 : Release 10.2.0.0.0 - Production on Wed Dec 23 20:21:14 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. Username: / as sysdba (這里輸入用戶名密碼) Password: Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options Enumerating tables to scan... . process 1 scanning SYS.SOURCE$[AAAABIAABAAAAIRAAA] . process 2 scanning SYS.TYPE$[AAAAC1AABAAAAURAAA] ...省略n行... . process 2 scanning SYS.WRH$_INST_CACHE_TRANSFER[AAAMgoAADAAABNhAAA] . process 1 scanning SYSTEM.LOGMNRC_GTLO[AAABa0AADAAAAZhAAA] . process 2 scanning SYS.WRH$_DLM_MISC[AAAMhlAADAAAA5RAAA] Creating Database Scan Summary Report... Creating Individual Exception Report... Scanner terminated successfully. |
運行csalter,修改字符集
| oracle@oracle[/home/oracle]> sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 23 20:34:12 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options sys@CNHTM> @?/rdbms/admin/csalter.plb 4 rows created. Function created. Function created. Procedure created. This script will update the content of the Oracle Data Dictionary. Please ensure you have a full backup before initiating this procedure. Would you like to proceed (Y/N)?y old 6: if (UPPER('&conf') <> 'Y') then new 6: if (UPPER('y') <> 'Y') then Checking data validility... begin converting system objects PL/SQL procedure successfully completed. Alter the database character set... CSALTER operation completed, please restart database PL/SQL procedure successfully completed. 4 rows deleted. Function dropped. Function dropped. Procedure dropped. |
重啟數據庫
| sys@CNHTM> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. sys@CNHTM> startup ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1218292 bytes Variable Size 71305484 bytes Database Buffers 88080384 bytes Redo Buffers 7168000 bytes Database mounted. Database opened. |
檢查字符集
| sys@CNHTM> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.ZHS32GB18030 |
結果顯示,修改成功
--end--
================================================================================================
運行csalter修改字符集;
對于RAC環境:
1.?修改CLUSTER_DATABASE參數為flase;
Alter system set cluster_database=flase scope=spfile;
Alter system set?job_queue_processes=0?scope=spfile;
alter system set?aq_tm_processes=0??scope=spfile;
2.?啟動數據庫到單實例模式;
startuprestrict
spool switch.log
3.?運行csalter:
----?以sys執行:@ ?/rdbms/admin/csalter.plb
----?檢查執行csalter的輸出信息,是否有錯誤;
如果執行那么修改還原原始的參數:
Alter system set cluster_database=true scope=spfile;
Alter system set?job_queue_processes=old_value?scope=both sid=’*’;
alter system set?aq_tm_processes=old_value?scope=both sid=’*’;
4. 重啟數據庫;
----shutdown immediate;
----startup
----檢查字符集是否修改成功
檢查alert log或運行如下sql:
select userenv('language') from dual;
================================================================================================安裝配置csscan工具;
用具有dba權限的用戶執行@?/rdbms/admin/csminst.sql;
運行csscan進行掃描;
例如:
csscan system/oracle full=y FROMCHAR=WE8ISO8859P1TOCHAR=ZHS16GBK ARRAY=1024000 PROCESS=1
可以csscan help=y查看幫助
Csscan運行結束后,默認會在當前目前下生存如下3個文件:
[oracle@roger oracle]$ ls -ltr scan*
-rw-r--r-- ?1oracle dba ?8239 Jul ?4 16:56 scan.txt
-rw-r--r-- ?1oracle dba 73078 Jul ?4 16:56 scan.out
-rw-r--r-- ?1oracle dba ?1878 Jul ?4 16:56 scan.err
?
Scan工具會把最近一次掃描的參數寫入到同義詞csm$parameters中,下次進行數據庫字符集轉換時,直接從該同義詞讀取信息;
檢查scan.txt:
對于convertible, truncated的對象可以通過exp/imp來完成;
對于lossy的對象,可以用plsql進行導出然后手工轉換編碼,然后刪除對象,等運行csalter命令修改字符集完成后,再將前面的對象導入。
導出convetitble和truncate的對象后,需要重新運行csscan工具;
================================================================================================
1.首先執行$ORACLE_HOME/rdbms/admin/csminst.sql,創建一些數據庫對象,包括數據庫用戶
2.備份Oracle數據庫,最好全庫備份;
3.使用csscan命令檢查字符集轉換是否可行.csscan有四種掃描模式:全庫掃描,按用戶掃描,按表掃描,按列掃描.因為我們是改變全庫的字符集,所以要用全庫掃描.并且要求有DBA權限.
4.運行csscan掃描數據庫:csscan SYSTEM/testdb FULL=y TOCHAR=ZHS16GBK ARRAY=1024000 PROCESS=1
5.掃描結束后,會在當前目錄下產生三個文件:scan.txt,scan.out,scan.err,我們更多的需要關注scan.err
6.可能需要多運行幾次csscan命令,以確保scan.err中沒有報錯,才能進行字符轉換.
7.沒有問題之后,然后運行$ORACLE_HOME/rdbms/admin/csalter.plb腳本,進行轉化。轉化的過程中,需要注意,數據庫不能有別的session運行,否則會報錯.另外,由于在轉換的過程中讀取的是CSMIG用戶下的CSM$PARAMETERS表中的數據,因此在轉換前必須用csscan執行一次全庫掃描.
可能會遇到的問題:
Full database scan is required ----需要全表掃描
Exceptional data found in scanner result -----檢查scan.err應該還有錯誤報告
Sorry only one session is allowed to run this script -----還有別的session在運行,斷開連接后再試試.
總結
以上是生活随笔為你收集整理的Oracle 10中修改字符集(character set)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ERROR OGG-01163 Bad
- 下一篇: ORACLE数据迁移参考