EXP遇到ORA-06552錯誤的解決( PLS-553: character set name is not recognized)2009-05-08 16:51有一個建好的數(shù)據(jù),Oracle 9.2.0.4 for linux,字符集是缺省的WE8ISO8859P1,沒有改成ZHS16GBK. 庫中暫時沒有任何數(shù)據(jù)。
由于字符集不是超集/子集關(guān)系,無法通過ALTER DATABASE CHARACTER SET修改字符集。
當(dāng)時時間緊張,就沒有重建數(shù)據(jù)庫,而是直接修改prop$表,將NLS_CHAR字符集改為ZHS16GBK。 update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET'; 重啟后建表、insert數(shù)據(jù),一切正常。。。直到今天要exp出數(shù)據(jù)。
執(zhí)行 exp userid=system owner=username ... 報錯! 即將導(dǎo)出指定的用戶… . 正在導(dǎo)出 pre-schema 過程對象和操作 . 正在導(dǎo)出用戶 USERNAME 的外部函數(shù)庫名稱 . 導(dǎo)出 PUBLIC 類型同義詞 EXP-00008: 遇到 ORACLE 錯誤 6552 ORA-06552: PL/SQL: Compilation unit analysis terminated ORA-06553: PLS-553: character set name is not recognized EXP-00000: 導(dǎo)出終止失敗
隱隱感覺與當(dāng)時的字符集設(shè)置有關(guān)。http://www./special/NLS_CHARACTER_SET_03.htm: “正式修改字符集時,Oracle至少需要更改12張數(shù)據(jù)字典表,而這種直接更新props$表的方式只完成了其中十二分之一的工作,潛在的完整性隱患是可想而知的。”
但是如何解決呢?后來搜索到未公開的INTERNAL_USE用法,強(qiáng)制完成字符集一致化,解決了問題。
首先,確認(rèn)字符集是否修改的不徹底。 SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET, DECODE(TYPE#, 1, DECODE(CHARSETFORM, 1, 'VARCHAR2', 2, 'NVARCHAR2', 'UNKOWN'), 9, DECODE(CHARSETFORM, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'), 96, DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'), 112, DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN FROM SYS.COL$ WHERE CHARSETFORM IN (1, 2) AND TYPE# IN (1, 9, 96, 112);
如果上面的查詢的確顯示有多個字符集的設(shè)定,則進(jìn)行如下處理: SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN;
COL VALUE NEW_VALUE CHARSET SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'; COL VALUE NEW_VALUE NCHARSET SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
--INTERNAL_USE是沒有寫在文檔中的參數(shù),用以強(qiáng)制完成字符集一致化 ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
SHUTDOWN IMMEDIATE; STARTUP; -- 再次啟動數(shù)據(jù)庫一遍 SHUTDOWN IMMEDIATE; STARTUP;
至此,EXP問題得到了解決。
注意:修改字符集只是修改了數(shù)據(jù)字典,并沒有對數(shù)據(jù)進(jìn)行字符集轉(zhuǎn)換!
|