免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1339 | 回复: 0

Oracle的几个重要的诊断事件 [复制链接]

论坛徽章:
0
发表于 2011-12-22 08:53 |显示全部楼层
        oracle的诊断事件很强,比较强的方式分为4大类:
1. 转储类转储oracle的一些内部结构
1、分析数据文件块,转储数据文件n 的块m
alter system dump datafile n block m
2、分析日志文件
alter system dump logfile logfilename;
3、分析控制文件的内容
alter session set events 'immediate trace name CONTROLF level 10'
4、分析所有数据文件头
alter session set events 'immediate trace name FILE_HDRS level 10'
5、分析日志文件头
alter session set events 'immediate trace name REDOHDR level 10'
6、分析系统状态,最好每10 分钟一次,做三次对比
alter session set events 'immediate trace name SYSTEMSTATE level 10'
7、分析进程状态
alter session set events 'immediate trace name PROCESSSTATE level 10'
8、分析Library Cache 的详细情况
alter session set events 'immediate trace name library_cache level 10'

2. 捕捉类:捕捉一些error事件的发生
3. 改变执行途径类:改变oracle内部代码的执行途径
       ORA-10233: skip corrupted blocks on index operations
       ORA-10231: skip corrupted blocks on _table_scans_
       ORA-10513: turn off wrap source compression  禁止smon进行事务的回滚
       ORA-10015: Undo Segment Recovery  不去恢复corrupt的回滚段
4. 跟踪类:跟踪信息以及sql调优方面
      ORA-10046: enable SQL statement timing
     ORA-10053: CBO Enable optimizer trace
-----------------------------------------------------------------------------------------------
如果在系统中,发生了较大数量的buffer busy waits,free buffer waits两个等待事件,一般是表示dbwr出现了竞争,那么可以修改如下2个参数来进行解决:
  • db_block_lru_latchs=8   该参数在9i中已经成为隐含参数,默认值为32
  • db_writer_processes=4 这个参数最大值应该是cpu的个数
---------------------------------------------------------------------------
  • 首先应该分析索引:analyze index index_a validate structure
  • 然后select *from index_stats,查看pct_userd列,如果该值<=75%,就应该重建了;改列的默认值是90%
  • 我们也可以用print_table来进行输出,这个sql是tom大师写的
----------------------------------------------------------------------------------
  • index rang scan
    • 在唯一索引上使用>=,<=,>,<等
    • 在非唯一索引上进行任何操作
    • 在组合索引上,使用了部分列,并且查询出很多行
    • 使用index range scan 有可能使sort消失
  • index full scan
    • 所需要值都能够在索引中获得
    • 取出的值是排好序的
    • 最少有一个索引列是非空的
  • index fast full scan
    • 所需要的值能够在索引中获得
    • 取出的值是随机的,非排序的
    • 可以多块读、也可以并行查询
    • 最少有一个索引列是非空的
    • 可以使用index_ffs(table index_name) Hint
--------------------------------------------------------------------------------------
v$session 表中比较常用的几个字段说明^_^

1. sid,serial#
通过sid我们可以查询与这个session相关的各种统计信息,处理信息.
a. select * from v$sesstat where sid = :sid;
查询用户相关的各种统计信息.
select a.sid,a.statistic#,b.name,a.value
from v$sesstat a,v$statname b
where a.statistic# = b.statistic#
and a.sid = :sid;

b. 查询用户相关的各种io统计信息
select * from v$sess_io where sid = :sid;

c. 查询用户想在正在打开着的游标变量.
select * from v$open_cursor where sid = :sid;

d. 查询用户当前的等待信息. 以查看当前的语句为什么这么慢/在等待什么资源.
select * from v$session_wait where sid = :sid ;

e. 查询用户在一段时间内所等待的各种事件的信息. 以了解这个session所遇到的瓶颈^_^
select * from v$session_event where sid = :sid;

f. 还有, 就是当我们想kill当前session的时候可以通过sid,serial#来处理.
alter system kill session ':sid,:serail#';

2. paddr.字段, process addr, 通过这个字段我们可以查看当前进程的相关信息, 系统进程id,操作系统用户信息等等.
select a.pid,a.spid,b.name,b.description,a.latchwait,a.latchspin,a.pga_used_mem,a.pga_alloc_mem,a.pga_freeable_mem,a.pga_max_mem
from v$process a,v$bgprocess b
where a.addr = b.paddr(+)
and a.addr = :paddr

3. command 字段, 表明当前session正在执行的语句的类型.请参考reference.

4. taddr 当前事务的地址,可以通过这个字段查看当前session正在执行的事务信息, 使用的回滚段信息等^_^
select b.name rollname,a.*
from v$transaction a,v$rollname b
where a.xidusn = b.usn
and a.addr = '585EC18C';

5. lockwait字段, 可以通过这个字段查询出当前正在等待的锁的相关信息.
select *
from v$lock
where (id1,id2) = (
        select id1,id2 from v$lock where kaddr = '57C68C48'
)

6. (sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value) 根据这两组字段, 我们可以查询到当前session正在执行的sql语句的详细信息.

select * from v$sqltext where address = :sql_address and hash_value = :sql_hash_value;

