查询v$session报ORA-29275

客户反馈查询v$session碰到ORA-29275错误
按经验是ACTION列的问题,以前用toad时碰到过
先去掉ACTION列查询一把:
select SADDR ,
 SID ,
 SERIAL# ,
 AUDSID ,
 PADDR ,
 USER# ,
 USERNAME ,
 COMMAND ,
 OWNERID ,
 TADDR ,
 LOCKWAIT ,
 STATUS ,
 SERVER ,
 SCHEMA# ,
 SCHEMANAME ,
 OSUSER ,
 PROCESS ,
 MACHINE ,
 PORT ,
 TERMINAL ,
 PROGRAM ,
 TYPE ,
 SQL_ADDRESS ,
 SQL_HASH_VALUE ,
 SQL_ID ,
 SQL_CHILD_NUMBER ,
 SQL_EXEC_START ,
 SQL_EXEC_ID ,
 PREV_SQL_ADDR ,
 PREV_HASH_VALUE ,
 PREV_SQL_ID ,
 PREV_CHILD_NUMBER ,
 PREV_EXEC_START ,
 PREV_EXEC_ID ,
 PLSQL_ENTRY_OBJECT_ID ,
 PLSQL_ENTRY_SUBPROGRAM_ID ,
 PLSQL_OBJECT_ID ,
 PLSQL_SUBPROGRAM_ID ,
 MODULE ,
 MODULE_HASH ,
 --ACTION ,
 ACTION_HASH ,
 CLIENT_INFO ,
 FIXED_TABLE_SEQUENCE ,
 ROW_WAIT_OBJ# ,
 ROW_WAIT_FILE# ,
 ROW_WAIT_BLOCK# ,
 ROW_WAIT_ROW# ,
 TOP_LEVEL_CALL# ,
 LOGON_TIME ,
 LAST_CALL_ET ,
 PDML_ENABLED ,
 FAILOVER_TYPE ,
 FAILOVER_METHOD ,
 FAILED_OVER ,
 RESOURCE_CONSUMER_GROUP ,
 PDML_STATUS ,
 PDDL_STATUS ,
 PQ_STATUS ,
 CURRENT_QUEUE_DURATION ,
 CLIENT_IDENTIFIER ,
 BLOCKING_SESSION_STATUS ,
 BLOCKING_INSTANCE ,
 BLOCKING_SESSION ,
 FINAL_BLOCKING_SESSION_STATUS ,
 FINAL_BLOCKING_INSTANCE ,
 FINAL_BLOCKING_SESSION ,
 SEQ# ,
 EVENT# ,
 EVENT ,
 P1TEXT ,
 P1 ,
 P1RAW ,
 P2TEXT ,
 P2 ,
 P2RAW ,
 P3TEXT ,
 P3 ,
 P3RAW ,
 WAIT_CLASS_ID ,
 WAIT_CLASS# ,
 WAIT_CLASS ,
 WAIT_TIME ,
 SECONDS_IN_WAIT ,
 STATE ,
 WAIT_TIME_MICRO ,
 TIME_REMAINING_MICRO ,
 TIME_SINCE_LAST_WAIT_MICRO ,
 SERVICE_NAME ,
 SQL_TRACE ,
 SQL_TRACE_WAITS ,
 SQL_TRACE_BINDS ,
 SQL_TRACE_PLAN_STATS ,
 SESSION_EDITION_ID ,
 CREATOR_ADDR ,
 CREATOR_SERIAL# ,
 ECID from v$session ;
一切正常,接下来看是哪些会话的ACTION列导致的问题:
拼接SQL来执行:
select 'select action from v$session where sid='||sid||';' from v$session ;
得到结果:
SQL> select action from v$session where sid=7529;
ERROR:
ORA-29275: partial multibyte character
 
 
SQL> select action from v$session where sid=1513;
ERROR:
ORA-29275: partial multibyte character
SQL> select sid,serial#,sql_id,username,program,module,substr(action,-1,100) action from v$session where sid in (7529,1513);
 
       SID SERIAL# SQL_ID USERNAME PROGRAM MODULE AC
---------- ---------- ------------- ------------------------------ ------------------------------------------------ ---------------------- --
      1513 10519 ***** plsqldev.exe PL/SQL Developer ?
      7529 635 ******** plsqldev.exe PL/SQL Developer ?
 
检查数据库字符集为:ZHS16CGB231280
这个字符集应该是ZHS16GBK的一个子集,比较老的系统才会用这个字符集了(这个数据库是从9i升级上来的),现在国内主流是ZHS16GBK了,这就存在一个问题,ZHS16BK中的部分字符集在ZHS16CGB231280中是非法的,比如0XCD,这样客户端PLSQL/Developer在调用DBMS_APPLICATION_INFO.set_action的时候就可能传入被认为非法的字符,导致查询的时候出错。
 
解决办法:
1、KILL原来的导致问题的会话,对v$session的查询恢复正常
2、为防止以后再出现此类问题:
linux的话export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"
Windows的话新建系统环境变量NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
posted @ 2020-08-25 15:00  Leadx·Wu  阅读(666)  评论(0)    收藏  举报