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


在较长时间的与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=

  1<segment owner="">   
  2  
  3And segment_name=<your index="" name="" or="" table="">   
  4  
  5GROUP BY owner,segment_name   
  6  
  7ORDER BY 3 DESC;   
  8  
  9  
 10  
 114、 查看数据库中的表锁   
 12  
 13A、 脚本说明:   
 14  
 15这方面的语句的样式是很多的,各式一样,不过我认为这个是最实用的,不信你就用一下,无需多说,锁是每个DBA一定都涉及过的内容,当你相知道某个表被哪个session锁定了,你就用到了这个脚本。   
 16  
 17B、脚本原文:   
 18  
 19SELECT A.OWNER,   
 20  
 21A.OBJECT_NAME,   
 22  
 23B.XIDUSN,   
 24  
 25B.XIDSLOT,   
 26  
 27B.XIDSQN,   
 28  
 29B.SESSION_ID,   
 30  
 31B.ORACLE_USERNAME,   
 32  
 33B.OS_USER_NAME,   
 34  
 35B.PROCESS,   
 36  
 37B.LOCKED_MODE,   
 38  
 39C.MACHINE,   
 40  
 41C.STATUS,   
 42  
 43C.SERVER,   
 44  
 45C.SID,   
 46  
 47C.SERIAL#,   
 48  
 49C.PROGRAM   
 50  
 51FROM ALL_OBJECTS A,   
 52  
 53V$LOCKED_OBJECT B,   
 54  
 55SYS.GV_$SESSION C   
 56  
 57WHERE ( A.OBJECT_ID = B.OBJECT_ID )   
 58  
 59AND (B.PROCESS = C.PROCESS )   
 60  
 61\-- AND   
 62  
 63ORDER BY 1,2 ;   
 64  
 65  
 66  
 675、 处理存储过程被锁   
 68  
 69A、 脚本说明:   
 70  
 71实际过程中可能你要重新编译某个存储过程理总是处于等待状态,最后会报无法锁定对象,这时你就可以用这个脚本找到锁定过程的那个sid,需要注意的是查v$access这个视图本来就很慢,需要一些布耐心。   
 72  
 73B、脚本原文:   
 74  
 75SELECT * FROM V$ACCESS   
 76  
 77WHERE owner=<object owner="">   
 78  
 79And object<procedure name="">   
 80  
 81  
 82  
 836、 查看回滚段状态   
 84  
 85A、 脚本说明   
 86  
 87这也是DBA经常使用的脚本,因为回滚段是online还是full是他们的关怀之列嘛   
 88  
 89B、SELECT a.segment_name,b.status   
 90  
 91FROM Dba_Rollback_Segs a,   
 92  
 93v$rollstat b   
 94  
 95WHERE a.segment_id=b.usn   
 96  
 97ORDER BY 2   
 98  
 99  
100  
1017、 看哪些session正在使用哪些回滚段   
102  
103A、 脚本说明:   
104  
105当你发现一个回滚段处理full状态,你想使它变回online状态,这时你便会用alter rollback segment rbs_seg_name shrink,可很多时侯确shrink不回来,主要是由于某个session在用,这时你就用到了这个脚本,找到了sid的serial#余下的事就不用我说了吧。   
106  
107B、脚本原文   
108  
109SELECT r.name 回滚段名,   
110  
111s.sid,   
112  
113s.serial#,   
114  
115s.username 用户名,   
116  
117s.status,   
118  
119t.cr_get,   
120  
121t.phy_io,   
122  
123t.used_ublk,   
124  
125t.noundo,   
126  
127substr(s.program, 1, 78) 操作程序   
128  
129FROM sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r   
130  
131WHERE t.addr = s.taddr and t.xidusn = r.usn   
132  
133\-- AND r.NAME IN ('ZHYZ_RBS')   
134  
135ORDER BY t.cr_get,t.phy_io   
136  
137  
138  
1398、 查看正在使用临时段的session   
140  
141A、 脚本说明:   
142  
143许多的时侯你在查看哪些段无法扩展时,回显的结果是临时段,或你做表空间统计时发现临段表空间的可用空间几乎为0,这时按oracle的说法是你只有重新启动数据库才能回收这部分空间。实际过程中没那么复杂,使用以下这段脚本把占用临时段的session杀掉,然后用alter tablespace temp coalesce;这个语句就把temp表空间的空间回收回来了。   
144  
145B、 脚本原文   
146  
147  
148  
149SELECT username,   
150  
151sid,   
152  
153serial#,   
154  
155sql_address,   
156  
157machine,   
158  
159program,   
160  
161tablespace,   
162  
163segtype,   
164  
165contents   
166  
167FROM v$session se,   
168  
169v$sort_usage su   
170  
171WHERE se.saddr=su.session_addr   
172  
173(待续)</procedure></object></your></segment>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus