本文是《DBA手记1》的读书笔记,相关文章:ORA-600(17069)错误的解决过程
1. 故障的确定:
ORA-00600 Error的通用处理
2. 故障的分析
1)根据已经确认的问题是library cache pin,加上若能在trace文件中找出SID,可用以下语句确认
-
SELECT EVENT,P1TEXT,P1RAW,P2TEXT,P2RAW,STATE
-
FROM V$SESSION_WAIT WHERE SID=75;
查询结果的EVENT就是library cache pin
2)确认Job调用的存储过程状态
-
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS
-
FROM DBA_OBJECTS
-
WHERE OWNER = :1
-
AND OBJECT_NAME = :2;
此时该存储过程的STATUS为INVALID
可先关闭该Job
-
EXEC DBMS_JOB.BROKEN(63,TRUE);
-
COMMIT;
-
-
#杀掉Job进程
-
SELECT SPID FROM V$PROCESS WHERE ADDR IN (
-
SELECT PADDR FROM V$SESSION WHERE SID = 75);
-
-
HOST kill -9 <进程ID>;
3)找出存储过程依赖对象
-
SELECT * FROM V$ACESS
-
WHERE (OWNER, OBJECT) IN
-
(SELECT REFERENCED_OWNER, REFERENCED_NAME FROM DBA_DEPENDENCIES
-
WHERE OWNER = :1 AND NAME = :2);
4)根据找出的SID,查找详细的会话信息
-
SELECT SID, SERIAL#, USERNAME, PROGRAM, TERMINAL
-
FROM V$SESSION WHERE SID = :1;
5)找出该会话执行的SQL语句
-
SELECT SQL_TEXT FROM V$SQL
-
WHERE ADDRESS IN (SELECT SQL_ADDRESS FROM V$SESSION WHERE SID = :1);
6)找出该语句的等待时间
-
SELECT EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3, SECONDS_IN_WAIT
-
FROM V$SESSION_WAIT WHERE SID = :1;
3. 故障解决
1)杀死以上查到的进程
-
#杀掉Job进程
-
SELECT SPID FROM V$PROCESS WHERE ADDR IN (
-
SELECT PADDR FROM V$SESSION WHERE SID = :1);
-
-
HOST kill -9 <进程ID>;
2)重新编译过程
-
ALTER PROCEDURE <> COMPILE
3) 重新恢复Job
-
EXEC DBMS_JOB.BROKEN(63, FALSE);
-
COMMIT;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22621861/viewspace-2109979/
,如需转载,请注明出处,否则将追究法律责任。