7.ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#
可以通过这几个字段查询现在正在被锁的表的相关信息.^_^
a. 首先得到被锁的的信息
select * from dba_objects where object_id = :row_wait_obj#;
b. 根据row_wait_file#可以找出对应的文件的信息.
select * from v$datafile where file# = :row_wait_file#.
c. 在根据以上四个字段构造出被锁的字段的rowid信息.
select dbms_rowid.ROWID_CREATE(1,:row_wait_obj#,:row_wait_file#,:row_wait_block#,:row_wait_row#) from dual;

8. logon_time 当前session的登录时间.
9. last_call_et  是一个很有意义的参数,他是在该SESSION下用户最后一条语句执行完毕到当前的时间,单位为秒。每次用户执行一个新的语句后,该字段复位为0,重新开始记数。我们可以通过该字段来获得一个连接用户最后一次操作数据库后的空闲时,所以通过v$session和last_call_et 可以很容易判断那些会话长期没有活动了,可以断开这样的会话,以减少资源利用。该参数每3秒钟更新一次
------------------------------------------------------------------------------------------------
监控索引的使用
我们可以通过

          alter index User.index_name monitoring usage;

          alter index User.index_name nomonitoring usage;

来打开和关闭索引的监测,通过查询视图 v$object_usage来查看我们到底有没有使用该索引。

有个问题:我打开了索引监控,可是不能怎么着,也看不到该索引的使用信息。从执行计划来看,我是明明应用了该索引的?

为什么呢?下次回答吧

--------------------------------------------------------------------------------------------
LogMiner的应用
       昨天,我们的一个数据库丢失了一些数据。我们必须以最少的时间将它找回来。方法很多,logminer恐怕是最简单的一个。毕竟,它可以避免将数据从磁带上倒来倒去。虽然在9i和10g中的flashback是那么的高效和快捷,但是logminer作为oracle的一样老法器,依然在关键时刻起着重要的作用!
       特将logminer的操作过程记录下来,备忘!
  1. 产生数据字典文件:      如果不参数字典文件,那么系统将不能确认日志中的用户、表名等信息。最终的sql_Undo列将显示的是 insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'), hextoraw('4a6f686e20446f65') 这样的句子,我们也就无从知道用户到底做了那些操作。 从这里我们也能看到,如果我们不是在原数据库服务器上进行logminer操作,也就是说,我们在另外一台数据库上进行logminer,那么我们一定要需要原数据库的数据库字典信息。换句话说,我们这一部的操作要在原数据库上进行(并且,另外一台数据库的字符集要和原数据库相同。不同版本数据库之间能否进行改操作,我没有尝试),操作命令为 :execute dbms_logmnr_d.build('shwdict.ora','c:\oracle');
    EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
  2. 指定utl_file_dir 参数:      我们要在操作logminer的数据库服务器上配置该参数。以让logminer能找到我们上一步产生的数据字典文件。   utl_file_dir = 'c:\oracle'
  3. 添加要分析的日志:          在配置完以上两个步骤后,我们就可以进行日志分析了。对于第一个需要分析的日志我们可以进行以下命令:execute dbms_logmnr.add_logfile('C:\oracle\ora92\rdbms\ARC00126.001',dbms_logmnr.new);    如果不是第一个日志文件,我们可以:execute dbms_logmnr.add_logfile('C:\oracle\ora92\rdbms\ARC00130.001',dbms_logmnr.addfile);
  4. 设置时间格式:       我们必须设置如下时间格式,否则,在进行日志分析的过程中,将报错误信息:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
  5. 分析日志:     我们可以发出以下命令,来进行日志分析了:
        dbms_logmnr.start_logmnr(
            dictfilename => 'C:\oracle\shwdict.ora',  startscn=>xxxxxx,endscn=>xxxxx,
                  starttime => to_date('20030501 12:15:00','yyyymmdd hh24:mi:ss'),
                  endtime => to_date('20030501 15:40:30','yyyymmdd hh24:mi:ss'));
        
    需要注意的,我们必须知道 dictfilename 数据字典文件; scn的大小我们可以通过v$log_history来查询,endscn最好比查询得到的最后一个scn小一个数字
  6. 查询结果:     我们可以查询v$logmnr_contents来获得日志分析结果
  7. 注意事项:     进行logminer的db的OS平台、DB的字符集必须跟原来db的一致
-------------------------------------------------------------------------------------
  • 我们可以通过这个方式来获得表,视图,或其他object的定义:

              select dbms_metadata.get_ddl('TABLE','Table_name','User_name') from dual;

  • 我一直以为initial extent 不能修改,实际上是可以的:

            alter table AA  move storage(initial 5M);

----------------------------------------------------------------------------------------

1、我们可以手工在某个数据文件上扩展extent,从而可以使数据写到该数据文件上;如果不手工扩展,那么数据将是随机的写到这些数据文件上; 

     alter table t allocate extent (datafile 'd:\oracle\oradata\demo\user01.dbf' size 20M);
  其中,20M指的是extent的大小


2、如果tablespace中的allocate_type=system,那么所有的extent扩展将由系统自动发展,不定在那个数据文件上,各个extent的大小也不确定(关于如何确定这些extent的大小的算法,oracle没有公布);如果allocate_type=auto的话,extent的扩展将均匀的分布在所有的数据文件上





您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP