熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

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

2022-06-13   來源: Oracle 

  在較長時間的與oracle的交往中每個DBA特別是一些大俠都有各種各樣的完成各種用途的腳本工具這樣很方便的很快捷的完成了日常的工作下面把我常用的一部分展現給大家此篇主要側重於數據庫管理這些腳本都經過嚴格測試
  
   表空間統計
  
  A  腳本說明
  
  這是我最常用的一個腳本用它可以顯示出數據庫中所有表空間的狀態如表空間的大小已使用空間使用的百分比空閒空間數及現在表空間的最大塊是多大
  
  B腳本原文:
  
  SELECT upper(ftablespace_name) 表空間名
  
  dTot_grootte_Mb 表空間大小(M)
  
  dTot_grootte_Mb ftotal_bytes 已使用空間(M)
  
  to_char(round((dTot_grootte_Mb ftotal_bytes) / dTot_grootte_Mb * )) 使用比
  
  ftotal_bytes 空閒空間(M)
  
  fmax_bytes 最大塊(M)
  
  FROM
  
  (SELECT tablespace_name
  
  round(SUM(bytes)/(*)) total_bytes
  
  round(MAX(bytes)/(*)) max_bytes
  
  FROM sysdba_free_space
  
  GROUP BY tablespace_name) f
  
  (SELECT ddtablespace_name round(SUM(ddbytes)/(*)) Tot_grootte_Mb
  
  FROM  sysdba_data_files dd
  
  GROUP BY ddtablespace_name) d
  
  WHERE dtablespace_name = ftablespace_name
  
  ORDER BY DESC;
  
   查看無法擴展的段
  
  A 腳本說明
  
  ORACLE對一個段比如表段或索引無法擴展時取決的並不是表空間中剩余的空間是多少而是取於這些剩余空間中最大的塊是否夠表比索引的NEXT值大所以有時一個表空間剩余幾個G的空閒空間在你使用時ORACLE還是提示某個表或索引無法擴展就是由於這一點這時說明空間的碎片太多了這個腳本是找出無法擴展的段的一些信息
  
  B腳本原文
  
  SELECT segment_name
  
  segment_type
  
  owner
  
  atablespace_name tablespacename
  
  initial_extent/ inital_extent(K)
  
  next_extent/ next_extent(K)
  
  pct_increase
  
  bbytes/ tablespace max free space(K)
  
  bsum_bytes/ tablespace total free space(K)
  
  FROM dba_segments a
  
  (SELECT tablespace_nameMAX(bytes) bytesSUM(bytes) sum_bytes FROM dba_free_space GROUP BY tablespace_name) b
  
  WHERE atablespace_name=btablespace_name
  
  AND next_extent>bbytes
  
  ORDER BY ;
  
   查看段(表段索引段)所使用空間的大小
  
  A 腳本說明
  
  有時你可能想知道一個表或一個索引占用多少M的空間這個腳本就是滿足你的要求的把<>中的內容替換一下就可以了
  
  B腳本原文
  
  SELECT owner
  
  segment_name
  
  SUM(bytes)//
  
  FROM dba_segments
  
  WHERE owner=<segment owner>
  
  And segment_name=<your table or index name>
  
  GROUP BY ownersegment_name
  
  ORDER BY DESC;
  
   查看數據庫中的表鎖
  
  A 腳本說明
  
  這方面的語句的樣式是很多的各式一樣不過我認為這個是最實用的不信你就用一下無需多說鎖是每個DBA一定都涉及過的內容當你相知道某個表被哪個session鎖定了你就用到了這個腳本
  
  B腳本原文
  
  SELECT AOWNER
  
  AOBJECT_NAME
  
  BXIDUSN
  
  BXIDSLOT
  
  BXIDSQN
  
  BSESSION_ID
  
  BORACLE_USERNAME
  
  BOS_USER_NAME
  
  BPROCESS
  
  BLOCKED_MODE
  
  CMACHINE
  
  CSTATUS
  
  CSERVER
  
  CSID
  
  CSERIAL#
  
  CPROGRAM
  
  FROM ALL_OBJECTS A
  
  V$LOCKED_OBJECT B
  
  SYSGV_$SESSION C
  
  WHERE ( AOBJECT_ID = BOBJECT_ID )
  
  AND (BPROCESS = CPROCESS )
  
   AND
  
  ORDER BY   ;
  
   處理存儲過程被鎖
  
  A 腳本說明
  
  實際過程中可能你要重新編譯某個存儲過程理總是處於等待狀態最後會報無法鎖定對象這時你就可以用這個腳本找到鎖定過程的那個sid需要注意的是查v$access這個視圖本來就很慢需要一些布耐心
  
  B腳本原文
  
  SELECT * FROM V$ACCESS
  
  WHERE owner=<object owner>
  
  And object<procedure name>
  
   查看回滾段狀態
  
  A 腳本說明
  
  這也是DBA經常使用的腳本因為回滾段是online還是full是他們的關懷之列嘛
  
  BSELECT asegment_namebstatus
  
  FROM Dba_Rollback_Segs a
  
  v$rollstat b
  
  WHERE asegment_id=busn
  
  ORDER BY
  
   看哪些session正在使用哪些回滾段
  
  A 腳本說明
  
  當你發現一個回滾段處理full狀態你想使它變回online狀態這時你便會用alter rollback segment rbs_seg_name shrink可很多時侯確shrink不回來主要是由於某個session在用這時你就用到了這個腳本找到了sid的serial#余下的事就不用我說了吧
  
  B腳本原文
  
  SELECT rname 回滾段名
  
  ssid
  
  sserial#
  
  susername 用戶名
  
  sstatus
  
  tcr_get
  
  tphy_io
  
  tused_ublk
  
  tnoundo
  
  substr(sprogram ) 操作程序
  
  FROM  sysv_$session ssysv_$transaction tsysv_$rollname r
  
  WHERE taddr = staddr and txidusn = rusn
  
   AND rNAME IN (ZHYZ_RBS)
  
  ORDER BY tcr_gettphy_io
  
   查看正在使用臨時段的session
  
  A 腳本說明
  
  許多的時侯你在查看哪些段無法擴展時回顯的結果是臨時段或你做表空間統計時發現臨段表空間的可用空間幾乎為這時按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 sesaddr=susession_addr
  
  (待續)
From:http://tw.wingwit.com/Article/program/Oracle/201311/18647.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.