ORACLE DBA常用SQL指令碼工具->管理篇(zt)

tolywang發表於2005-01-25
              在較長時間的與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=

        And segment_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=

And object

 

6、  檢視回滾段狀態

A、  指令碼說明

這也是DBA經常使用的指令碼,因為回滾段是online還是full是他們的關懷之列嘛

    BSELECT 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在用,這時你就用到了這個指令碼,找到了sidserial#餘下的事就不用我說了吧。

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 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-84256/,如需轉載,請註明出處,否則將追究法律責任。

相關文章