oracle数据库常见故障处理解决办法

实例管理类    
等待事件类    
“TX,TM,DX”锁应急处理    
“Latch free”应急处理    
“Cache buffer chains”应急处理    
“Library cache lock”应急处理    
“gc buffer busy”应急处理    
“cursor: pin S wait on X”事件应急处理    
“latch: undo global data”事件应急处理    
“enq:US-content” or 回滚表空间使用过度事件应急处理    
“gc buffer busy”问题    
资源消耗类    
高资源消耗进程应急处理    
IO非常高    
PGA使用过大    
CPU使用过高应急处理    
大表索引被删除导致CPU 100%的应急处理    
网络连接类    
连接不上数据库    
客户端不定时断开连接    
通过监听无法连接数据库    
空间管理类    
表空间故障应急处理    
SYSAUX表空间爆满没有存储扩容应急处理    
文件系统使用率达到或超过95%应急处理    
临时表空间过度事件应急处理    
undo表空间无法自动扩展    
undo表空间无法扩展    
数据库恢复类    
CRS资源异常类    
RAC数据库CRS无法正常启动    
VIP资源DOWN异常处理    
数据库HANG类    
数据库HANG异常处理    
数据库CRASH类    
实例CRASH应急处理    
应用操作类    
SQL执行计划变化应急处理    
使用绑定变量SQL突然运行缓慢的应急处理    
其他分类    
升级PSU系统报错    
数据库在执行过程中使用动态采样    
通过srvctl查看数据库的状态时反应缓慢    


实例管理类
等待事件类
“TX,TM,DX”锁应急处理
现象描述:
数据库大量锁异常等待,系统资源消耗高,cpu负载高 (针对大量'TX,TM,DX'等类型的锁造成的大量异常等待)

影响因素:
多个事务争用造成。

解决方法
以下语句列出是谁造成了阻塞
 column event format a30  
  column sess format a20
  set linesize 250
  set pagesize 0
  break on id1 skip 1
select decode(request,0,'Holder:',' Waiter:') || s.inst_id || ':' || s.sid||','|| s.serial# sess,
      id1, id2, lmode, request, l.type, ctime, s.username,s.sql_id, s.event
-- ,s.service_name
  from gv$lock l, gv$session s
  where (id1, id2, l.type) in
    (select id1, id2, type from gv$lock where request>0
    )
   and l.sid=s.sid
   and l.inst_id=s.inst_id    
  order by id1, ctime desc, request 
/

按照这个语句多查询几次,如果Holder不变,则KILL掉。操作前记录相关日志

“Latch free”应急处理
现象描述:
数据库大量latch free等待,系统资源消耗高,cpu负载接近100%

影响因素:

解决方法:
1.查询当前active的会话模块:
select username,machine,count(*) from v$session where status='ACTIVE' having count(*)>6 group by username,machine order by 1;
将会话数量过多的模块通知开发商,让他们切换部分业务到另外一个节点
然后进行系统资源监控和数据库监控

“Cache buffer chains”应急处理
现象描述:
数据库大量cache buffer chains等待,系统资源消耗高,cpu负载高

影响因素:
A.低效的SQL语句是发生 cache buffers chains(热块争用),锁存器争用的最重要原因。
B.多个进程同时扫描大范围的索引或表时,可能广泛引发cache buffers chains 锁存器争用。
C.应用程序打开执行相同的低效率SQL语句的多个并发会话,并且这些SQL语句都设法得到相同的数据集,这种情景十分普遍。

解决方法:
1.查看 latch: cache buffers chains 事件相关的会话信息;
select sid,username,machine,program,p1raw,sql_id,logon_time,last_call_et from v$session where event='latch: cache buffers chains';
使用ora命令  ora get_kill_sh &sql_id &username 进行查杀.
查杀后记录该sql语句,丢给相应的开发商处理

2、查看哪个SQL执行的次数最多
select sql_id,count(*) from v$session where event='latch: cache buffers chains' group by sql_id order by 2;

“Library cache lock”应急处理
现象描述:
数据库大量library cache lock等待,系统资源消耗高,cpu的idle为0

影响因素:
library cache lock出现的情况比较复杂,例如:
A、大量对某个对象访问;
B、shared pool有问题;

解决方法:
1、看看是不是某条SQL引起
select sql_id,count(*) from v$session where event='library cache lock' group by sql_id order by 2;
然后分析SQL中的对象和执行计划等,再跟开发商确认,用ora get_kill_sh进行杀
2、shared pool的内部结构造成,再开一个窗口用topas监控系统资源,然后清理shared pool
alter system flush shared pool; (该操作需要向直属领导确认)

“gc buffer busy”应急处理
现象描述:
一般的现象为CPU较高,IO较忙,处理方法与cache buffer chains应急处理一样

影响因素:
gc buffer busy出现在RAC中,出现概率并不高,因为BOSS是对业务做了分离的,是由于多节点同时大量访问某些数据块引起的

解决方法:
1.查看 latch: cache buffers chains 事件相关的会话信息;
select sid,serial#, username,machine,program,p1raw,sql_id,logon_time,last_call_et from v$session where event='gc buffer busy';
使用ora命令alter system kill session 'sid,serial#' 进行查杀.
查杀后记录该sql语句,丢给相应的开发商处理
2、查看哪个SQL执行的次数最多
select sql_id,count(*) from v$session where event=' gc buffer busy ' group by sql_id order by 2;

“cursor: pin S wait on X”事件应急处理
现象描述:

影响因素:
一般包含以下几种:
1、常见硬解析
2、High Version Counts
3、BUG

解决方法:

1、查找等待事件的阻塞者:
select p2raw,to_number(substr(to_char(rawtohex(p2raw)),1,8),'XXXXXXXX') sid from v$session where event = 'cursor: pin S wait on X';
2、查看阻塞者在做什么:
select sid,serial#,SQL_ID,BLOCKING_SESSION,BLOCKING_SESSION_STATUS,EVENT 
from v$session where SID=31;
3、根据阻塞者的SQL分析产生原因。

“latch: undo global data”事件应急处理
现象描述:
一个大事务对某个表进行DML操作,使用大量undo空间。大量并发语句发起对这个表的操作,由于一致性读,需要使用undo记录进行回滚,产生latch:undo global data等待,cpu使用率上升

影响因素:
一般包含以下几种:
1、大事务对某个表进行DML操作

解决方法:
1、查找session使用undo量的SQL:
SELECT r.name rbs,
       nvl(s.username, 'None') oracle_user,
       s.osuser client_user,
       p.username unix_user,
       s.sid,
       s.serial#,
       p.spid unix_pid,
       t.used_ublk * TO_NUMBER(x.value) / 1024 / 1024 as undo_mb ,
       TO_CHAR(s.logon_time, 'mm/dd/yy hh24:mi:ss') as login_time,
       TO_CHAR(sysdate - (s.last_call_et) / 86400, 'mm/dd/yy hh24:mi:ss') as last_txn,
       t.START_TIME transaction_starttime
 FROM v$process      p,
       v$rollname    r,
       v$session     s,
       v$transaction t,
       v$parameter   x 
 WHERE s.taddr = t.addr 
   AND s.paddr = p.addr 
   AND r.usn = t.xidusn(+) 
   AND x.name = 'db_block_size' 
 ORDER by undo_mb desc
/

2、大事务对数据库和应用影响还不大得情况下,可以采取的方法:
   a.查找v$session_longops,评估是让事务进行还是Kill发起大事务的session各自的代价,选择其中一个代价较低的方式。
   b.如果是选择kill掉session,可以开启并发回滚事务的特性,加快事务回滚。

3、大量并发语句,大量’latch:undo global data’等待,应用已经无法响应,CPU使用90%以上的情况:
   a.此时不管是采用何种回滚特性(并发回滚、单进程回滚),由于已经没有cpu资源,回滚都非常耗时。
   b.联系应用确认是否可以空表暂时代替,如果可以,可以再kill掉session后,将表rename掉,重新建一种空表,让应用临时使用。
   c.后续使用分批提交的方式,将源表数据回插空表。
   d.如不能空表代替,则只能暂停应用,kill掉等待session,cpu恢复正常后并发回滚,或建空表回插数据。
4、事件处理完毕后,对发起大事务的程序发给应用侧修改,如果是个人发起,则加强培训。

“enq:US-content” or 回滚表空间使用过度事件应急处理
现象描述:

影响因素:

一般包含以下几种:
1、 回滚表空间使用过度,session发起新事务查找回滚段时需要排队等待
2、 Oracle Bug

解决方法:
1、查找undo表空间使用情况的SQL:
select b.tablespace_name,
       nvl(used_undo,0) "USED_UNDO(M)",
       total_undo "Total_undo(M)",
       trunc(nvl(used_undo,0) / total_undo * 100, 2) || '%' used_PCT
  from (select nvl(sum(bytes / 1024 / 1024), 0) used_undo, tablespace_name
          from dba_undo_extents
         where status in ( 'ACTIVE','UNEXPIRED')
         group by tablespace_name) a,
       (select tablespace_name, sum(bytes / 1024 / 1024) total_undo
          from dba_data_files
         where tablespace_name in
               (select value
                  from v$spparameter
                 where name = 'undo_tablespace'
                   and (sid = (select instance_name from v$instance) or
                       sid = '*'))
         group by tablespace_name) b
 where a.tablespace_name (+)= b.tablespace_name
/
2、回滚表空间中大部分都是ACTIVE extent的情况
   a.查询是哪些session引起,用“二十”中提供的SQL
   b.临时新增undo数据文件解决
   c.事后根据查找到的session对提交应用侧修改程序。个人引起则加强培训 
3、回滚表空间中大部分都是UNEXPIRED extent的情况
   a.减小undo_retention值
b.如果undo_retention的值正常,则新增undo数据文件,加大undo表空间 
  回滚表空间使用情况正常
a.查看undo相关的隐含参数是否设置正确。

“gc buffer busy”问题
现象描述:
    环境:SunOS 5.9(64bit, sparc)+RAC+oracle 10.2.0.3
    场景:话务性能库不断报出 gc buffer busy ,系统资源消耗较高。

影响因素:
    以下几点可导致此事件:
    A、Hot Blocks;
    B、低效率的查询;

解决方法:
    1、查询事件相关用户,sql
    select sid,username,machine,program,p1raw,sql_id,logon_time,last_call_et from v$session where event='gc buffer busy';

    2、根据sql_id,username查询出sql,分析执行效率,与厂商协商解决。
select sql_text from v$session from v$sqlarea where sql_id = 'xx';

资源消耗类
高资源消耗进程应急处理
现象描述:
某个oracle process  CPU使用率非常高。 
某个oracle process  MEM使用率非常高。

影响因素:
暂无

解决方法:
1、使用TOPAS观察哪个进程CPU使用率高,找出相关进程号,通过以下命令定位数据库SID号. 
Select sid,sql_id,event,status from v$session where paddr in (select addr from v$process where spid=&进程号);
2、使用以下命令查看oracle会话使用内存超过100M的用户
set line 180
col MACHINE for a10
col PROGRAM for a25
col USERNAME for a15
select s.sid, s.serial#, s.username, s.machine, s.program,s.process, s.sql_id, p.pga_alloc_mem/1048576 size_m, p.spid
 from v$session s, v$process p where s.paddr=p.addr 
 and p.pga_alloc_mem>104857600 order by 7 desc;

3、对相关进程和会话进行分析,决定是否kill.

IO非常高
现象描述:
数据库登陆缓慢,或者根本不可用,无法登陆数据库进行查询等操作。表空间满或者文件系统满了(一般情况下不会发生,因为我们有监控告警)。这里主要是针对异常sql引起数据库hang的情况

影响因素:
分析IO高的原因,例如:
A、大量的并行;
B、长事务;
C、物理读高


解决方法:
在操作系统使用命令: ps -ef|grep LOCAL=NO |awk '{print $2}' |xargs kill -9
kill所有非本地进程,然后检查系统资源状态,检查数据库状态

PGA使用过大
现象描述:
影响SQL执行的效率

影响因素:
PGA使用过大

解决方法:
1、查询当前PGA使用大小:
select sum(pga_alloc_mem)/1048576/1024 size_gb from v$process ;
 
2.查询使用PGA较大的具体进程
例如以下语句可以查出具体占用内存大于100m的进程信息:(例如)
set line 180
col MACHINE for a10
col PROGRAM for a25
col USERNAME for a15
select s.sid, s.serial#, s.username, s.machine, s.program,s.process, s.sql_id, p.pga_alloc_mem/1048576 size_m, p.spid
 from v$session s, v$process p where s.paddr=p.addr 
 and p.pga_alloc_mem>104857600 order by 7 desc;

3.咨询开发商是否可以删除语句
alter system kill session 'sid,serial#';

CPU使用过高应急处理
现象描述:
CPU中 usr%使用率达到90以上

影响因素:
CPU使用过高,一般表现在以下几点:
A、不良SQL造成的大量等待事件
B、大量的短连接造成CPU负载高。
C、BUG引起

解决方法:
1、当CPU出现高负载的时候,首先我们要检查当前的数据库里是否有大量异常等待,例如:latch free, library cache lock/pin 等待事件。
select event,count(*),wait _class from v$session group by event,wait_class order by 2;
如果有,根据相关等待事件分析问题。也可以通过HANG分析,进行阻塞源头会话定位。
2、当CPU出现高负载的时候,检查发现当前数据库并无任何异常等待事件,我们就要参考平时的CPU使用率指标,然后通过会话、事务量来衡量。
3、当CPU出现高负载的时候,检查发现当前数据库并无任何异常等待事件,当前活动SQL语句与平时差别很大,我们可以关闭监听,检查是否由于连接造成的。

大表索引被删除导致CPU 100%的应急处理
现象描述:

CPU使用率90%以上

影响因素:

大表上索引被删除,部分SQL全表扫描导致资源集聚消耗。

解决方法:
1、查找某个实例上等待session的信息,定位低效SQL:
select to_char(a.logon_time,'yyyy-mm-dd hh24:mi') logon_time,
       a.sql_id,
       a.event,
       a.username,
       a.osuser,
       a.process,
       a.machine,
       a.program,a.module,
       b.sql_text,
       b.LAST_LOAD_TIME,
       to_char(b.last_active_time,'yyyy-mm-dd hh24:mi:ss') last_active_time,
       c.owner,c.object_name,
       a.last_call_et,
       a.sid,a.SQL_CHILD_NUMBER,
       c.object_type,p.PGA_ALLOC_MEM,a.p1,a.p2,a.p3,
       'kill -9 '||p.spid killstr
  from v$session a, v$sql b, dba_objects c,v$process p
 where a.wait_class <> 'Idle' and a.status='ACTIVE' and p.addr=a.paddr
   and a.sql_id = b.sql_id(+) 
   and a.sql_child_number = b.CHILD_NUMBER(+)
   and a.row_wait_obj# = c.object_id(+)
   and a.type='USER'
 order by a.sql_id,a.event;
2、非rac环境 
a.部分大表索引删除,导致全表扫面,cpu 100%
   b.此时数据库基本处于hang状态,应用已经无法响应
   c.停止相关应用,kill掉这些等待session, 新建索引(parallel nologging)
   d.如果无法停止应用,停止数据库的监听,kill掉等待session,新建索引(parallel nologging)
3、rac环境 
a.部分大表索引删除,导致全表扫面,cpu 100%
   b.此时该节点基本处于hang状态,应用已经无法响应
   c.停止相关应用,kill掉这些等待session, 新建索引(parallel nologging)
   d.如果无法停止应用,停止所有节点的监听,kill掉等待session,新建索引(parallel nologging)

网络连接类
连接不上数据库
现象描述:
数据库无法连接

影响因素:
客户报连接不上数据库,例如:
1、连接数达到上限;
2、监听有问题;

解决方法:
1、看看连接数
show parameter session;
select count(*) from v$session;
若我们用sqlplus / as sysdba也无法连接,则先KILL掉几个LOCAL=NO的会话,然后再进去分析是哪个模块的连接较多,然后通知开发商处理
ps -ef | grep LOCAL=NO  --找出PID,KILL掉几个
select machine,program,count(*) 
from v$session group by machine,program order by 3;  --找出较多的模块

2、查看监听
lsnrctl status
看看状态是不是ready,或者reload一次,看看故障是否能恢复

客户端不定时断开连接
现象描述:
    环境:Aix+RAC+ORACLE 11.2.0.2.0
    现象:PL/SQL等开发工具连接数据库后,会不定时的断开连接,断开后界面无反应,经过长时间才能重连,影响开发工作。根据现场观察到的故障现象:
    1、检查数据库的各项相关设置,包括系统超时限制、用户资源限制和网络超时限制等方面,均未发现异常。
    2、在不同网段进行模拟,发现所有网段均有断开连接现象发生。
    3、经过长时间和全方面的模拟测试,发现断开规律为idle超过10分钟的数据库连接会被自动断开。

影响因素:
    一般情况下,为网络、防火墙策略限制.

解决方法:
    重新修改网管防火墙相关限制项。

通过监听无法连接数据库
现象描述:
    环境:Redhat+RAC+ORACLE 11.2.0.1.0
    现象:数据库工作状态正常,监听器工作状态也正常。并且,监听服务也已经注册了。但即使在服务器本地,通过监听无法访问数据库。通过tns访问数据库时,总是报lost connect的错误信息。直接登陆时没有问题。

现象分析:
    这个问题可能是oracle的一个bug,在排除了常用的解决办法办法之后,可以考虑修改$ORACLE_HOME/bin/oracle文件的权限。
    但这个问题在许多数据库并无法重现,在遇到这样的问题时,可以偿试这样解决一下。

解决方法:
    将$ORACLE_HOME/bin/oracle的权限更改为6571

空间管理类
表空间故障应急处理
现象描述:
场景一:在RAC环境下进行表空间扩容(添加数据文件)时,只在一个节点上对数据文件建立了软连接,另一个节点没有建立软连接。

场景二:在RAC环境下进行表空间扩容(添加数据文件)时,两个节点都没有建立软连接,只在一个节点的本地文件系统添加了数据文件,或者添加数据文件时有空格等特殊字符

场景三:不小心将其他环境的裸设备加到到当前的环境中。(绝不允许出现此类错误)


影响因素:
一般情况下,都属于人为错误.

解决方法:
(场景一)解决方法:
1、 将两个节点数据文件改为离线状态
alter database datafile 'XXX' offline;
2、 在问题节点对数据文件建立软连接
ln -s 裸设备 数据文件
3、 在问题节点恢复数据文件
recover datafile 'XXX';
4、 将数据文件改为在线状态
alter database datafile 'XXX' online;
5、 确认数据库告警日志无报错。

(场景二)解决方法:
1、 将问题节点数据文件改为离线状态
alter database datafile 'XXX' offline;
2、 在各节点对数据文件建立软连接
ln -s 裸设备 数据文件
3、 通过ALTER DATABASE CREATE DATAFILE ‘源文件’ AS ‘目标文件’;  
copy数据文件至目标位置
ALTER DATABASE CREATE DATAFILE '源文件' AS '目标文件';
4、 恢复数据文件
recover datafile '目标文件';
5、 将数据文件改为在线状态
alter database datafile '目标文件' online;
6、 将错误的本地数据文件移到其他路径,避免“/oracle”文件系统使用比率达到告警值。
7、 确认数据库告警日志无报错。

(场景三)解决方法:
1、 除了恢复,没有太好的方法。需要备份、归档都在。

SYSAUX表空间爆满没有存储扩容应急处理
现象描述:
如果SYSAUX 表空间不可用时,数据库的核心功能还是可以继续运行的。只是一些存放在SYSAUX表空间里的功能收到限制,比如OEM。

影响因素:
一般包含以下几种:
A、业务表被放在SYSAUX表空间
B、一些辅助表的数据量太大

解决方法:
检查SYSAUX中的对象,是哪个对象占用了大量空间.检查时业务表还是辅助表,确认该对象是否可以清理.
col segment_name format a30
col segment_type format a30
set linesize 300
select OWNER,SEGMENT_NAME,SEGMENT_TYPE,BYTES/1024/1024/1024 GB 
from dba_segments
where TABLESPACE_NAME='SYSAUX'
order by 4;

文件系统使用率达到或超过95%应急处理
现象描述:
使用df 命令查看文件系统使用率达到95%

影响因素:
备份文件、dump文件、trace文件等大量产生造成.

解决方法:
检查相关文件系统下面的文件大小:
例如:查看/u01目录下每个子目录的大小
du -sh /u01/* 
*/

根据需求进行清理.

临时表空间过度事件应急处理
现象描述:
临时表空间使用过度,需要使用临时表空间的SQL运行缓慢。

影响因素:
一般包含以下几种:
1、部分SQL大量使用临时段

解决方法:
1、查找单节点temp表空间使用情况的SQL:
SELECT A.tablespace_name tablespace,
       D.mb_total,
       SUM(A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
       D.mb_total - SUM(A.used_blocks * D.block_size) / 1024 / 1024 mb_free
  FROM v$sort_segment A,
       (SELECT B.name, C.block_size, SUM(C.bytes) / 1024 / 1024 mb_total
          FROM v$tablespace B, v$tempfile C
         WHERE B.ts# = C.ts#
         GROUP BY B.name, C.block_size) D
 WHERE A.tablespace_name = D.name
 GROUP by A.tablespace_name, D.mb_total;

2、查询session使用temp段的情况:
   SELECT S.sid || ',' || S.serial# sid_serial,
       S.username,
       S.osuser,
       P.spid,
       S.module,
       S.program,
       s.sql_id
       SUM(T.blocks) * TBS.block_size / 1024  mb_used,
       T.tablespace,
       COUNT(*) sort_ops
  FROM v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
 WHERE T.session_addr = S.saddr
   AND S.paddr = P.addr
   AND T.tablespace = TBS.tablespace_name
 GROUP BY S.sid,
          S.serial#,
          S.username,
          S.osuser,
          P.spid,
          S.module,
          S.program,
          TBS.block_size,
          T.tablespace
 ORDER BY sid_serial;

3、 如果是某些session使用temp段过度引起
a. 联系应用停止相关程序 or kill掉这些session
4、 如果session使用temp情况都属正常情况  
b. 加大临时表空间

undo表空间无法自动扩展
现象描述:
环境:Aix+RAC+oracle 10.2.0.3.0
场景:数据库节点一,后台alter日志报:ORA-1628: max # extents  reached for rollback segment错误信息,使数据库的调度任务无法完成。

影响因素:
回滚段的maxextens数达到参数设置的最大值,造成不能分配下一个extent

解决方法
1.新建立一个表空间undo2,修改节点1的undo表空间为undo2后问题排除。
2.修改增大undo的maxextents参数值

undo表空间无法扩展
现象描述:
环境:Linux+ oracle 11.2.0.1.0
场景:在向数据库插入一条记录时,数据库频繁出现ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'的报错信息,无法插入记录。

影响因素:
产生该错误,通常是由于当前的UNDO表空间很小,并且在同时有一个很大的事务存在。并且,在Oracle看来,这种提示并不是一种异常。因此,您无法在该ORA报错的同时在alert文件中看到相关的信息,你只能通过相应的trace文件来看到这类的信息。
    当数据库产生上述信息时,在alert中会留下这样的信息:
    kdidelleafblks -- encountered error 30036. See trace file for details
    相应的trace文件中,会有这样的描述:
ORA-30036 DIAGNOSTIC 
   This diagnostic information is dumped to trace file at 
   most once every 24 hours, it does not indicate any error.
************************************************************
ORA-30036 happens when trying to extend undo segment _SYSSMU12_710107609$ (usn=12) by 8 blocks
Reason: Cannot Wrap, Fail to Steal
Current undo tablespace UNDOTBS1 (tsn=2)
undo tablespace current size 262144 blks, maxsize 262144 blks, fixed sized
Undo Retention (reactive):568, Max Query Length:1383
Parameter Undo Retention:900, Tuned Undo Retention:568, High threshold Undo Retention:-2 autotune:1
Retention Guarantee FALSE
Current Time is 1351615156
    同时,在该trace文件的Info about Undo Segments in this undo tablespace信息列表中,将会很容易找到当前存在的大事务。如:
  Undo Segment 1: HW Ext=2, 1st Active Ext=-1, Total Extents=3
  Extent Info of Undo Segment 1
  ExtID    Status     Size        CmtTime 
  ========================================
     0     Active        7      1351614703
     1     Active        8      1351614760
     2   Unexpired     128      1351614760
     2   Unexp wmql    128      1351614760
  ========================================
_SYSSMU1_2861643892$ (usn 1) is INUSE (act=16, une=128, exp=0)
(unewmql=128, expwmql=0)
    
解决方法:
    1、通过分析上述trace文件,可以找到当前存在的大事务,对该事务进行适当分解,减少对UNDO表空间的资源需求量。
    2、增大UNDO表空间的大小。

紧急措施:
    1、增大UNDO表空间

数据库恢复类
CRS资源异常类
RAC数据库CRS无法正常启动
现象描述:
CRS集群堆栈无法正常启动,CRSCTL STAT RES -T命令无法正常输出。

影响因素:
影响crs正常启动的因素较多,不能正常启动,数据库集群无法使用。但检查crs各项配置均正常。

解决方法:
检查crs alert日志,alert日志位置为$ORACLE_HOME/log/alert_homename.log。

VIP资源DOWN异常处理
现象描述:
环境:AIX+ oracle 11.2.0.3.0
CRS集群在运行过程中VIP资源DOWN,通过crsctl stat res -t 命令查看资源状态时VIP资源状态为OFFLINE

影响因素:
BUG1458429导致VIP出现异常。

解决方法:
1.应急情况下可以通过手动启动VIP资源如:
crsctl start res oggvip5
crsctl start res oggvip7
crsctl start res oggvip9
crsctl start res oggvip11
crsctl start res oggvip13
2.通过升级集群到11.2.0.4版本解决问题
数据库HANG类
数据库HANG异常处理
现象描述:
数据库无法登陆

影响因素:
A、大量异常阻塞
B、资源耗尽

解决方法:
1.进行HANG分析,查找顶级阻塞的会话。

全局的HANG分析:
oradebug setmypid (oradebug setospid 3188)
oradebug unlimit
oradebug setinst all
oradebug -g def hanganalyze 3
oradebug tracefile_name

2.紧急情况下,在操作系统使用命令: 
ps -ef|grep LOCAL=NO |awk '{print $2}' | xargs kill -9
kill所有非本地进程,然后检查系统资源状态,检查数据库状态

数据库CRASH类
实例CRASH应急处理
现象描述:
RAC环境单节点crash ,RAC环境所有节点crash

影响因素:
暂无,CRASH问题涉及到的问题比较复杂,以后将逐步更新。

解决方法:
遇到实例crash之后,首先看是否能重启启动:
1、能重新启动的情况下,知会相关领导, 事后分析重启原因。
2、不能重启的情况下:
    A、RAC之单节点无法重启,通知相关领导, 评估正常节点负载,应用切换至正常节点。相关技术人员进行故障处理。
    B、RAC之全节点无法重启,通知相关领导, 考虑是否切换应急库。相关技术人员进行故障处理。

应用操作类
SQL执行计划变化应急处理
现象描述:
一个SQL的执行计划的不稳定,

影响因素:
常见原因包含以下两种:
1、统计信息的变化
2、SQL语句的变化

解决方法:
1、通过SQL_ID确认统计信息是否一致 (该语句会将AWR中所有的信息查找出来)
set lines 155
col execs for 999,999,999
col avg_etime for 999,999.999
col avg_lio for 999,999,999.9
col begin_interval_time for a30
col node for 99999
break on plan_hash_value on startup_time skip 1
select ss.snap_id,
       ss.instance_number node,
       begin_interval_time,
       sql_id,
       plan_hash_value,
       nvl(executions_delta, 0) execs,
       (elapsed_time_delta /
       decode(nvl(executions_delta, 0), 0, 1, executions_delta)) / 1000000 avg_etime,
       (buffer_gets_delta /
       decode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta)) avg_lio,
       (disk_reads_delta /
       decode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta)) avg_pio
  from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
 where sql_id = nvl('&sql_id', '4dqs2k5tynk61')
   and ss.snap_id = S.snap_id
   and ss.instance_number = S.instance_number
   and s.instance_number like nvl('&instance_number', s.instance_number)
   and executions_delta > 0
 order by 1, 2, 3
/

2、如果不一致,我们需要检查统计信息是否最新,如果统计信息更新时间比当前时间有些遥远,收集统计信息。

3、如果统计信息正常,我们需要确认数据量是否有大量增加。

4、如果数据量增加的情况下,我们就要考虑清理数据或SQL优化。
使用绑定变量SQL突然运行缓慢的应急处理
现象描述:
一个session可能一某种方式变的非常消耗CPU,并且没有任何有意义的wait event. SQL的执行计划没有改变过

影响因素:
一般包含以下几种:
1、 SQL代入的绑定变量值极端
2、 等待的块有问题

解决方法:
1、 查看SQL的执行计划,及等待事件。
2、 等待事件是否正常,如果为块等待,则可以采样等待的块,通过采样的块,定位对应的表和索引,进行分析。
3、 使用errorstack定位这个SQL的绑定变量值进行分析。

其他分类
升级PSU系统报错
现象描述:
在打补丁的过程中,出现如下的报错信息:
Running prerequisite checks...
Prerequisite check "CheckActiveFilesAndExecutables" failed.
The details are:

Following executables are active :
/oracle/app/oracle/product/10.2.0/bin/tnslsnr
UtilSession failed: Prerequisite check "CheckActiveFilesAndExecutables" failed.

OPatch failed with error code 73 

影响因素:
    通过日志可以发现,导致当前升级PSU出错的原因是当前的监听器没有关闭。因此,当务之急,是将监听手工关闭。
    但事实上,在出现上述错误之前,工程已经将监听关闭了。但由于该PSU只跟数据库相关,与集群没有关系。因此,他在升级该PSU时,只是通过CRS关闭了监听,过了一段时间以后,监群又自动将监听拉起来了,这就导致升级PSU时,监听仍然是ACTIVE状态。
因而,在升级补丁或PSU时,需要通过lsnrctl stop的方式关闭监听器。

解决方法:
通过lsnrctl stop的方式关闭监听器。

数据库在执行过程中使用动态采样
现象描述:
    一个SQL在执行过程中异常缓慢,通过查看其执行计划发现,该SQL在执行过程中使用动态采样。
Note
-----
   - dynamic sampling used for this statement

现象分析:
    动态采样本身是Oracle的一个特性,用于在没有统计信息的情况下,自动收集相关表的统计信息。但在某些情况下,他仍然使用动态采样,并进而导致执行效率低下。

解决方法:
1、通过hint禁用动态采样。/*+dynamic_sampling(t 0) */
    2、这是Oracle的一个bug,请打补丁9272549。

通过srvctl查看数据库的状态时反应缓慢
现象描述:
    数据库状态正常,但在执行"srvctl status database -d db1"时,其节点一需要很长时间才能出结果,节点二正常。查看alert日志,也并未发现有告警的信息。

现象分析:
    通过类似的命令查看或启动某个资源时,由于并无相应的日志,因此给我们的判断带来一些麻烦。解决此类问题,我们可以采用跟踪的办法来分析其内部的相应过程。

解决方法:
1、strace -frT -o /tmp/strace2.log srvctl status database -d db1,根据其生成的trace文件分析内部过程,并解决。
2、使用sh -x shell.sh的方式去debug命令的执行过程,发现问题。
3、使用truss等命令进行时间分析。

修改字符集 
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 2137886720 bytes
Fixed Size                  2254952 bytes
Variable Size            1207961496 bytes
Database Buffers          922746880 bytes
Redo Buffers                4923392 bytes
Database mounted.

SQL>  alter system enable restricted session;

System altered.

SQL> alter system set job_queue_processes=0;

System altered.

SQL> alter database open;

Database altered.

SQL> alter database character set ZHS16GBK;
alter database character set ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set


SQL> alter database character set internal_use ZHS16GBK;

Database altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.



SQL> startup mount
ORACLE instance started.

Total System Global Area 2137886720 bytes
Fixed Size                  2254952 bytes
Variable Size            1207961496 bytes
Database Buffers          922746880 bytes
Redo Buffers                4923392 bytes
Database mounted.
SQL> alter system set job_queue_processes=1000;

System altered.

SQL> alter database open;

Database altered.

SQL>  select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值