在較長時間的與oracle的交往中
每個DBA特別是一些大俠都有各種各樣的完成各種用途的腳本工具
這樣很方便的很快捷的完成了日常的工作
下面把我常用的一部分展現給大家
此篇主要側重於數據庫管理
這些腳本都經過嚴格測試
表空間統計 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 *
)
)
使用比
f
total_bytes
空閒空間(M)
f
max_bytes
最大塊(M)
FROM
(SELECT tablespace_name
round(SUM(bytes)/(
*
)
) total_bytes
round(MAX(bytes)/(
*
)
) max_bytes
FROM sys
dba_free_space
GROUP BY tablespace_name) f
(SELECT dd
tablespace_name
round(SUM(dd
bytes)/(
*
)
) Tot_grootte_Mb
FROM sys
dba_data_files dd
GROUP BY dd
tablespace_name) d
WHERE d
tablespace_name = f
tablespace_name
ORDER BY
DESC;
查看無法擴展的段 A
腳本說明
ORACLE對一個段比如表段或索引無法擴展時
取決的並不是表空間中剩余的空間是多少
而是取於這些剩余空間中最大的塊是否夠表比索引的
NEXT
值大
所以有時一個表空間剩余幾個G的空閒空間
在你使用時ORACLE還是提示某個表或索引無法擴展
就是由於這一點
這時說明空間的碎片太多了
這個腳本是找出無法擴展的段的一些信息
B
腳本原文
SELECT segment_name
segment_type
owner
a
tablespace_name
tablespacename
initial_extent/
inital_extent(K)
next_extent/
next_extent(K)
pct_increase
b
bytes/
tablespace max free space(K)
b
sum_bytes/
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
;
查看段(表段索引段)所使用空間的大小 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 owner
segment_name
ORDER BY
DESC;
查看數據庫中的表鎖 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
;
處理存儲過程被鎖 A
腳本說明
實際過程中可能你要重新編譯某個存儲過程理總是處於等待狀態
最後會報無法鎖定對象
這時你就可以用這個腳本找到鎖定過程的那個sid
需要注意的是查v$access這個視圖本來就很慢
需要一些布耐心
B
腳本原文
SELECT * FROM V$ACCESS
WHERE owner=<object owner>
And object<procedure name>
查看回滾段狀態 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
看哪些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
) 操作程序
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
查看正在使用臨時段的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 se
saddr=su
session_addr
(待續)
From:http://tw.wingwit.com/Article/program/Oracle/201311/18647.html