外部原因:比如服务器宕机,系统错误,温度过高宕机(比如机房空调坏了),临时断电,内存错误等等这些都有可能,电压不足等等。
内部原因:比较常见的有undo文件损坏,数据文件错误(遇到过一次,最后用补0的方法扩大了数据文件才好,不过现在用asm存储,这个应该不怎么可能了),时间调整错误(向后调,改动时间过长,比如00:00改为01:00,那么就两个情况都占,未必一定宕机,不过可能性很大),核心进程错误(这个比较少见,不过真的有,有时是有人误杀了),程序错误导致(见过一个因为某程序错误,导致锁表,而后锁表导致某进程一直占用内存,后来的进程根本进不了该表,然后越滚越大最后宕机,还是后来查出来的,相当于蝴蝶扇翅膀变成飓风,所以有错误要及时发现才行),存储错误,io争用(持续时间长)等等。
这么说吧,很多的ora错误都可能引起宕机(并不是全部ora错误都会引起宕机),真要说的话要很长时间,如果想不宕机那么就要有监测检查制度,早发现早解决,也就不会有什么问题了。
在故障发生时,尝试用下面的语句抓取数据库引起故障的点。/*********************************************************************************************/
在oracle中监控死锁
/*********************************************************************************************/
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE(m.lmode,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
lmode,
LTRIM(TO_CHAR(lmode, '990'))) lmode,
DECODE(m.request,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
request,
LTRIM(TO_CHAR(m.request, '990'))) request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞
OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0 AND lmode != 4 AND
(id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request
/*********************************************************************************************/
定位引起oracle死锁的sql
/*********************************************************************************************/
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
/*********************************************************************************************/
下面的SQL查询可以用于确定锁住数据库对象的锁:
/*********************************************************************************************/
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id
/*********************************************************************************************/
显示哪些会话被锁住
/*********************************************************************************************/
/* showlock.sql */
COLUMN o_name format a10
COLUMN lock_type format a20
COLUMN object_name format a15
SELECT RPAD (oracle_username, 10) o_name, session_id SID,
DECODE (locked_mode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Execlusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
object_name, xidusn, xidslot, xidsqn
FROM v$locked_object, all_objects
WHERE v$locked_object.object_id = all_objects.object_id
/*********************************************************************************************/
显示所有的TM和TX锁
/*********************************************************************************************/
/* showalllock.sql */
SELECT SID, TYPE, id1, id2,
DECODE (lmode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Exclusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
request, ctime, BLOCK
FROM v$lock
WHERE TYPE IN ('TX', 'TM')
/*********************************************************************************************/
在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:
被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.
我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session
的paddr都被更改为相同的进程地址:
/*********************************************************************************************/
alter system kill session 'sid,serial#'
/*********************************************************************************************/
在oracle中kill掉的进程有时还需要等待pmon回滚数据库已经占有的资源
有时候我们需要使用下面的脚本找出那些已经在oracle中kill掉的进程,在 *** 作系统中在kill一次
/*********************************************************************************************/
select p.addr from v$process p where pid <>1
minus
select s.paddr from v$session s
$ kill -9 &paddr
监控判断oracle数据库挂了就是数据库宕机了,不能再提供服务。最简单的处理办法就是重启计算机。
或者就要在数据库里排查出发生问题的原因,然后对症解决。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)