ORACLE 常用管理指令碼

2021-04-30 03:52:26 字數 4192 閱讀 4933

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是他們的關懷之列嘛

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

Oracle 常用指令碼

查詢當前連線數 select count from v session select username,machine,program,status,count machine as 連線數量 from v session where username cotsdev group by userna...

oracle 常用指令碼

substr 取得字串中指定起始位置和長度的字串 instr 判斷其是否含有指定的字元 replace 替換字元 create table table 1 as select from table 2 where 1 0 建表只複製表結構 表新增預設值 alter table table 1 mod...

ORACLE 常用指令碼

ifelse declare v num number begin v num 100 if v num 100 then elsif v num 50 then else end if end 帶引數儲存過程 create or replace procedure delete subscribe...