首页 > 数据库 > Oracle > 正文

ORACLE DBA常用SQL脚本工具->管理篇(1)

2024-08-29 13:30:35
字体:
来源:转载
供稿:网友

在较长时间的与oracle的交往中,每个dba特别是一些大侠都有各种各样的完成各种用途的脚本工具,这样很方便的很快捷的完成了日常的工作,下面把我常用的一部分展现给大家,此篇主要侧重于数据库管理,这些脚本都经过严格测试。

 1、 表空间统计

 a、    脚本说明:

这是我最常用的一个脚本,用它可以显示出数据库中所有表空间的状态,如表空间的大小、已使用空间、使用的百分比、空闲空间数及现在表空间的最大块是多大。

b、脚本原文:

select upper(f.tablespace_name) "表空间名",

       d.tot_grootte_mb "表空间大小(m)",

       d.tot_grootte_mb - f.total_bytes "已使用空间(m)",

       to_char(round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb * 100,2),'990.99') "使用比",

       f.total_bytes "空闲空间(m)",

       f.max_bytes "最大块(m)"

 from     

    (select tablespace_name,

            round(sum(bytes)/(1024*1024),2) total_bytes,

            round(max(bytes)/(1024*1024),2) max_bytes

      from sys.dba_free_space

     group by tablespace_name) f,

    (select dd.tablespace_name, round(sum(dd.bytes)/(1024*1024),2) tot_grootte_mb

      from   sys.dba_data_files dd

      group by dd.tablespace_name) d

where d.tablespace_name = f.tablespace_name   

order by 4 desc;

 

2、  查看无法扩展的段

a、  脚本说明:

oracle对一个段比如表段或索引无法扩展时,取决的并不是表空间中剩余的空间是多少,而是取于这些剩余空间中最大的块是否够表比索引的“next”值大,所以有时一个表空间剩余几个g的空闲空间,在你使用时oracle还是提示某个表或索引无法扩展,就是由于这一点,这时说明空间的碎片太多了。这个脚本是找出无法扩展的段的一些信息。

b、脚本原文:

select segment_name,

             segment_type,

             owner,

             a.tablespace_name "tablespacename",

             initial_extent/1024 "inital_extent(k)",

             next_extent/1024 "next_extent(k)",

             pct_increase,

             b.bytes/1024 "tablespace max free space(k)",

             b.sum_bytes/1024 "tablespace total free space(k)"

  from dba_segments a,

       (select tablespace_name,max(bytes) bytes,sum(bytes) sum_bytes from dba_free_space group by tablespace_name) b

 where a.tablespace_name=b.tablespace_name

   and next_extent>b.bytes

 order by 4,3,1;

 

3、  查看段(表段、索引段)所使用空间的大小

a、  脚本说明:

有时你可能想知道一个表或一个索引占用多少m的空间,这个脚本就是满足你的要求的,把<>中的内容替换一下就可以了。

b、脚本原文:

select owner,

              segment_name,

              sum(bytes)/1024/1024

    from dba_segments

   where owner=<segment owner>

        and segment_name=<your table or index name>

  group by owner,segment_name

  order by 3 desc;

 

4、  查看数据库中的表锁

a、  脚本说明:

 这方面的语句的样式是很多的,各式一样,不过我认为这个是最实用的,不信你就用一下,无需多说,锁是每个dba一定都涉及过的内容,当你相知道某个表被哪个session锁定了,你就用到了这个脚本。

b、脚本原文:

  select a.owner,  

               a.object_name,  

               b.xidusn,  

              b.xidslot,  

              b.xidsqn,  

              b.session_id,  

              b.oracle_username,  

              b.os_user_name,  

              b.process,  

              b.locked_mode,  

              c.machine,  

              c.status,  

              c.server,  

              c.sid,  

              c.serial#,   

              c.program 

    from all_objects a,  

         v$locked_object b,  

         sys.gv_$session c

   where ( a.object_id = b.object_id )

     and (b.process = c.process )

   --  and 

   order by 1,2   ;  

 

5、  处理存储过程被锁

a、  脚本说明:

   实际过程中可能你要重新编译某个存储过程理总是处于等待状态,最后会报无法锁定对象,这时你就可以用这个脚本找到锁定过程的那个sid,需要注意的是查v$access这个视图本来就很慢,需要一些布耐心。

b、脚本原文:

select * from v$access

 where owner=<object owner>

and object<procedure name>

 

6、  查看回滚段状态

a、  脚本说明

这也是dba经常使用的脚本,因为回滚段是online还是full是他们的关怀之列嘛

    b、select a.segment_name,b.status

  from dba_rollback_segs a,

        v$rollstat b

        where a.segment_id=b.usn

         order by 2

        

7、  看哪些session正在使用哪些回滚段

      a、 脚本说明:

 当你发现一个回滚段处理full状态,你想使它变回online状态,这时你便会用alter rollback segment rbs_seg_name shrink,可很多时侯确shrink不回来,主要是由于某个session在用,这时你就用到了这个脚本,找到了sid的serial#余下的事就不用我说了吧。

b、脚本原文

 select  r.name 回滚段名,

  s.sid,

  s.serial#,

  s.username 用户名,

  s.status,

  t.cr_get,

  t.phy_io,

  t.used_ublk,

  t.noundo,

  substr(s.program, 1, 78) 操作程序

from   sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r

where  t.addr = s.taddr and t.xidusn = r.usn

 -- and r.name in ('zhyz_rbs')

order  by t.cr_get,t.phy_io

 

8、  查看正在使用临时段的session

           a、 脚本说明:

许多的时侯你在查看哪些段无法扩展时,回显的结果是临时段,或你做表空间统计时发现临段表空间的可用空间几乎为0,这时按oracle的说法是你只有重新启动数据库才能回收这部分空间。实际过程中没那么复杂,使用以下这段脚本把占用临时段的session杀掉,然后用alter tablespace temp coalesce;这个语句就把temp表空间的空间回收回来了。

b、 脚本原文

 

select username,

       sid,

       serial#,

       sql_address,

       machine,

       program,

       tablespace,

       segtype,

       contents

  from v$session se,

       v$sort_usage su

 where se.saddr=su.session_addr 

 (待续)

 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表