EXP遇到ORA-06552錯(cuò)誤的解決( PLS-553: character set name is not recognized)2009-05-08 16:51有一個(gè)建好的數(shù)據(jù),Oracle 9.2.0.4 for linux,字符集是缺省的WE8ISO8859P1,沒(méi)有改成ZHS16GBK. 庫(kù)中暫時(shí)沒(méi)有任何數(shù)據(jù)。
由于字符集不是超集/子集關(guān)系,無(wú)法通過(guò)ALTER DATABASE CHARACTER SET修改字符集。
當(dāng)時(shí)時(shí)間緊張,就沒(méi)有重建數(shù)據(jù)庫(kù),而是直接修改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 ... 報(bào)錯(cuò)! 即將導(dǎo)出指定的用戶(hù)… . 正在導(dǎo)出 pre-schema 過(guò)程對(duì)象和操作 . 正在導(dǎo)出用戶(hù) USERNAME 的外部函數(shù)庫(kù)名稱(chēng) . 導(dǎo)出 PUBLIC 類(lèi)型同義詞 EXP-00008: 遇到 ORACLE 錯(cuò)誤 6552 ORA-06552: PL/SQL: Compilation unit analysis terminated ORA-06553: PLS-553: character set name is not recognized EXP-00000: 導(dǎo)出終止失敗
隱隱感覺(jué)與當(dāng)時(shí)的字符集設(shè)置有關(guān)。http://www./special/NLS_CHARACTER_SET_03.htm: “正式修改字符集時(shí),Oracle至少需要更改12張數(shù)據(jù)字典表,而這種直接更新props$表的方式只完成了其中十二分之一的工作,潛在的完整性隱患是可想而知的。”
但是如何解決呢?后來(lái)搜索到未公開(kāi)的INTERNAL_USE用法,強(qiáng)制完成字符集一致化,解決了問(wèn)題。
首先,確認(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);
如果上面的查詢(xún)的確顯示有多個(gè)字符集的設(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是沒(méi)有寫(xiě)在文檔中的參數(shù),用以強(qiáng)制完成字符集一致化 ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
SHUTDOWN IMMEDIATE; STARTUP; -- 再次啟動(dòng)數(shù)據(jù)庫(kù)一遍 SHUTDOWN IMMEDIATE; STARTUP;
至此,EXP問(wèn)題得到了解決。
注意:修改字符集只是修改了數(shù)據(jù)字典,并沒(méi)有對(duì)數(shù)據(jù)進(jìn)行字符集轉(zhuǎn)換!
|