查询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