本周总结

删除表空间和user时,一定要删除干净,并且要将user下的objects全部删除:

删除user

         Dropuser user_name cascade

删除表空间:

         Droptablespace tablespace_name including contents and datafiles;

使用dbms_metadata包中的get_ddl函数,可以将创建object时所有的语句显示出来,使用这个函数时,需要dual表的辅助:

Get_ddl函数的参数:

FUNCTION get_ddl ( object_type IN VARCHAR2,

 name IN VARCHAR2,

 schema IN VARCHAR2 DEFAULT NULL,

 version IN VARCHAR2 DEFAULT'COMPATIBLE',

 model IN VARCHAR2 DEFAULT 'ORACLE',

 transform. IN VARCHAR2 DEFAULT 'DDL')RETURN CLOB;

通过各个参数就可以唯一的确定一个object,将创建object的语句找出来:

本周总结

通过函数将scott用户下的emp表的创建语句完整的找出来了。

最近看到的等待事件:

1.buffer busy waits:当回话想要访问缓冲区中的数据块,而该数据块正在被其他回话使用时会产生此等待事件

2.free buffer waits:当会话需要将一个数据块读入buffer cache时,或者由于一致读创建cr块需要用到buffer cache时产生。

产生原因:

1)、低效的sql,低效的sql会访问过多的空闲缓冲区

2)、buffer cache

3)、dbwr写的慢。可以通过改善存储的性能、使用多个DBWR进程来加快DBWR进程写脏块的速度

3.gc buffer busy release:是在session 1尝试请求访问本地实例buffer是,已经有一个远程实例的session2 请求访问该buffer,并且没有完成,那么session 1就会产生 gc buffer busy release;

4.gc buffer busy acquire:是在session1请求远程访问实例buffer时,有另一个session2请求了相同的buffer,并且没有完成。

产生原因:1.热快2.低效的SQL语句3.数据交叉访问

5.enq: TX - index contention:当向一个索引插入数据时引起了索引的块分裂,此时需要等待索引快分裂结束,这种等待事件。

6.db file sequential read:(数据文件顺序读)是一种与IO读请求有福安的等待事件,将数据块读入连续的内存空间,或者读取一个索引快是会记录这个等待。

等待事件显著产生原因:可能在多表连接中,表的连接顺序存在问题,没有正确的使用驱动表;或者可能索引的使用存在问题。

7.row cache lock:是一个共享池相关的等待事件。是由于对于数据字典的访问造成的。

最具代表性的就是调用sequence,当有多个session同时调用一个sequence时,由于调用sequence会修改数据字典信息,所以当一个session开始调用时,就会产生此等待事件。

8.log file sync:当session提交时,通知lgwr写将redo buffer写到redo logfile中,写操作完成后,lgwr再通知用户写操作已完成,用户接收到已调教信息后,整个过程结束。在lgwr通知之前的等待事件为log file sync

产生原因:

事务过度的提交,即应用程序过度  commit  或者  rollback

存储  I/O  资源紧张,导致  lgwr  进程写速度缓慢

CPU  资源紧张,

lgwr 进程获得不了响应的  CPU  时间片。

AC  节点之间  SCN  同步。

RAC  节点之间  CR  块传递。

控制文件争用。

9.enq: TX - allocate ITL entryITL的设置不能够满足并发事务的需求,事物要修改块中的数据,必须获得该块中的一个itl

10.gc current block busy:是本地节点请求远程节点cache里的currentblock时产生的等待

11.enq: SQ - contention:sequencecache比较小,但是事务应用该sequence比较频繁,导致内存上的值比很快用完,这时需要修改数据字典信息,在进行应用,在此期间会产生该等待事件。

11.enq: TX - row lock contention:行锁争用

经常在工作时遇到这样的问题:数据库临时表空间使用率过大,但是当发现数据库有这个问题时,该SQL语句已经执行结束,这时可以通过查询v$active_session_history视图对历史问题进行查询:

SELECT

Sum(TEMP_SPACE_ALLOCATED/1024/1024/1024)SAMPLE_TIME,SQL_ID 

FROM V$ACTIVE_SESSION_HISTORY

                   ---dba_hist_avtive_sess_history

WHERE A.SAMPLE_TIME BETWEEN TO_DATE('时间段','YYYY-MM-DDHH24:MI:SS')

       AND TO_DATE('时间段','YYYY-MM-DDHH24:MI:SS')

    GROUP BY SAMPLE_TIME,SQL_ID

     having sum(TEMP_SPACE_ALLOCATED/1024/1024/1024)>100

     ORDER BY 1;

这种方式可以从v$active_session_history视图查询出一段时间内临时表空间的使用率。但是如果你想查询的时间段的信息已经被刷出视图,可以从dba_hist_active_sess_history视图中查询,v$ash视图中的信息每隔一段时间就会往dba_hist_ash视图中做记录,并将v$ash视图中的相关信息清空。

同样的在你得到我的数据库某一段时间内运行的慢这样的信息时,也可以从这两个视图中进行查询。查询某段时间的等待事件:

select EVENT,count(*)

from v$active_session_history

----dba_hist_active_sess_history

where SQL_EXEC_START between to_date('时间段','yyyymmddhh24:mi:ss')

and to_date('时间段','yyyymmddhh24:mi:ss')

and event is not null

group by event

order by count(*);

可以用这条SQLv$ash视图中查询出某段时间内数据库的等待事件状况,从而推断出数据库这段时间内的运行慢的原因。同样的如果查询的时间段已经被刷出v$ash视图,就可以通过dba_hist_active_sess_history视图进行查询。