oracle数据库服务宕机可能是什么原因造成的?

oracle数据库服务宕机可能是什么原因造成的?,第1张

原因很多,内部原因外部原因都有可能。

外部原因:比如服务器宕机,系统错误,温度过高宕机(比如机房空调坏了),临时断电,内存错误等等这些都有可能,电压不足等等。

内部原因:比较常见的有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数据库挂了就是数据库宕机了,不能再提供服务。

最简单的处理办法就是重启计算机。

或者就要在数据库里排查出发生问题的原因,然后对症解决。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9475146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存