Oracle SPA取報告階段xml解析失敗解決方案


SPA的整體測試過程可以參考:

故障描述:數據庫字符集:US7ASCII,在SPA分析階段正常,但在取報告階段xml解析失敗,具體現象如下:

SQL>
ALTER SESSION SET EVENTS='31156 TRACE NAME CONTEXT FOREVER, LEVEL 0X400';
SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED
SPOOL error.html
SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK('SPA_TASK_201806','HTML','ERRORS','ALL',NULL,1000,'COMPARE_ET_201806')).GETCLOBVAL(0,0) FROM DUAL;
spool off

ERROR:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00216: invalid character 207 (0xCF)
Error at line 26
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 8211
ORA-06512: at "SYS.DBMS_SQLPA", line 515
ORA-06512: at line 1

這個invalid character 207,之前是別的無效字符,用一些方法刪除掉重新SPA解包分析,又會報207無效字符,看起來是大量不合規的sql_text,基本判定刪不完,而且就算能刪除干凈也會導致SPA的分析結果集缺失嚴重,所以我們需要更好的解決方案。
經過系列測試,和幾位專家溝通,最終決定嘗試獨立恢復出這個庫,測試修改字符集,參考命令如下:

SQL> 
shutdown immediate;
startup mount;
select logins, active_state from v$instance;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter database open;

select userenv('language') from dual;
--alter database character set zhs16gbk;
--注意:Oracle轉化字符集

alter database character set internal_convert zhs16gbk;
--注意:Oracle會自動轉換含有CLOB的

--alter database character set internal_use us7ascii;
--注意:Oracle會強制轉換,會造成部分數據亂碼,慎用

--alter database national character set zhs16gbk;
--注意:修改國家字符集,我這里不需要修改。

shutdown immediate;
startup
select userenv('language') from dual;
select logins, active_state from v$instance;
alter system disable restricted session;
alter system set job_queue_processes=1000;

再次嘗試獲取SPA報告:

ALTER SESSION SET EVENTS='31156 TRACE NAME CONTEXT FOREVER, LEVEL 0X400';
SET LINES 1111 PAGES 50000 LONG 1999999999 TRIM ON TRIMS ON SERVEROUTPUT ON SIZE UNLIMITED
SPOOL error.html
SELECT XMLTYPE(DBMS_SQLPA.REPORT_ANALYSIS_TASK('SPA_TASK_201806','HTML','ERRORS','ALL',NULL,1000,'COMPARE_ET_201806')).GETCLOBVAL(0,0) FROM DUAL;
spool off

可以成功執行取出報告。

另外注意,字符集不能反復修改,實際測試,如果此時改成us7ascii,再改回zhs16gbk,再嘗試取SPA報告也不再成功。我這里測試會有如下的報錯:

ERROR:
ORA-51705: XML DOM error: 217 "
LPX-00217: invalid character 0 (U+0000)"
ORA-06512: at "SYS.DBMS_SQLTUNE_INTERNAL", line 8211
ORA-06512: at "SYS.DBMS_SQLPA", line 515
ORA-06512: at line 1

所以,這也是為什么要RMAN恢復一個獨立的測試庫進行取報告的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM