Oracle dba的平常

數據庫管理員平常工做中必備的sql列表sql

 

 

--**** 數據庫實例基本狀況

 

 

--** ORACLE系統實例名字:

 

select NAME ,CREATED ,LOG_MODE ,數據庫

to_char(sysdate,'yyyy/mm/dd:HH24:MI') "SYS_DATE"c#

from v$database;緩存

 

--** ORACLE實例安裝的產品列表:

 

 

COL PARAMETER for a40安全

COL VALUE for a30session

select * from v$option;oracle

 

--** Oracle及工具 Tools 版本信息:

 

col BANNER for a60app

select BANNER from v$version;svg

 

--** Oracle實例是否歸檔:

 

select dbid, name, log_mode from v$database;工具

 

 

--** ORACLE系統用戶狀況:

 

col USERNAME for a20

col DEFAULT_TABLESPACE for a20

col TEMPORARY_TABLESPACE for a20

col PROFILE for a20

select USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE,

PROFILE,CREATED FROM dba_users;

 

--** ORACLE系統資源文件狀況:

 

col RESOURCE_NAME for a28

col LIMIT for a20

SELECT * from dba_profiles order by PROFILE;

 

--** ORACLE系統字符集狀況

 

COL VALUE$ for a40

SELECT name,value$ from sys.props$;

 

--** ORACLE數據庫鏈接的信息

 

col owner for a20

col db_link for a38

col username for a20

SELECT owner,db_link,username from dba_db_links ;

 

 

--** ORACLE數據庫用戶權限報告:

 

col Username for a20

col Owner for a14

col Obj for a20

col Obj_Priv for a10

col Sys_Priv for a20

col Granted_Role for a22

select username "Username",

owner,

table_name "Obj",

privilege "Obj_Priv",

' ' "Sys_Priv",

' ' "Granted_Role",

1 "dummy"

from dba_users u, dba_tab_privs t

where u.username = t.grantee

and u.username = upper('&&user_name')

union

select username,

' ',

' ',

' ',

privilege,

' ',

2 "dummy"

from dba_users u, dba_sys_privs s

where u.username = s.grantee

and u.username = upper('&&user_name')

union

select username,

' ',

' ',

' ',

' ',

granted_role,

3 "dummy"

from dba_users u, dba_role_privs r

where u.username = r.grantee

and u.username = upper('&&user_name')

order by 1, 7;

 

--** ORACLE實例後臺進程信息

 

col DESCRIPTION for a40

col name for a30

SELECT * from v$bgprocess;

 

--** ORACLE 系統參數狀況

 

Show parameter;

 

--** ORACLE 系統參數狀況2(9i/10g視圖)

 

COL SID for a30

COL NAME for a30

COL VALUE for a40

 

--查看數據庫的建立日期和歸檔方式:

 

Select Created, Log_Mode, Log_Mode From V$Database;

 

 

 

--** Oracle系統日誌文件與控制文件

 

 

--** 日誌文件信息1

 

SELECT GROUP# "組號",

MEMBERS "成員",

BYTES "大小(字節)",

ARCHIVED "歸檔?",

STATUS "狀態"

FROM V$LOG;

 

--** 日誌文件信息2

 

Col member for a56

SELECT * FROM V$LOGFILE;

 

--求日誌文件的空間使用

 

  select le.leseq current_log_sequence#, 100*cp.cpodr_bno/le.lesiz percentage_full
  from x$kcccp cp,x$kccle le
  where le.leseq =cp.cpodr_seq;

 

--求歸檔日誌的切換頻率(生產系統可能時間會很長)

 

  select start_recid,start_time,end_recid,end_time,minutes from (select test.*, rownum as rn
  from (select b.recid start_recid,to_char(b.first_time,'yyyy-mm-dd hh24:mi:ss') start_time,
  a.recid end_recid,to_char(a.first_time,'yyyy-mm-dd hh24:mi:ss') end_time,round(((a.first_time-b.first_time)*24)*60,2) minutes
  from v$log_history a,v$log_history b where a.recid=b.recid+1 and b.first_time > sysdate - 1
  order by a.first_time desc) test) y where y.rn < 30;

 

--** 控制文件信息

 

col "狀態" for a20

col "控制文件名" for a60

SELECT STATUS "狀態",

NAME "控制文件名"

FROM v$controlfile ;

 

--****表空間信息

 

 

--**查看錶空間狀態

 

select tablespace_name,status,extent_management,segment_space_management from dba_tablespaces;
  select table_name,freelists,freelist_groups from user_tables;

 

--**查看錶空間使用狀況

 

select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name;

 

--**檢查表空間的使用狀況

 

SELECT tablespace_name, max_m,

count_blocks free_blk_cnt, sum_free_m,

        to_char(100*sum_free_m/sum_m, '99.99') || '%' AS pct_free

        FROM ( SELECT tablespace_name,sum(bytes)/1024/1024 AS sum_m

        FROM dba_data_files GROUP BY tablespace_name),

        ( SELECT tablespace_name AS fs_ts_name, max(bytes)/1024/1024

AS max_m, count(blocks)

        AS count_blocks, sum(bytes/1024/1024)

AS sum_free_m FROM dba_free_space GROUP BY tablespace_name )

        WHERE tablespace_name = fs_ts_name order by pct_free;

 

 

--**查詢表空間的大小,分佈等信息

 

        select tablespace_name, sum ( blocks ) free_blk , trunc ( sum ( bytes ) /(1024*1024) ) free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) num_chunks from dba_free_space group by tablespace_name;

        

 

--**查看錶空間物理文件的名稱及大小

 

        select tablespace_name, file_id, file_name,

         round(bytes/(1024*1024),0) total_space

         from dba_data_files

         order by tablespace_name;

 

 

--**檢查剩餘表空間 (速度比較慢)

 

        select tablespace_name,sum(blocks) as free_blk,

            trunc(sum(bytes)/(1024*1024)) as free_m,

            max(bytes)/(1024) as big_chunk_k,

            count(*) as num_chunks

            from dba_free_space

            group by tablespace_name;     

 

--**查看全部表空間的碎片程度

 

        select tablespace_name,sum(bytes),sum(free),sum(free)*100/sum(bytes)             

            from (select

             b.file_id file_ID,

             b.tablespace_name tablespace_name,

             b.bytes Bytes,

             (b.bytes-sum(nvl(a.bytes,0))) used,

             sum(nvl(a.bytes,0)) free,

             sum(nvl(a.bytes,0))/(b.bytes)*100 Percent

             from dba_free_space a,dba_data_files b

             where a.file_id=b.file_id

             group by b.tablespace_name,b.file_id,b.bytes

             order by b.file_id)

    group by tablespace_name order by sum(free)*100/sum(bytes);    

 

--**肯定須要固定的PL/SQL對象

 

碎片化現象形成共享池中的可用空間均成爲許多零散的片斷,而沒有足夠大的連續空間,這是共享池中的廣泛現象。

較大的PL/SQL對象容易引發共享池故障,由於他們須要進入內存的時候,不容易獲得空間。

下面程序清單中的示例搜索那些所需空間大於100KB的對象(只限於目前已經在shared pool中對象)

 

select name, sharable_mem

from v$db_object_cache

where sharable_mem > 100000

and type in ('PACKAGE', 'PACKAGE BODY','FUNCTION', 'PROCEDURE')

and kept = 'NO';

 

 

--**監控表空間的 I/O 比例 ?????

 

select df.tablespace_name name,df.file_name "file",f.phyrds pyr,

f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw

from v$filestat f, dba_data_files df

where f.file# = df.file_id

order by df.tablespace_name;

 

--**求數據文件的I/O分佈

 

select df.name,phyrds,phywrts,phyblkrd,phyblkwrt,singleblkrds,readtim,writetim
  from v$filestat fs,v$dbfile df
  where fs.file#=df.file# order by df.name;

 

select SubStr(B.Name, 1, 40) Disk, C.TableSpace_Name,

A.Phyblkrd + A.Phyblkwrt Total,

A.Phyrds, A.Phywrts,A.Phyblkrd, A.Phyblkwrt,

((A.ReadTim /Decode(A.Phyrds,0,1,A.Phyblkrd))/100) Avg_Rd_Time,

((A.WriteTim / Decode(A.PhyWrts,0,1,A.PhyblkWrt)) /100) Avg_Wrt_Time

from V$FileStat A, V$DataFile B, Sys.DBA_Data_Files C

where B.File# = A.File#

and B.File# = C.File_Id

order by Disk,C.Tablespace_Name, A.File#;

 

--**監控文件系統的 I/O 比例

 

select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",

a.status, a.bytes, b.phyrds, b.phywrts

from v$datafile a, v$filestat b

where a.file# = b.file#;    

 

 

--**檢查表空間碎片1MB以上

 

select tablespace_name "表空間" ,

         count(*) "分佈在", sum(bytes) "自由空間(Mb)"

        from dba_free_space

         where bytes>100000 group by tablespace_name;

 

--**表空間的自由空間狀況

 

select f.tablespace_name "TABLESPACE_NAME",

        decode(d.extent_management,'DICTIONARY','DICT','LOCAL') " TABS_TYPE ",

        trunc(sum(f.bytes/1024000),2 ) || 'MB' "FREE_MB",

        max(f.bytes) "MAX_BYTES",

        avg(f.bytes) " AVG_BYTES ",count(f.tablespace_name) " COUNT "

        from dba_free_space f, dba_tablespaces d

        where f.tablespace_name = d.tablespace_name

        group by f.tablespace_name ,d.extent_management;

 

--**表空間使用率

 

select A.tablespace_name,(1-(A.total)/B.total)*100 used_percent from (select tablespace_name,sum(bytes) total

        from dba_free_space group by tablespace_name) A,

        (select tablespace_name,sum(bytes) total from dba_data_files

        group by tablespace_name) B

        where A.tablespace_name=B.tablespace_name;

 

--**是否存在空間沒法擴展的狀況(時間長)

 

select segment_name "段名", segment_type "段類型",

         owner "段全部者", a.tablespace_name "表空間名",

          Initial_extent "初始擴展", next_extent "下次", pct_increase "增漲",

         b.bytes "最大字節"

         from dba_segments a,

         ( select tablespace_name, max(bytes) bytes from dba_free_space

         group by tablespace_name ) b

         where a.tablespace_name=b.tablespace_name and next_extent > b.bytes ;

 

 

--**檢查是否存在須要合併的表空間

 

select f.tablespace_name "表空間",

        trunc(sum(f.bytes/1024000),2 ) || 'MB' "自由空間",

        min(f.bytes) "最小字節", MAX(f.bytes) "最大字節",

        avg(f.bytes) "平均字節",COUNT(f.tablespace_name) "分佈在"

        from dba_free_space f, dba_tablespaces d

        where f.tablespace_name = d.tablespace_name

        having count(f.tablespace_name) >1

        group by f.tablespace_name ,d.extent_management ;

 

--**檢查自由表空間接近10%的狀況(時間長):

 

col "表空間" for a18

col "文件名" for a50

col "總空間(Mb)" for 999,999,999,999

col "自由空間(Mb)" for 999,999,999,999

col "自由空間%" for 9999.99

SELECT a.tablespace_name "表空間",

a.file_name "文件名",

a.avail "總空間(Mb)",

nvl(b.free,0) "自由空間(Mb)",

nvl(round(((free/avail)*100),2),0) "自由空間%"

from (select tablespace_name, substr(file_name,1,45) file_name,

file_id, round(sum(bytes/(1024*1024)),3) avail

from sys.dba_data_files

group by tablespace_name, substr(file_name,1,45),

file_id) a,

(select tablespace_name, file_id,

round(sum(bytes/(1024*1024)),3) free

from sys.dba_free_space

group by tablespace_name, file_id) b

where a.file_id = b.file_id (+)

order by 1, 2 ;

 

--**求表空間的未用空間

 

col mbytes format 9999.9999
  select tablespace_name,sum(bytes)/1024/1024 mbytes from dba_free_space group by tablespace_name;

 

 

--** **回滾段使用狀況 :

 

/* WAITS 在理想下,等待值應該是 0;GETS 是對回滾段訪問次數;

若是等待值大於0,則確定存在爭用,能夠在建立一些新的回滾段。

若是 ratio > 2 ,則有競爭,應創建更多的回滾段 */

col "獲得" for 999,999,999

col "回滾段" for a16

col "比率" for 99.99

col "等待" for 999,999

SELECT rn.name "回滾段" , rs.gets "獲得",

rs.waits "等待" ,

(rs.waits/rs.gets)*100 "比率"

from v$rollstat rs, v$rollname rn

where rs.usn=rn.usn ;

 

V$ROLLSTAT中的經常使用列
USN:回滾段標識
RSSIZE:回滾段默認大小
XACTS:活動事務數

在一段時間內增量用到的列
WRITES:回滾段寫入數(單位:bytes)
SHRINKS:回滾段收縮次數
EXTENDS:回滾段擴展次數
WRAPS:回滾段翻轉(wrap)次數
GETS:獲取回滾段頭次數
WAITS:回滾段頭等待次數

 

 

--**系統回滾段使用統計狀況1:

 

col USN for 999

col NAME for a18

col EXTENTS for 999

col RSSIZE for 999,999,999,999

col WRITES for 999

col XACTS for 9999

col GETS for 999

col WAITS for 999

col HWMSIZE for 999,999,999,999

col OPTSIZE for 999,999,999

col STATUS for a10

Set linesize 150

Select a.usn, name, extents, rssize, optsize, hwmsize,waits,status

From v$rollstat a , v$rollname b

Where a.usn=b.usn order by a.usn;

 

SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status

FROM v$rollname n, v$rollstat s

WHERE n.usn = s.usn;

 

 

 

--** 系統回滾段使用統計狀況2:

 

Column Class Format A20 Heading 'Header Type'

Column Count Format 999,999,999 Heading 'Number |of waits'

Column Con_Get Format 999,999,999,999 Heading 'Logical| Reads'

Column Pct Format 990.99 Heading 'Pct of |Contention'

Column Instance New_Value _Instance NoPrint

Column Today New_Value _Date NoPrint

 

Define Wait_Ratio = 1 (Number)

 

Select A.Class, Count, Sum(Value) Con_Get, ((Count / Sum(Value)) * 100) pct

From V$WaitStat A, V$SysStat B

Where Name In ('db block gets', 'consistent gets')

Group by A.Class, Count;

 

Column Name Format A30

Column Gets Format 999,999,999 Heading 'Number of|Activities'

Column Waits Format 999,999,999 Heading 'Number|of Waits'

Column Pct Format 990.99 Heading 'Pct of|Gets'

 

Select Name, Gets, Waits, ((Waits / Gets) * 100) Pct

From V$RollStat A, V$RollName B

Where A.USN = B.USN;

 

--**查看回滾段的使用狀況,哪一個用戶正在使用回滾段的資源

 

select s.username, u.name

from v$transaction t, v$rollstat r, v$rollname u, v$session s

where s.taddr = t.addr

and t.xidusn = r.usn

and r.usn = u.usn

order by s.username;

 

 

--** 檢查undo表空間狀況:

 

Select to_char(begin_time,'yyyy.mm.dd hh24:mi:ss'),

to_char(end_time,'yyyy.mm.dd hh24:mi:ss'), undoblks,

txncount, maxquerylen from v$undostat;

 

 

--** 查詢undo表空間信息:

 

SELECT (rd * (ups * overhead) + overhead) AS "Bytes"

FROM

(SELECT value AS RD

FROM v$parameter

WHERE name = 'undo_retention'),

(SELECT (SUM(undoblks) /

SUM( ((end_time - begin_time) * 86400)))

AS UPS

FROM v$undostat),

(SELECT value AS overhead

FROM v$parameter

WHERE name = 'db_block_size');

--** 查詢事務在Undo空間中執行的時間:

col "用撤消塊數" for 999,999,999,999

col "事務執行塊數" for 999,999,999,999

col "查詢最長秒" for 99,999,999

col "ORA-01555次數" for 999,999

col "無可用空間數" for 999,999

select TO_CHAR(MIN(Begin_Time),'DD HH24:MI:SS') "開始時間",

TO_CHAR(MAX(End_Time),'DD HH24:MI:SS') "結束時間",

SUM(Undoblks) "用撤消塊數",

SUM(Txncount) "事務執行塊數",

MAX(Maxquerylen) "查詢最長秒",

MAX(Maxconcurrency) "最高事務數",

SUM(Ssolderrcnt) "ORA-01555次數",

SUM(Nospaceerrcnt) "無可用空間數"

from V$UNDOSTAT;

-- ORA-01555次數出現,可減小UNDO_RETENTION

 

 

--**V$WAITSTAT視圖能夠被用來肯定每一個回滾段數據塊的等待狀況

SELECT class, count

FROM V$WAITSTAT

WHERE class LIKE '%undo%'

AND COUNT > 0;

 

--**.V$SYSSTAT視圖能夠肯定總的數據請求的數量:

 

SELECT SUM(value) "DATA REQUESTS"

FROM V$SYSSTAT

WHERE name IN ('db block gets', 'consistent gets');

 

--**.DBA_ROLLBACK_SEGS視圖能夠肯定回滾段的存儲信息和狀態等等信息:

 

COL segment_name for a20

SELECT segment_name, owner, tablespace_name, status,

initial_extent, next_extent

FROM DBA_ROLLBACK_SEGS;

 

 

--**.V$TRANSACTION視圖能夠肯定每一個事務使用Undo空間的數量:

 

SELECT MAX(used_ublk) FROM V$TRANSACTION;

 

 

--**查看回滾段的爭用狀況

 

select name, waits, gets, waits/gets "Ratio"

from v$rollstat a, v$rollname b

where a.usn = b.usn;

    

 

--**查看回滾段名稱及大小

 

select segment_name, tablespace_name, r.status,

     (initial_extent/1024) InitialExtent,(next_extent/1024)

        NextExtent,

     max_extents, v.curext CurExtent

     From dba_rollback_segs r, v$rollstat v

     Where r.segment_id = v.usn(+)

     order by segment_name ;

 

--**求回滾段正在處理的事務

 

  select a.name,b.xacts,c.sid,c.serial#,d.sql_text
  from v$rollname a,v$rollstat b,v$session c,v$sqltext d,v$transaction e
  where a.usn=b.usn and b.usn=e.xidusn and c.taddr=e.addr
  and c.sql_address=d.address and c.sql_hash_value=d.hash_value order by a.name,c.sid,d.piece;

 

--**查看用戶的回滾段的信息

 

select s.username, rn.name from v$session s, v$transaction t, v$rollstat r, v$rollname rn
  where s.saddr = t.ses_addr and t.xidusn = r.usn and r.usn = rn.usn;

 

--**查看undo段的使用狀況

 

SELECT d.segment_name,extents,optsize,shrinks,aveshrink,aveactive,d.status
  FROM v$rollname n,v$rollstat s,dba_rollback_segs d
  WHERE d.segment_id=n.usn(+) and d.segment_id=s.usn(+);

 

 

 

--** **Oracle系統排序區使用情

 

 

--** 內存與磁盤的排序狀況:

 

COL "排序操做" for a40

SELECT name "排序操做" , value "操做次數"

FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');

 

select a.value "disk sort" , b.value "memory sort" ,

round(a.value/(b.value+a.value)*100,2) "disk sort percentage"

from V$SYSSTAT a , V$SYSSTAT b

where a.name = 'sort ( disk ) ' and b.name = 'sort (memory)' ;

 

--**求free memory

 

  select * from v$sgastat where name='free memory';
  select a.name,sum(b.value) from v$statname a,v$sesstat b where a.statistic# = b.statistic# group by a.name;

  查看一下誰在使用那個能夠的回滾段,或者查看一下某個能夠的用戶在使用回滾段,找出領回滾段不斷增加的事務,再看看如何處理它,是否能夠將它commit,再不行就看可否kill它,查看當前正在使用的回滾段的用戶信息和回滾段信息:

  set linesize 121
  SELECT r.name "ROLLBACK SEGMENT NAME ",l.sid "ORACLE PID",p.spid "SYSTEM PID ",s.username "ORACLE USERNAME"
  FROM v$lock l, v$process p, v$rollname r, v$session s
  WHERE l.sid = p.pid(+) AND s.sid=l.sid AND TRUNC(l.id1(+)/65536) = r.usn AND l.type(+) = 'TX' AND l.lmode(+) = 6 ORDER BY r.name; 

 

--** 查詢排序操做命中率:

 

select a.value "Disk Sort",b.value "Memory Sort",

round((100*b.value)/decode((a.value+b.value),0,1,(a.value+b.value)),2)

"Pct Memory Sorts"

from v$sysstat a,v$sysstat b

where a.name = 'sorts(disk)'

and b.name='sorts(memory)' ;

 

 

--** 查詢臨時段:

 

col file_name for a30

col bytes for 999,999,999,999

col tablespace_name for a18

select file_name,tablespace_name,bytes,maxbytes,increment_by

from dba_temp_files;

 

 

--** 用戶與臨時表空間名:

 

COL USERNAME heading "用戶名" for a20

COL TEMPORARY_TABLESPACE heading "臨時表空間名" for a20

COL DEFAULT_TABLESPACE heading "默認表空間名" for a20

SELECT USERNAME,

TEMPORARY_TABLESPACE,

DEFAULT_TABLESPACE,

TO_CHAR(CREATED,'YYYY.MM.DD' ) "建立用戶日期"

FROM DBA_USERS ORDER BY USERNAME ;

 

--** 顯示排序參數當前值:

 

show parameter SORT_AREA_SIZE

show parameter SORT_AREA_RETAINED_SIZE

--**ALTER Session set SORT_AREA_SIZE=1024000 ;

--**ALTER SYSTEM set SORT_AREA_SIZE=1024000 DEFERRED ;

 

 

--** 監視臨時段的使用狀況:

 

select tablespace_name, current_users, total_extents,

used_extents, extent_hits, max_used_blocks,

max_sort_blocks

from v$sort_segment;

 

SELECT session_num, tablespace, extents, blocks

FROM v$sort_usage;

 

--** 檢查不能分配的臨時表空間:

 

SELECT '沒法分配臨時表空間的 INITIAL和NEXT '

FROM dba_tablespaces dt,

(SELECT MAX(bytes) max_size , tablespace_name FROM dba_free_space

WHERE tablespace_name ='TEMP'

GROUP BY tablespace_name ) fs

WHERE dt.tablespace_name = fs.tablespace_name AND

( dt.initial_extent > fs.max_size OR dt.next_extent > fs.max_size );

 

--** **10g版本回收站有關信息

 

 

-- **Oracle 10g 功能檢查-Flashback:

 

show parameter RECYCLEBIN

 

--** 回收站信息

 

col owner for a20

col ORIGINAL_NAME for a28

select owner,object_name,original_name,type,space

from dba_recyclebin order by owner,type;

 

 

--**清空Oracle 10g回收站中以BIN$開頭的表

 

使用oracle 10g時出現了許多奇怪的表名,以BIN$開頭,上網查找後發現是oracle10g的回收站功能,並無完全的刪除表,而是把表放入回收站!!!

 

清除的方法以下:

 

purge table origenal_tableName;--原來的表名

 

或者在刪除表時加上PURGE選項,如:

 

DROP TABLE t_test PURGE;

 

清空整個回收站的命令:

 

PURGE recyclebin;

 

查詢回收站垃圾信息的SQL語句:

 

SELECT object_name,type ,original_name FROM user_recyclebin ;

 

 

 

 

--** 有關路徑與大小

 

--DB_RECOVERY_FILE_DEST

show parameter DB_RECOVERY_FILE_DEST

--

show parameter db_flashback_retention_target

 

-- ** 閃回有關信息

 

SELECT estimated_flashback_size,

flashback_size

FROM v$flashback_database_log;

 

--

SELECT oldest_flashback_scn,

oldest_flashback_time

FROM v$flashback_database_log;

 

--

SELECT * FROM v$flashback_database_stat;

 

 

--** **Oracle系統SGA

 

--** 要得到詳細信息採用STATSPACK(見另外腳本)

 

--** SGA 當前參數狀況:

 

COL VALUE for 999,999,999,999

select * from V$SGA ;

 

--**查看用戶使用內存狀況

 

select username, sum(sharable_mem), sum(persistent_mem), sum(runtime_mem)
  from sys.v_$sqlarea a, dba_users b
  where a.parsing_user_id = b.user_id group by username;

 

--**查看內存使用狀況

 

select least(max(b.value)/(1024*1024),sum(a.bytes)/(1024*1024)) shared_pool_used,max(b.value)/(1024*1024) shared_pool_size,greatest(max(b.value)/(1024*1024),sum(a.bytes)/(1024*1024))-(sum(a.bytes)/(1024*1024)) shared_pool_avail,((sum(a.bytes)/(1024*1024))/(max(b.value)/(1024*1024)))*100 avail_pool_pct
  from v$sgastat a, v$parameter b where (a.pool='shared pool' and a.name not in ('free memory')) and b.name='shared_pool_size';

 

--**查看內存中存的使用

 

  select decode(greatest(class,10),10,decode(class,1,'Data',2,'Sort',4,'Header',to_char(class)),'Rollback') "Class",
  sum(decode(bitand(flag,1),1,0,1)) "Not Dirty",sum(decode(bitand(flag,1),1,1,0)) "Dirty",
  sum(dirty_queue) "On Dirty",count(*) "Total"
  from x$bh group by decode(greatest(class,10),10,decode(class,1,'Data',2,'Sort',4,'Header',to_char(class)),'Rollback');

 

--** 內存分配狀況:

 

COL Name for a40

COL Values for a40

select name, value

from v$parameter

where name in

('db_block_buffers','db_cache_size','db_block_size','shared_pool_size','sort_area_size');

 

--**若是90-95% 間,表示緩衝區設置低了.

 

 

--** 查詢數據高速緩衝區的命中率1:

 

select a.value + b.value "邏輯讀", c.value "物理讀",

round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "緩衝區命中率"

from v$sysstat a, v$sysstat b, v$sysstat c

where (a.value !=0 OR b.value != 0 ) and

a.STATISTIC# = 38 and b.statistic# = 39

and c.statistic# = 40;

-- v$statname

 

--** 查詢數據高速緩衝區的命中率2:

 

SELECT 'buffer cache hit ratio',

round((congets.value+dbgets.value-physreads.value)*100/

(congets.value+dbgets.value),4) "HIT RATE"

from v$sysstat congets,

v$sysstat dbgets,

v$sysstat physreads

where congets.name='consistent gets'

and dbgets.name = 'db block gets'

and physreads.name = 'physical reads' ;

 

 

--** 查詢數據高速緩衝區的命中率3:

 

col name for a30

col value for 999,999,999,999

select name, value from v$sysstat

where name in ('consistent gets','db block gets','physical reads' ) ;

 

/* 若是 ratio = 1- ( physical reads / ( db block gets + consistent gets ) ) 低於 70%。

則應該加大INITsid.ORA文件中的DB_BLOCK_BUFFERS參數值

9I用ALter system set db_cache_size= 100m scope=spfile ; */

 

--**測定數據的命中率(V$SYSSTAT)

 

select 1-(sum(decode(name, 'physical reads', value,0))/

(sum(decode(name, 'db block gets', value,0)) +(sum(decode(name, 'consistent gets', value,0))))) "Read Hit Ratio"

from v$sysstat;

 

--** 查詢數據高速緩衝區的使用狀況4:

 

/*

?Total Reads = db block gets + consistent gets

?Hit Ratio = 1 - (physical reads) / (db block gets + consistent gets)

?Buffer Hit Ratio > 95% for an Interactive Intensive System and 85% for a Batch Intensive System

select     sum(decode(name, 'physical reads', value, 0)) dsk_rds,

    sum(decode(name, 'db block gets', value, 0)) blk_gts,

    sum(decode(name, 'consistent gets', value, 0)) con_gts,

    ((1 - (sum(decode(name, 'physical reads', value, 0)) /

    (sum(decode(name, 'db block gets', value, 0)) +

    sum(decode(name, 'consistent gets', value, 0))))) * 100)     hit_rate

from     v$sysstat;

 

 

--** 查詢數據高速緩衝區的使用狀況5:

 

select    decode(state, 0, 'Free', 1, 'Modified',2, 'Not Modified', 3, 'Being Read', 'Other') stats ,

     count(*) cnt

from     sys.x$bh

group by state;

 

--** 監視會話內存及磁盤活動狀況6:

 

select     a.sid, a.username, b.block_gets, b.consistent_gets,

        b.physical_reads

from     v$session a, v$sess_io b

where    a.sid = b.sid

order by a.username;

 

 

--** 查詢共享池命中率:

 

select 'recursive calls/total calls',

(rc.value/(rc.value+uc.value))*100

from v$sysstat rc, v$sysstat uc

where rc.name='recursive calls' and uc.name='user calls';

 

--** 共享池高速緩存區的命中率1:

 

select sum(pinhits-reloads)/sum(pins) "命中率",

sum(reloads)/sum(pins) "重加載%"

from v$librarycache;

 

--** 共享池高速緩存區的命中率2:

 

Column Pins Format 999,999,990 Heading 'Executions'

Column PinHits Format 999,999,990 Heading 'Executions'

Column PHitRat Format 990.99 Heading 'Hit |Ratio'

Column Reloads Format 999,999,990 Heading 'Misses'

Column HitRat Format 990.99 Heading 'Hit |Ratio'

Column Instance New_Value _Instance NoPrint

Column Today New_Value _Date NoPrint

 

Define Hit_Ratio = 90 (Number)

Define Reld_Ratio = 1 (Number)

 

Select Sum(Pins) Pins, Sum(PinHits) PinHits,

((Sum(PinHits) / Sum(Pins)) * 100) PHitRat,

Sum(Reloads) Reloads,

((Sum(Pins) / (Sum(Pins) + Sum(Reloads))) * 100) HitRat

From V$LibraryCache;

 

 

 

--** 查詢字典緩衝區的命中率3:

 

select parameter "參數", gets "獲得",Getmisses "失敗",

TRUNC(getmisses/(gets+getmisses)*100,2) "失敗比率",

TRUNC((1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100,2) "命中率"

from v$rowcache

where gets+getmisses <>0

group by parameter, gets, getmisses;

 

 

--** 查詢數據字典命中率:

 

--**命中率>95%以上是可接受的

select sum(gets) "Gets", sum(getmisses) "Misses",

(1 - (sum(getmisses) / (sum(gets) +

sum(getmisses))))*100 "HitRate"

from v$rowcache;

 

--**查看字典命中率

 

  select (sum(getmisses)/sum(gets)) ratio from v$rowcache;

 

--** 查詢庫緩存的命中率:

 

select sum(pins)/(sum(pins)+sum(reloads))*100 "Hit Ratio"

from v$librarycache;

 

--** 查詢庫緩存的命中率:

 

select sum(pins) Executions, sum(pinhits) "Execution Hits",

((sum(pinhits) / sum(pins)) * 100) phitrat,

sum(reloads) Misses,

((sum(pins) / (sum(pins) + sum(reloads))) * 100) hitrat

from v$librarycache;

 

--**查看庫緩存命中率

 

  select namespace,gets, gethitratio*100 gethitratio,pins,pinhitratio*100 pinhitratio,RELOADS,INVALIDATIONS from v$librarycache;

 

 

--** 查詢庫緩存的使用百分比:

 

col value for 999,999,999 heading "Shared Pool Size"

col bytes for 999,999,999 heading "Free Bytes"

select to_number(v$parameter.value) value, v$sgastat.bytes,

(v$sgastat.bytes/NVL(v$parameter.value,1) )*100 "Percent Free"

from v$sgastat, v$parameter

where v$sgastat.name = 'free memory'

and v$parameter.name = 'shared_pool_size';

 

 

--** 查詢對象緩存狀況:

 

-- 查詢結果過多 !

/*

select type, name, sharable_mem, kept

from v$db_object_cache

order by type, kept, sharable_mem;

*/

 

--** 日誌緩存區的命中率

 

col "操做名" for a20

col "獲得" for 999,999,999

col "失敗" for 999,999,999

col "當即獲得" for 999,999,999

col "當即失敗" for 999,999,999

SELECT name "操做名",

Gets "獲得" , misses "失敗", immediate_gets "當即獲得",

immediate_misses "當即失敗" ,

Decode(gets,0,0,misses/gets*100) "失敗比率" ,

Decode(immediate_gets+immediate_misses,0,0,

immediate_misses/(immediate_gets+immediate_misses)*100) "當即失敗比率"

FROM v$latch WHERE name IN ('redo allocation', 'redo copy');

 

 

--** 查詢系統緩衝區命中率:

 

select ( 1-(sum(decode(name,'physical read',value,0))/

(sum(decode(name,'db block gets',value,0))+

sum(decode(name,'consistent gets',value,0)) )))*100 "Hit ratio"

from v$sysstat;

 

 

--** 查詢系統緩衝區命中率及評分:

 

select ( 1-(sum(decode(name,'physical read',value,0))/

(sum(decode(name,'db block gets',value,0))+

sum(decode(name,'consistent gets',value,0)) )))*100 "Hit ratio",

decode(sign(( 1-(sum(decode(name,'physical read',value,0))/

(sum(decode(name,'db block gets',value,0)) +

sum(decode(name,'consistent gets',value,0)) )))*100-98),1,30,

decode(sign(( 1-(sum(decode(name,'physical read',value,0))/

(sum(decode(name,'db block gets',value,0))+

sum(decode(name,'consistent gets',value,0)) )))*100-95),1,20,

decode(sign(( 1-(sum(decode(name,'physical read',value,0))/

(sum(decode(name,'db block gets',value,0))+

sum(decode(name,'consistent gets',value,0)) )))*100-90),1,10,0))) "Score"

from v$sysstat;

 

--**求cache中緩存超過其5%的對象

 

  select o.owner,o.object_type,o.object_name,count(b.objd)
  from v$bh b,dba_objects o
  where b.objd = o.object_id
  group by o.owner,o.object_type,o.object_name
  having count(b.objd) > (select to_number(value)*0.05 from v$parameter where name = 'db_block_buffers');

 

 

--** 統計恢復日誌有無競爭的狀況:

 

/* 若是immediate_contention > 1,則存在競爭 */

col name for a30

select name,(immediate_misses/

decode((immediate_gets+immediate_misses),0,-1,

(immediate_gets+immediate_misses)))*100 immediate_contention,

(misses/decode((gets - misses),0,-1))*100 wait_contention

from v$latch where name in('redo copy','redo allocation');

 

 

--** 系統是否設置共享池保留區:

 

--** 最好:REQUEST_MISS和REQUEST_FAILURES都接近 0 才行。

select REQUEST_MISSES, request_failures,requests,free_space

from V$SHARED_POOL_RESERVED ;

 

 

--** 數據緩衝區的使用狀況:

 

col username for a20

col osuser for a20

select username, osuser,

(io.physical_reads/(io.block_gets+io.CONSISTENT_GETS)) "hit ratio"

from v$sess_io io , v$session sess

where io.sid = sess.sid

and (io.block_gets+io.CONSISTENT_GETS) != 0

and username is not null;

 

 

--**** 其它影響性能的信息蒐集

 

 

--** ORACLE 系統會話狀況:

 

Col sid for 99999999

col WAIT_TIME for 999,999,999

col SECONDS_IN_WAIT for 999,999,999

SELECT SID, username,terminal ,

WAIT_TIME ,

SECONDS_IN_WAIT, LOCKWAIT

FROM v$session;

 

 

--** ORACLE 系統會話過多的狀況:

 

select 'Too many sessions ( '||to_char(count(*))||' running ',

substr(sql_text,1,80) query

from v$session s, v$sqlarea sa

where s.sql_address = sa.address

and s.sql_hash_value = sa.hash_value

and s.status = 'ACTIVE'

and s.audsid != 0

and sql_text not like 'select sql_text%'

group by substr(sql_text,1,80)

having count(*) > 100;

 

 

--** 顯示用戶等待的時間 :

 

SELECT b.username, a.wait_time, a.seconds_in_wait, a.state

From V$SESSION_WAIT a, V$SESSION b

Where a.SID=b.SID ;

 

--**查看系統請求狀況

 

  SELECT DECODE (name, 'summed dirty write queue length', value)/
  DECODE (name, 'write requests', value) "Write Request Length"
  FROM v$sysstat WHERE name IN ( 'summed dirty queue length', 'write requests') and value>0;

 

 

 

--** **等待事件等信息

 

 

--**查詢系統運行以來的等待事件

 

/**********************************************************************

V$SYSTEM_EVENT是一個動態性能視圖,記錄自系統啓動以來的等待事件,

包括各類類型的數據庫衝突等.輸出結果按照V$SYSTEM_EVENT視圖的

TIME_WAITED列的順序排列,若是TIMED_STATISTICS未設爲TRUE,

則TIME_WAITED列不會有內容.

*********************************************************************/

--截斷查詢結果最後的空格 set trimspool on

set trimspool on

set trimout on

-- 顯示執行腳本的命令 set echo on

set echo on

col event format a26 truncate

col total_waits format 999,990.00

col total_timeouts format 999,990.00

col time_waited format 999,990.00

col pct_significant format 90.00

col average_wait format 990.00

col instance new_value V_INSTANCE noprint

col total_time_waited new_value V_TOTAL_TIME_WAITED noprint

select    sum(time_waited) total_time_waited

from     sys.v_$system_event

where    event not in ('SQL*Net message from client',

         'rdbms ipc message',

         'slave wait',

         'pmon timer',

         'smon timer',

         'rdbms ipc reply',

         'SQL*Net message to client',

         'SQL*Net break/reset to client',

         'inactive session',

         'Null event');

 

 

select    event,

    (total_waits / 1000) total_waits,

    (total_timeouts / 1000) total_timeouts,

    (time_waited / 360000) time_waited,

    decode(event,

        'SQL*Net message from client', 0,

        'rdbms ipc message', 0,

        'slave wait', 0,

        'pmon timer', 0,

        'smon timer', 0,

        'rdbms ipc reply', 0,

        'SQL*Net message to client', 0,

        'SQL*Net break/reset to client', 0,

        'inactive session', 0,

        'Null event', 0,

        (time_waited / &&V_TOTAL_TIME_WAITED)*100) pct_significant,

    (average_wait / 100) average_wait

from    sys.v_$system_event

where    (time_waited/360000) >= 0.01

order by pct_significant desc, time_waited desc;

 

 

--**監控實例的等待:

 

select event,sum(decode(wait_Time,0,0,1)) "Prev",

sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"

from v$session_Wait

group by event order by 4;

 

 

--**找使用CPU多的用戶session

 

COL program for a40

COL spid for A12

Select a.sid, spid, status,

substr(a.program,1,40) program,

a.terminal,osuser,value/60/100 value

from v$session a,v$process b,v$sesstat c

where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by status,value desc;

 

--其中:12是統計編號,即cpu used by this session;可用:

--select STATISTIC#,name from v$statname查到.

 

 

--**求等待的事件及會話信息/求會話的等待及會話信息

 

  select se.sid,s.username,se.event,se.total_waits,se.time_waited,se.average_wait
  from v$session s,v$session_event se
  where s.username is not null and se.sid=s.sid and s.status='ACTIVE' and se.event not like '%SQL*Net%' order by s.username;
  select s.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_in_wait
  from v$session s,v$session_wait sw
  where s.username is not null and sw.sid=s.sid and sw.event not like '%SQL*Net%' order by s.username;

 

--**求等待中的對象 (運行時間超長!!)

 

  select /*+rule */ s.sid, s.username, w.event, o.owner, o.segment_name, o.segment_type,
  o.partition_name, w.seconds_in_wait seconds, w.state
  from v$session_wait w, v$session s, dba_extents o
  where w.event in (select name from v$event_name where parameter1 = 'file#'
  and parameter2 = 'block#' and name not like 'control%')
  and o.owner <> 'sys' and w.sid = s.sid and w.p1 = o.file_id and w.p2 >= o.block_id and w.p2 < o.block_id + o.blocks;

 

 

--**查找前10條性能差的sql:

 

SELECT * FROM (SELECT PARSING_USER_ID

EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text

FROM v$sqlarea ORDER BY disk_reads DESC)

WHERE ROWNUM<10;

 

 

--**查找耗資源的進程(top session):

 

col SCHEMA_NAME for a18

col OS_USER_NAME for a18

col ACTION for a30

col USER_NAME for a18

 

SELECT s.schemaname schema_name,

decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action,

status session_status,s.osuser os_user_name,

s.sid,p.spid,s.serial# serial_num,nvl(s.username,'[Oracle process]') user_name,

s.terminal terminal,s.program program,st.value criteria_value

FROM v$sesstat st,v$session s,v$process p

WHERE st.sid = s.sid and st.statistic# = to_number('38')

and ('ALL'='ALL' or s.status ='ALL') and p.addr=s.paddr

order by st.value desc,p.spid asc,s.username asc,s.osuser asc;

 

 

--**查看佔io較大的正在運行的session:

 

SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,

se.program, se.MODULE,se.sql_address,st.event,

st.p1text,si.physical_reads,si.block_changes

FROM v$session se,v$session_wait st,v$sess_io si,v$process pr

WHERE st.sid=se.sid AND st.sid=si.sid AND se.PADDR=pr.ADDR

AND se.sid>6 AND st.wait_time=0

AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC;

 

 

--**查看錶空間數據文件的讀寫性能:

 

Select name,phyrds,phywrts,avgiotim,miniotim,maxiowtm,maxiortm from v$filestat,v$datafile where v$filestat.file#=v$datafile.file#;

 

Select fs.name name,f.phyrds,f.phyblkrd,f.phywrts,f.phyblkwrt ,f.readtim,f.writetim

from v$filestat f, v$datafile fs where f.file# = fs.file# order by fs.name;

 

/*注意:若是phyblkrd與phyrds很接近的話,則代表這個表空間中存在全表掃描的表,這些表須要調整索引或優化SQL語句*/

 

--**Disk Read最高的SQL語句的獲取:

 

Select sql_text from (select * from v$sqlarea order by disk_reads)

where rownum<=5;

 

--**1 buffer gets top 10 sql:

 

      

        select * from    

        (select substr(sql_text,1,40) sql,    buffer_gets,

executions, buffer_gets/executions "Gets/Exec",    

        hash_value,address    

        from v$sqlarea        

        where buffer_gets > 10000    

        order by buffer_gets desc)    

        where rownum <= 10 ;

        

select * from    

(select substr(sql_text,1,40) sql,    buffer_gets,

executions, buffer_gets/executions "Gets/Exec",    

hash_value,address    

from v$sqlarea        

where buffer_gets > 0 and executions>0

order by buffer_gets desc)    

where rownum <= 10 ;

 

--**2 Physical Reads top 10 sql:

 

      

        select * from     

        (select substr(sql_text,1,40) sql,    disk_reads,

executions, disk_reads/executions "Reads/Exec",    

        hash_value,address    

        from v$sqlarea    where disk_reads > 1000    

        order by disk_reads desc)    where rownum <= 10;

 

select * from     

        (select substr(sql_text,1,40) sql,    disk_reads,

executions, disk_reads/executions "Reads/Exec",    

        hash_value,address    

        from v$sqlarea    where disk_reads > 0 and executions >0    

        order by disk_reads desc)    where rownum <= 10;

 

    

 

--**3 Executions top 10 sql:

 

      

        select * from    

        (select substr(sql_text,1,40) sql,    executions,

rows_processed, rows_processed/executions "Rows/Exec",    

        hash_value,address    

        from v$sqlarea    where executions > 100    

        order by executions desc)    where rownum <= 10 ;    

        

 

--**4 Parse Calls top 10 sql:

 

      

        select * from    

        (select substr(sql_text,1,40) sql,    parse_calls,

executions, hash_value,address    

        from v$sqlarea    where parse_calls > 1000    

        order by parse_calls desc)    where rownum <= 10 ;

    

 

--**5 Sharable Memory top 10 sql:

 

      

        select * from    

        (select substr(sql_text,1,40) sql,    sharable_mem,

executions, hash_value,address    

        from v$sqlarea    where sharable_mem > 1048576    

        order by sharable_mem desc)    

        where rownum <= 10;

        

 

--**6 CPU usage top 10 sql:

 

      

        select * from    

        (select sql_text,    round(cpu_time/1000000)

cpu_time,    

round(elapsed_time/1000000) elapsed_time,    

        disk_reads,    

        buffer_gets,    

        rows_processed    

        from v$sqlarea    order by cpu_time desc, disk_reads desc    )    

        where rownum < 10;

    

 

--**7 Running Time top 10 sql:

 

      

        select * from

        (select t.sql_fulltext,

        (t.last_active_time-to_date(t.first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60 time,

        disk_reads,buffer_gets,rows_processed,    

        t.last_active_time,t.last_load_time,t.first_load_time    

        from v$sqlarea t order by t.first_load_time desc)    

        Where rownum < 10 order by time desc;

 

select * from

        (select

        (t.last_active_time-to_date(t.first_load_time,'yyyy-mm-dd hh24:mi:ss'))*24*60 time,

        T.sql_id,    

        t.last_active_time,t.last_load_time,t.first_load_time    

        from v$sqlarea t order by t.first_load_time desc)    

         order by time asc;

 

 

--**最佔資源的10個查詢

 

select b.username username,a.disk_reads reads,

a.executions exec,a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio,

a.sql_text Statement

from v$sqlarea a,dba_users b

where a.parsing_user_id=b.user_id

and a.disk_reads > 100000 and rownum<10

order by a.disk_reads desc;

 

 

--**捕捉運行好久的SQL ---正在運行的

 

select username,sid,opname,

round(sofar*100 / totalwork,0) || '%' as progress,

time_remaining,sql_text

from v$session_longops , v$sql

where time_remaining <> 0

and sql_address = address

and sql_hash_value = hash_value;

 

select username,sid,opname,

round(sofar*100 / totalwork,0) || '%' as progress,

time_remaining,start_time from v$session_longops , v$sql

where time_remaining <> 0

and sql_address = address

and sql_hash_value = hash_value;

 

 

--**求DISK READ較多的SQL

 

  select st.sql_text from v$sql s,v$sqltext st
  where s.address=st.address and s.hash_value=st.hash_value and s.disk_reads > 300;

 

--**求DISK SORT嚴重的SQL

 

select

    v$session.username,

    v$sqlarea.sql_text,

    V$TEMPSEG_USAGE.blocks

from

    v$session,

    v$sqlarea ,

    V$TEMPSEG_USAGE

where

    v$session.serial# = V$TEMPSEG_USAGE.session_num

and

    V$TEMPSEG_USAGE.sqladdr = v$sqlarea.address

and

    V$TEMPSEG_USAGE.sqlhash = v$sqlarea.hash_value

and

    V$TEMPSEG_USAGE.blocks > 200;

 

-- **SQL語句衝突:

 

select 'Too many sessions ( '||to_char(count(*))||' running '||

substr(sa.sql_text,1,80) query

from v$session s, v$sqlarea sa

where s.sql_address = sa.address

and s.sql_hash_value = sa.hash_value

and s.status = 'ACTIVE'

and s.audsid != 0

and sql_text not like 'select sql_text%'

group by substr(sa.sql_text,1,80)

having count(*) > 100;

 

--**等待時間最多的5個系統等待事件的獲取:

 

Select * from (select * from v$system_event where event not like 'SQL%' order by total_waits desc) where rownum<=5;

 

--**形成等待的LOCK信息,如LOCK類型等:

 

col event format a30

set line 160

col machine format a10

col username format a15

select b.sid,b.serial#,b.username,machine,a.event,a.wait_time,

chr(bitand(a.p1,-16777216)/16777215)||chr(bitand(a.p1, 16711680)/65535) "Enqueue Type"

from v$session_wait a,v$session b

where a.event not like 'SQL*N%'

and a.event not like 'rdbms%' and a.sid=b.sid

and b.sid>8 and a.event='enqueue'

order by username;

 

 

--**等待事件信息:

 

 

select event,count(*),sum(seconds_in_wait) siw

from v$session_wait

group by event;

 

--** **10g版本統計蒐集

 

 

--** 查詢沒有分析的表的信息(運行時間長):

 

-- Not analyzed

select owner,table_name

from sys.dba_tables

where owner not in ('SYS','SYSTEM')

and nvl(num_rows,0) = 0

or last_analyzed is null;

 

--** 查詢最近沒有分析的表的信息(運行時間長):

 

-- Not analyzed in for pre-determined number of days

select owner,table_name

from sys.dba_tables

where owner not in ('SYS','SYSTEM')

and last_analyzed is not null

and trunc(last_analyzed) < trunc(sysdate)-5;

 

--****無效對象檢查

 

 

--** 檢查索引無用信息:

 

select owner||'.'||index_name

from dba_indexes

where status= 'UNUSABLE';

 

 

--**查看無效的對象

 

select owner,object_type,object_name from dba_objects where status='INVALID';
  select constraint_name,table_name from dba_constraints where status='INVALID';

 

--**查看無效的數據庫對象

 

    SELECT owner, object_name, object_type FROM dba_objects WHERE status='INVALID';    

 

--**查看不起做用的約束

 

    SELECT owner, constraint_name, table_name, constraint_type, status FROM dba_constraints WHERE status = 'DISABLED' AND constraint_type = 'P';

        

 

--**查看無效的trigger

 

            SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED' ;

 

--**求出無效的對象

 

  select 'alter procedure '||object_name||' compile;'
  from dba_objects
  where status='INVALID' and wner='&' and object_type in ('PACKAGE','PACKAGE BODY');
  /
  select owner,object_name,object_type,status from dba_objects where status='INVALID';

 

--****ORACLE系統數據文件狀況

 

set linesize 300

col file_name for a60

col tablespace_name for a30

set pagesize 1000

            select file_name ,

            tablespace_name ,

            bytes,

            autoextensible "AUTO",

            maxbytes

            from DBA_DATA_FILES

            order by tablespace_name ;    

 

--**查看數據文件的狀態記錄狀態不是"online"的數據文件

 

Select file_name from dba_data_files where status='OFFLINE';

 

---****會話有關

 

 

--**求當前session的跟蹤文件

 

  SELECT p1.value || '/' || p2.value || '_ora_' || p.spid || '.ora' filename
  FROM v$process p, v$session s, v$parameter p1, v$parameter p2
  WHERE p1.name = 'user_dump_dest' AND p2.name = 'instance_name'
  AND p.addr = s.paddr AND s.audsid = USERENV('SESSIONID') AND p.background is null AND instr(p.program,'CJQ') = 0; 

 

--**求process/session的狀態

 

  select p.pid,p.spid,s.program,s.sid,s.serial#
  from v$process p,v$session s where s.paddr=p.addr;

 

--**求當前session的狀態

 

select sn.name,ms.value
  from v$mystat ms,v$statname sn
  where ms.statistic#=sn.statistic# and ms.value > 0;            

 

--**求當前會話的SID,SERIAL#

 

  select sid, serial# from v$session where audsid = SYS_CONTEXT('USERENV','SESSIONID');

 

--**求當前數據庫創建的會話:

 

select sid,serial#,username,program,machine,status from v$session;

 

--**求當前會話的SID,SERIAL#

 

SELECT Sid, Serial# FROM V$session WHERE Audsid = Sys_Context('USERENV', 'SESSIONID');

 

--**求使用CPU多的用戶session

 

12是cpu used by this session

select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value

from v$session a,v$process b,v$sesstat c

where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

    

 

--**求會話等待的file_id/block_id

 

col event format a24
  col p1text format a12
  col p2text format a12
  col p3text format a12
  select sid,event,p1text, p1, p2text, p2, p3text, p3
  from v$session_wait
  where event not like '%SQL%' and event not like '%rdbms%' and event not like '%mon%' order by event;
  select name,wait_time from v$latch l where exists (select 1 from (select sid,event,p1text, p1, p2text, p2, p3text, p3
  from v$session_wait
  where event not like '%SQL%' and event not like '%rdbms%' and event not like '%mon%'
  ) x where x.p1= l.latch#);

 

 

--**求誰阻塞了某個session(10g)

 

  select sid, username, event, blocking_session,
  seconds_in_wait, wait_time
  from v$session where state in ('WAITING') and wait_class != 'Idle';

 

--**求當前事務的重作尺寸

 

select value
  from v$mystat, v$statname
  where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';

 

--**查看耗資源的進程(top session)

 

SELECT s.Schemaname Schema_Name,

Decode(Sign(48 - Command),

1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,

Status Session_Status, s.Osuser Os_User_Name, s.Sid, p.Spid,

s.Serial# Serial_Num, Nvl(s.Username, '[Oracle process]') User_Name,

s.Terminal Terminal, s.Program Program, St.VALUE Criteria_Value

FROM V$sesstat St, V$session s, V$process p

WHERE St.Sid = s.Sid

AND St.Statistic# = To_Number('38')

AND ('ALL' = 'ALL' OR s.Status = 'ALL')

AND p.Addr = s.Paddr

ORDER BY St.VALUE DESC, p.Spid ASC, s.Username ASC, s.Osuser ASC;    

 

*************************************************

 

 

--**查看正在運行的job

 

select job from dba_jobs_running;

 

--**求系統中較大的latch

 

select name,sum(gets),sum(misses),sum(sleeps),sum(wait_time)
  from v$latch_children
  group by name having sum(gets) > 50 order by 2;

 

--**求某個事務的重作信息(bytes)

 

  select s.name,m.value
  from v$mystat m,v$statname s
  where m.statistic#=s.statistic# and s.name like '%redo size%';

 

--**求回退率

 

  select b.value/(a.value + b.value),a.value,b.value from v$sysstat a,v$sysstat b
  where a.statistic#=4 and b.statistic#=5;

 

--**求索引中行數較多的

 

  select index_name,blevel,num_rows,CLUSTERING_FACTOR,status from user_indexes where num_rows > 10000 and blevel > 0;
  select table_name,index_name,blevel,num_rows,CLUSTERING_FACTOR,status from user_indexes where status <> 'VALID';

 

--**求未定義索引的表

 

  select table_name from user_tables where table_name not in (select table_name from user_ind_columns);

 

--**求出鎖定的對象

 

  select do.object_name,session_id,process,locked_mode
  from v$locked_object lo, dba_objects do where lo.object_id=do.object_id;

 

--**查看對象的緩存狀況

 

  select OWNER,NAMESPACE,TYPE,NAME,SHARABLE_MEM,LOADS,EXECUTIONS,LOCKS,PINS,KEPT
  from v$db_object_cache where type not in ('NOT LOADED','NON-EXISTENT','VIEW','TABLE','SEQUENCE')
  and executions>0 and loads>1 and kept='NO' order by owner,namespace,type,executions desc;
  select type,count(*) from v$db_object_cache group by type;

 

--**查看某些用戶的hash

 

  select a.username, count(b.hash_value) total_hash,count(b.hash_value)-count(unique(b.hash_value)) same_hash,
  (count(unique(b.hash_value))/count(b.hash_value))*100 u_hash_ratio
  from dba_users a, v$sqlarea b where a.user_id=b.parsing_user_id group by a.username;

 

--**求某個隱藏參數的值

 

  col ksppinm format a54
  col ksppstvl format a54
  select ksppinm, ksppstvl
  from x$ksppi pi, x$ksppcv cv
  where cv.indx=pi.indx and pi.ksppinm like '\_%' escape '\' and pi.ksppinm like '%meer%';

 

 

 

--****與權限相關的字典

 

ALL_COL_PRIVS表示列上的受權,用戶和PUBLIC是被授予者
  ALL_COL_PRIVS_MADE表示列上的受權,用戶是屬主和被授予者
  ALL_COL_RECD表示列上的受權,用戶和PUBLIC是被授予者
  ALL_TAB_PRIVS表示對象上的受權,用戶是PUBLIC或被授予者或用戶是屬主
  ALL_TAB_PRIVS_MADE表示對象上的權限,用戶是屬主或授予者
  ALL_TAB_PRIVS_RECD表示對象上的權限,用戶是PUBLIC或被授予者
  DBA_COL_PRIVS數據庫列上的全部受權
  DBA_ROLE_PRIVS顯示已授予用戶或其餘角色的角色
  DBA_SYS_PRIVS已授予用戶或角色的系統權限
  DBA_TAB_PRIVS數據庫對象上的全部權限
  ROLE_ROLE_PRIVS顯示已授予用戶的角色
  ROLE_SYS_PRIVS顯示經過角色授予用戶的系統權限
  ROLE_TAB_PRIVS顯示經過角色授予用戶的對象權限
  SESSION_PRIVS顯示用戶如今可利用的全部系統權限
  USER_COL_PRIVS顯示列上的權限,用戶是屬主、授予者或被授予者
  USER_COL_PRIVS_MADE顯示列上已授予的權限,用戶是屬主或授予者
  USER_COL_PRIVS_RECD顯示列上已授予的權限,用戶是屬主或被授予者
  USER_ROLE_PRIVS顯示已授予給用戶的全部角色
  USER_SYS_PRIVS顯示已授予給用戶的全部系統權限
  USER_TAB_PRIVS顯示已授予給用戶的全部對象權限
  USER_TAB_PRIVS_MADE顯示已授予給其餘用戶的對象權限,用戶是屬主
  USER_TAB_PRIVS_RECD顯示已授予給其餘用戶的對象權限,用戶是被授予者

 

--****在AIX系統中根據pid得到sql

 

一、 在AIX系統中用TOPAS命令查看

發現user中的cpu太高,其中oracle的進程CPU比較高。

好比oracle其中最高的進程pid爲1138782 佔CPU 27%

二、 根據pid查出sid,serial#

select s.sid,s.serial# from v$session s,v$process p

where s.paddr=p.addr and p.spid='&pid';

好比sid,serial#爲482,56767

三、 根據sid查出SQL語句

SELECT sql_text

FROM v$sqltext a

WHERE a.hash_value = (SELECT sql_hash_value

FROM v$session b

WHERE b.SID ='&sid' )

ORDER BY piece ASC;

輸入sid爲482 查出sql語句

 

 

--**跟蹤用戶session 的方法

 

    1. top or sm 50 --> PID
      2. SELECT sid, serial#
      FROM v$session s, v$process p
      Where s.paddr = p.addr
      AND p.spid = '&pid'
      3. exec dbms_system.set_sql_trace_in_session(sid, serial#, true);
      4. exec dbms_system.set_sql_trace_in_session(sid, serial#, false);
      5. tkprof xxxx.trc session.txt explain=sapr3/xxxx aggregate=yes sys=no waits=yes sort=fchela;

       

       

    2. select addr from v$process where spid={佔CPU比重達的PID},好比上面的28377164
    3. select sql_id from v$session where paddr={上面查詢結果中的addr }

      三、select * from v$sql a where a.SQL_ID={上面查詢結果中的sql_id}

       

      --**在oracle中查找有多少表被鎖住

       

      在oracle中查找有多少表被鎖住的方法:

      select b.owner table_owner,b.object_name,c.username,c.sid,c.serial#

      from v$locked_object a,dba_objects b,v$session c

      where a.object_id=b.object_id and c.sid=a.session_id;

       

       

      --**查找一個表是否 被鎖的方法,例如:臨時表SHZGY.SHZGY_PZ_BB_ERROR1

       

      select object_id, owner||'.'||object_name object_name

      from dba_objects

      where owner='SHZGY'

      and object_name like 'SHZGY_PZ_BB_ERROR1';

      OBJECT_ID OBJECT_NAME

      ---------- ----------------------------------

      105421 SHZGY.SHZGY_PZ_BB_ERROR1

      找出該表的 id1。

      select * from v$lock where id1 = 105421;

       

      ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

      -------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

      A08E1304 A08E1314 29 TO 105421 1 3 0 1209396 0

      A08D4904 A08D4914 30 TO 105421 1 3 0 1295439 0

      A08E1188 A08E1198 32 TO 105421 1 3 0 1284027 0

      A08E12B8 A08E12C8 77 TO 105421 1 3 0 1209674 0

      A08E11D4 A08E11E4 120 TO 105421 1 3 0 1280668 0

      A08E1350 A08E1360 144 TO 105421 1 3 0 1209330 0

      A08E1220 A08E1230 151 TO 105421 1 3 0 1279593 0

       

      已選擇7行。

      說明有七個會話鎖住該臨時表。

       

       

      --**oracle kill session的方法

       

      在網上找了挺多有關oracle kill session的文章,可能是講如何kill掉一個session的.對於怎麼找到你要的session並未作講解,如下內容是有講解怎麼找到你要kill 掉的session的,這個版本較好。因此收入

      在oracle中查找有多少表被鎖住的方法:

      select b.owner table_owner,b.object_name,c.username,c.sid,c.serial#

      from v$locked_object a,dba_objects b,v$session c

      where a.object_id=b.object_id and c.sid=a.session_id;

       

      這樣根據sid和serial#就能夠直接殺掉(具體方法下面介紹)

       

      查找一個表是否 被鎖的方法,例如:臨時表SHZGY.SHZGY_PZ_BB_ERROR1

       

      select object_id, owner||'.'||object_name object_name

      from dba_objects

      where owner='SHZGY'

      and object_name like 'SHZGY_PZ_BB_ERROR1';

       

      OBJECT_ID OBJECT_NAME

      ---------- ----------------------------------

      105421 SHZGY.SHZGY_PZ_BB_ERROR1

       

      找出該表的 id1。

      select * from v$lock where id1 = 105421;

       

      ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

      -------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

      A08E1304 A08E1314 29 TO 105421 1 3 0 1209396 0

      A08D4904 A08D4914 30 TO 105421 1 3 0 1295439 0

      A08E1188 A08E1198 32 TO 105421 1 3 0 1284027 0

      A08E12B8 A08E12C8 77 TO 105421 1 3 0 1209674 0

      A08E11D4 A08E11E4 120 TO 105421 1 3 0 1280668 0

      A08E1350 A08E1360 144 TO 105421 1 3 0 1209330 0

      A08E1220 A08E1230 151 TO 105421 1 3 0 1279593 0

       

      已選擇7行。

       

      說明有七個會話鎖住該臨時表。

       

      若是能夠kill,就能夠 drop table shzgy.shzgy_pz_bb_error1;

      select a.sid, a.SERIAL#, b.spid, a.status, a.PROGRAM

      from v$session a, V$PROCESS b

      where a.sid in (29, 30, 32, 77, 120, 144, 151)

      and a.paddr=b.ADDR

      order by a.sid;

       

       

      SID SERIAL# SPID STATUS PROGRAM

      ---------- ---------- ------------ -------- ------------------------

      29 619 9738 INACTIVE JDBC Thin Client

      30 47 7608 INACTIVE JDBC Thin Client

      32 148 8014 INACTIVE JDBC Thin Client

      77 198 9736 INACTIVE JDBC Thin Client

      120 258 8204 INACTIVE JDBC Thin Client

      144 17 9762 INACTIVE JDBC Thin Client

      151 253 8232 INACTIVE JDBC Thin Client

      這七個會話都是JDBC調用,status=INACTIVE。

      而後根據這些調用和活動狀態判斷是否能夠kill掉這些session。

      若是能夠就直接kill掉這些session:

      使用 dbms_system.set_sql_trace_in_session包來對這個session進行trace:

      SQL > alter system kill session 'sid,SERIAL#' immediate;

      這時這些session的狀態就被標記爲killed,Oracle會在該用戶下一次 touch時清除該進程。

      咱們發現當一個session被kill掉之後,該session的paddr被修改,若是有多個session被kill,那麼多個session的paddr都被更改成相同的進程地址:

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

      SADDR SID SERIAL# PADDR USERNAME STATUS

      -------- ---------- ---------- -------- ------------------------------ --------

      542E0E6C 11 314 542B70E8 EYGLE INACTIVE

      542E5044 18 662 542B6D38 SYS ACTIVE

      SQL> alter system kill session '11,314';

      System altered.

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

      SADDR SID SERIAL# PADDR USERNAME STATUS

      -------- ---------- ---------- -------- ------------------------------ --------

      542E0E6C 11 314 542D6BD4 EYGLE KILLED

      542E5044 18 662 542B6D38 SYS ACTIVE

       

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

      SADDR SID SERIAL# PADDR USERNAME STATUS

      -------- ---------- ---------- -------- ------------------------------ --------

      542E0E6C 11 314 542D6BD4 EYGLE KILLED

      542E2AA4 14 397 542B7498 EQSP INACTIVE

      542E5044 18 662 542B6D38 SYS ACTIVE

      SQL> alter system kill session '14,397';System altered.

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

      SADDR SID SERIAL# PADDR USERNAME STATUS

      -------- ---------- ---------- -------- ------------------------------ --------

       

       

       

      --**ORACLE10G的回收站

       

      今天在10g庫中發現有許多BIN$...等開頭的一些表,突然想起來是回收站的表。%bV&gDm"lw!PT@0
      R)ai$p"b5B0在Oralce 10g中的回收站實際上是一個邏輯容器(一個數據字典表,它包含了被刪除的表的相關的信息)z"ST4`'h B/Vl0
      z0L*_1HT__N:LB2b0desc recyclebin;

      查看recyclebin視圖的表結構信息。7X OBQ7YvD-Z,O]U@0ITPUB我的空間'blEb M7])sn$uM
      查看回收站中的內容:
      pNr:D~*\;n.v0SQL>select object_name,droptime,dropscn,purge_object from recyclebin;L{G`#e!km GR0
      U[(e1G*}e)@0在10R2中,咱們能夠經過控制初始化參數recyclebin關閉閃回刪除功能,此參數默認值爲ON,因此數據庫默認狀況下將把全部刪除的表都要進入回收站,這樣呢,咱們能夠利用閃回刪除特性恢復它們;若是設置爲OFF,那麼將關閉數據庫閃回刪除功能,表在被刪除以後將不進入回收站。XW$? MA6sc['^+z&[F0ITPUB我的空間 X7M/f1oOa|n |*B}
      若是咱們確認要刪除一個張表,絕不含糊,那麼可使用:
      ?7cE^S}H0SQL>drop table table_name purge;

      這樣的話,被刪除的表將被完全刪除,再也不會進回收站。
      *nm1H0QsI+U0
      Q-m.P:?*d@i0咱們能夠查看本身回收站中的內容,使用user_recyclebin視圖;亦能夠查看數據庫中全部的回收站內容,使用dba_recyclebin視圖。
      .x_4Ykf]gs0如:
      n"y7ypG0SQL>select owner,original_name,object_name,ts_name,droptime from dba_recyclebin;!W1O@(_.gwf3k0ITPUB我的空間kMv*x3]
      咱們能夠看到無論是recyclebin、user_recyclebin仍是dba_recyclebin;他們中的object_name都是一些很奇怪的名字(以BIN$開頭,是系統自動生成的,此名稱的長度一般爲30個字符)。若是咱們想查看回收站中某個對象的內容,那麼咱們必須使用系統生成的名稱(以BIN$開頭的),且用雙引號括住。ITPUB我的空間8Ny TKt{%V
      如:
      b R L|6F3So!ot&{0SQL>select * from "BIN$.....";ITPUB我的空間2y8GD9\J
      8DgR REQ0若是須要恢復回收站中的對象,那麼:
      3bX5@$jX0SQL>flashback table table_name to before drop;B#{\Q\i`@s0ITPUB我的空間(B0N&S!L']gBoR`'d
      若是須要刪除回收站中的對象,那麼:ITPUB我的空間BYMI5Oo
      SQL>purge table table_name;/purge index index_name;ITPUB我的空間dtPAYJ}
      還有更省勁的呢,呵呵!那就是:
      QdWAO9s5a"h$VD0SQL>purge recyclebin;清空整個回收站。

       

      查看select
      trunc(completion_time) as "Date"
      ,count(*) as "Count"
      ,trunc((sum(blocks * block_size)) /1024 /1024) as "MB"
      from v$archived_log
      group by trunc(completion_time)
      order by "Date"
      ;

      SQL> select
      2 trunc(completion_time) as "Date"
      3 ,count(*) as "Count"
      4 ,trunc((sum(blocks * block_size)) /1024 /1024) as "MB"
      5 from v$archived_log
      6 group by trunc(completion_time)
      7 order by "Date"
      8 ;

      Date Count MB
      --------------- ---------- ----------
      02-JUN-10 87 3727
      17-JUN-10 266 11344
      18-JUN-10 655 29995
      19-JUN-10 2 86
      20-JUN-10 1 43
      21-JUN-10 27 1140
      22-JUN-10 18 777
      23-JUN-10 6 247
      24-JUN-10 4 172
      25-JUN-10 6 259
      26-JUN-10 4 172

      Date Count MB
      --------------- ---------- ----------
      27-JUN-10 3 129
      28-JUN-10 4 172
      29-JUN-10 4 172
      30-JUN-10 7 294
      01-JUL-10 3 129
      02-JUL-10 4 172
      03-JUL-10 7 302
      04-JUL-10 3 129
      05-JUL-10 2 86

      20 rows selected.

       

      --**Oracle 總量和剩餘量的查詢

       

      select sum(bytes)/1024/1024/1024 from dba_data_files; 全部的總量

      select sum(bytes)/1024/1024/1024 G from dba_free_space; 全部的餘量

      select sum(bytes)/1024/1024/1024 from dba_data_files where TABLESPACE_NAME='APPS_UNDOTS1'; 查看某個表空間的總量

      select sum(bytes)/1024/1024/1024 G from dba_free_space where TABLESPACE_NAME='APPS_UNDOTS1';

       

       

      --**Oracle表空間增長數據文件(擴展表空間)

       

      監控表空間的使用是DBA的平常工做之一,Oracle擴展表空間很簡單,通常有擴展某個數據文件大小或增長新的數據文件兩種辦法。舉例說明以下。

      首先咱們要獲取某個表空間的數據文件信息:

      select file_name,file_id,tablespace_name,bytes/1024/1024 from dba_data_files
      order by file_name;

      根據file_id擴展某個數據文件大小:

      alter database datafile 12 resize 13312m;

      要注意的是,若是使用裸設備,通常要先查看LV是否足夠,不然以上擴展命令可能出錯,查看方式以下:

      查看VG信息:

      ERPDB1@/home/oracle>lsvg
      rootvg
      oraclevg

      查看VG的LV:

      ERPDB1@/home/oracle>lsvg -l oraclevg
      oraclevg:
      LV NAME             TYPE       LPs   PPs   PVs  LV STATE      MOUNT POINT
      db_oravote          raw        1     1     1    closed/syncd  N/A
      db_oraocr           raw        1     1     1    closed/syncd  N/A
      db_system           raw        3     3     1    open/syncd    N/A
      db_sysaux           raw        5     5     1    open/syncd    N/A
      db_undotbs1         raw        3     3     1    open/syncd    N/A
      db_undotbs2         raw        3     3     1    open/syncd    N/A
      db_temp             raw        46    46    1    closed/syncd  N/A

      db_erp_ht2          raw        56    56    1    open/syncd    N/A
      db_erp2             raw        72    72    1    open/syncd    N/A

      查看VG的詳細信息:

      ERPDB1@/home/oracle>lsvg oraclevg
      VOLUME GROUP:       oraclevg                 VG IDENTIFIER:  00c65fbf00004c000000011697e0f5f9
      VG STATE:           active                   PP SIZE:        256 megabyte(s)
      VG PERMISSION:      read/write               TOTAL PPs:      2328 (595968 megabytes)
      MAX LVs:            512                      FREE PPs:       1146 (293376 megabytes)
      LVs:                57                       USED PPs:       1182 (302592 megabytes)
      OPEN LVs:           39                       QUORUM:         5
      TOTAL PVs:          8                        VG DESCRIPTORS: 8
      STALE PVs:          0                        STALE PPs:      0
      ACTIVE PVs:         8                        AUTO ON:        no
      Concurrent:         Enhanced-Capable         Auto-Concurrent: Disabled
      VG Mode:            Concurrent
      Node ID:        1                        Active Nodes:
      MAX PPs per VG:     130048
      MAX PPs per PV:     1016                     MAX PVs:        128
      LTG size (Dynamic): 1024 kilobyte(s)         AUTO SYNC:      no
      HOT SPARE:          no                       BB POLICY:      relocatable

      這裏可見還有1146個可用的pp ,根據pp size能計算出VG的容量。

      查看某個LV的詳細信息:

      ERPDB1@/home/oracle>lslv db_erp2
      LOGICAL VOLUME:     db_erp2                VOLUME GROUP:   oraclevg
      LV IDENTIFIER:      00c65fbf00004c000000011697e0f5f9.44 PERMISSION:     read/write
      VG STATE:           active/complete        LV STATE:       opened/syncd
      TYPE:               raw                    WRITE VERIFY:   off
      MAX LPs:            512                    PP SIZE:        256 megabyte(s)
      COPIES:             1                      SCHED POLICY:   parallel
      LPs:                72                     PPs:            72
      STALE PPs:          0                      BB POLICY:      relocatable
      INTER-POLICY:       minimum                RELOCATABLE:    no
      INTRA-POLICY:       middle                 UPPER BOUND:    128
      MOUNT POINT:        N/A                    LABEL:          None
      MIRROR WRITE CONSISTENCY: off
      EACH LP COPY ON A SEPARATE PV ?: no
      Serialize IO ?:     NO
      DEVICESUBTYPE : DS_LVZ

      注意這裏能夠根據pp 的數量和大小計算能提供的容量。

      擴展某個LV,增長32個pp :

      p5a1@/orabak/arch/transmited#extendlv db_erp_cw 32
      p5a1@/orabak/arch/transmited#ls -l /dev/rdb_erp_cw
      crw-rw----   1 oracle   dba          53, 35 Dec 02 2007  /dev/rdb_erp_cw

      LV增長了之後,就能夠用上面的命令擴展對應的數據文件了。

      若是要新增LV,則通常這樣操做:

      p5a1@/#mklv -y db_erp_index2 -T O -w n -t raw -s n -r n oraclevg 156

      p5a1@/#chown oracle.dba /dev/rdb_erp_index2
      p5a1@/#ls -l /dev/rdb_erp_index2
      crw-rw----   1 oracle   dba          53, 58 Mar 26 20:02 /dev/rdb_erp_index2

      而後增長數據文件:

      SQL> ALTER TABLESPACE erp_index ADD DATAFILE '/dev/rdb_erp_index2' SIZE 4096m;

      Tablespace altered.

      若是是ASM環境,查看可用空間和爲表空間增長數據文件的腳本以下:

      select group_number,name,total_mb,free_mb from v$asm_diskgroup;

      ALTER TABLESPACE erp_index ADD DATAFILE '+DATA' SIZE 4096m;

      單個數據文件的大小對性能基本沒什麼影響,單個數據文件過大就是可能有管理維護方面的潛在問題,好比數據文件損壞帶來的數據損失。

       

       

       

      --**根據sql_id來得到sql文本

       

      select sql_text from v$sql where sql_id='064wqx7c5b81z';

      select sql_text from v$sqltext where sql_id='064wqx7c5b81z';

       

       

      --** 找出用戶及系統權限的信息:

       

      Col what_granted for a30

      Col GRANTEE for a20

      select b.privilege what_granted,

      b.admin_option, a.username

      from sys.dba_users a, sys.dba_sys_privs b

      where a.username = b.grantee

      order by 1,2;

      /*

      select privilege what_granted,

      admin_option, grantee

      from sys.dba_sys_privs

      where not exists

      (select 'x' from sys.dba_users

      where username = grantee)

      order by 1,2;

      */

       

      --** 找出用戶及角色的信息:

       

      COL granted_role for a50

      select b.granted_role ||decode(admin_option, 'YES', ' (With Admin Option)', null) granted_role, a.username FROM sys.dba_users a, sys.dba_role_privs b

      where a.username = b.grantee order by 1;

       

      --** 找出授予角色的權限信息:

       

      COL what_granted for a50

      select granted_role || decode(admin_option, 'YES', ' (With Admin Option)', null) what_granted, grantee

      from sys.dba_role_privs

      where not exists (select 'x' from sys.dba_users where username = grantee)

      order by 1;

       

      --** 找出數據庫安全信息:

       

      select a.username, b.granted_role || decode(admin_option,'YES',

      ' (With Admin Option)',null) what_granted

      from sys.dba_users a, sys.dba_role_privs b

      where

      a.username = upper('&&user_name') AND

      a.username = b.grantee

      UNION

      select a.username, b.privilege || decode(admin_option,'YES',

      ' (With Admin Option)', null) what_granted

      from sys.dba_users a, sys.dba_sys_privs b

      where

      a.username = upper('&&user_name') AND

      a.username = b.grantee

      UNION

      select a.username,

      b.table_name || ' - ' || b.privilege

      || decode(grantable,'YES',

      ' (With Grant Option)',null) what_granted

      from sys.dba_users a, sys.dba_tab_privs b

      where

      a.username = upper('&&user_name') AND a.username = b.grantee

      order by 1;

       

       

      --** Oracle用戶及默認表空間:

       

      col PROFILE for a20

      col temporary_tablespace for a20

      col DEFAULT_TABLESPACE for a20

      select username, profile, default_tablespace,

      temporary_tablespace, created

      from sys.dba_users

      order by username;

       

      select username from

      dba_users

      where default_tablespace =

      'SYSTEM';

      select username from

      dba_users

      where temporary_tablespace =

      'SYSTEM';

       

       

      --** 產生無效對象編譯腳本:

       

      SELECT 'PROMPT Compile VIEW ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER VIEW ' || OBJECT_NAME || ' COMPILE;' || CHR(10)

      || 'SHOW ERRORS;' || CHR(10) "--COMPILE VIEW "

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'VIEW'

      ORDER BY OBJECT_NAME;

       

      SELECT 'PROMPT Compile TRIGGER ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER TRIGGER ' || OBJECT_NAME || ' COMPILE;' || CHR(10)

      || 'SHOW ERRORS;' || CHR(10) "--COMPILE TRIGGER "

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'TRIGGER'

      ORDER BY OBJECT_NAME;

       

      COL –Compile_PROCEDURE for a80

      SELECT 'PROMPT Compile PROCEDURE ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER PROCEDURE ' || OBJECT_NAME || ' COMPILE;' || CHR(10)

      || 'SHOW ERRORS;' || CHR(10) "—COMPILE_PROCEDURE "

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'PROCEDURE'

      ORDER BY OBJECT_NAME;

       

      SELECT 'PROMPT Compile FUNCTION ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER FUNCTION ' || OBJECT_NAME || ' COMPILE;' || CHR(10)

      || 'SHOW ERRORS;' || CHR(10) "--COMPILE FUNCTION "

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'FUNCTION'

      ORDER BY OBJECT_NAME;

       

      SELECT 'PROMPT Compile PACKAGE ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER PACKAGE ' || OBJECT_NAME || ' COMPILE;' || CHR(10)

      || 'SHOW ERRORS;' || CHR(10) "--COMPILE PACKAGE "

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'PACKAGE'

      ORDER BY OBJECT_NAME;

       

      --** 列出表與同義詞信息:

       

      column owner format a15 heading 'Synonym Owner'

      column table_owner format a12 heading 'Object Owner'

      column table_name format a30 heading 'Object Name'

      column table_type format a6 heading 'Type'

      column synonym_name format a30 heading 'Synonym Name'

      column db_link format a18 heading 'DB Link'

       

      break on owner skip page on table_type on table_owner skip 1

       

      select ds.owner,

      table_owner,

      substr(dc.table_type,1,1) table_type,

      ds.table_name,

      synonym_name,

      db_link

      from sys.dba_synonyms ds,

      sys.dba_catalog dc

      where ds.table_owner = upper('&&user_name') and

      ds.table_owner = dc.owner

      and ds.table_name = dc.table_name ;

       

      SELECT 'PROMPT Compile PACKAGE BODY ' || OBJECT_NAME || ' ...' || CHR(10) ||

      'ALTER PACKAGE ' || OBJECT_NAME || ' COMPILE BODY;'

      || CHR(10) || 'SHOW ERRORS;' || CHR(10) "--COMPILE BODY"

      FROM DBA_OBJECTS

      WHERE STATUS <> 'VALID'

      AND OBJECT_TYPE = 'PACKAGE BODY'

      ORDER BY OBJECT_NAME;

       

      --** 產生重建索引腳本:

       

      /* 本命令所產生的腳本不要試圖運行,由於可能影響當前Oracle的運行 */

      select    'alter index "'||owner||'"."'||index_name||

              '" rebuild nologging compute statistics;' cmd

      from    dba_indexes

      where    status = 'UNUSABLE'

      union

      select    'alter index "'||index_owner||'"."'||index_name||

              '" rebuild partition "'||partition_name||

              '" nologging compute statistics;' cmd

      from    dba_ind_partitions

      where    status = 'UNUSABLE'

      union

      select    'alter index "'||index_owner||'"."'||index_name||

              '" rebuild subpartition "'||subpartition_name||';' cmd

      from    dba_ind_subpartitions

      where    status = 'UNUSABLE'

      order by 1 ;

       

       

      --** 應用系統表分區狀況*

       

      SELECT TABLE_OWNER "表全部者" ,TABLE_NAME "表名" ,

      PARTITION_NAME "分區名"

      from dba_tab_partitions

      WHERE TABLE_OWNER = upper('&&user_name');

       

       

      --** 應用系統索引分區狀況*

       

       

      SELECT INDEX_OWNER ,

      INDEX_NAME ,PARTITION_NAME ,TABLESPACE_NAME

      FROM dba_ind_partitions

      WHERE INDEX_OWNER = upper('&&user_name') ;

       

       

      --** 多餘索引報告:

       

      COLUMN table_owner FORMAT a10 HEADING 'Table|Owner'

      COLUMN table_name FORMAT a30 word_wrapped HEADING 'Table Name'

      COLUMN index_name FORMAT a30 word_wrapped HEADING 'Index Name'

      COLUMN index_cols FORMAT a30 word_wrapped HEADING 'Index Columns'

      column redun_index FORMAT a30 word_wrapped HEADING 'Redundant Index'

      COLUMN redun_cols FORMAT a30 word_wrapped HEADING 'Redundant Columns'

       

      clear breaks

      break on owner skip 0

       

      TTITLE -

      center 'Redudnant Index Analysis' skip 1 -

      center '~~~~~~~~~~~~~~~~~~~~~~~~' skip 2

       

      SELECT ai.table_owner table_owner,

      ai.table_name table_name,

      ai.index_name index_name,

      ai.columns index_cols,

      bi.index_name redun_index,

      bi.columns redun_cols

      FROM

      ( SELECT a.table_owner,

      a.table_name,

      a.index_name,

      MAX(DECODE(column_position, 1,

      SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 2,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 3,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 4,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 5,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 6,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 7,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 8,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 9,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,10,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,11,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,12,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,13,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,14,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,15,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,16,',

      '||SUBSTR(column_name,1,30),NULL)) columns

      FROM dba_ind_columns a

      WHERE a.index_owner = upper('&&user_name')

      GROUP BY a.table_owner,

      a.table_name,

      a.index_owner,

      a.index_name) ai,

      ( SELECT b.table_owner,

      b.table_name,

      b.index_name,

      MAX(DECODE(column_position, 1,

      SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 2,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 3,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 4,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 5,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 6,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 7,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 8,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position, 9,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,10,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,11,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,12,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,13,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,14,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,15,',

      '||SUBSTR(column_name,1,30),NULL)) ||

      MAX(DECODE(column_position,16,',

      '||SUBSTR(column_name,1,30),NULL)) columns

      FROM dba_ind_columns b

      GROUP BY b.table_owner,

      b.table_name,

      b.index_owner,

      b.index_name ) bi

      WHERE ai.table_owner = bi.table_owner

      AND ai.table_name = bi.table_name

      AND ai.columns LIKE bi.columns || ',%'

      AND ai.columns <> bi.columns

      ORDER BY ai.table_owner,

      ai.table_name,

      bi.index_name

      /

       

       

       

      --** 查詢全部做業信息

       

       

      Select job,next_sec,failures ,broken from DBA_jobs

      WHERE LOG_USER= upper('&&user_name');

       

      --** 查詢全部快照信息:

       

       

      SELECT OWNER ,NAME , TABLE_NAME , REFRESH_METHOD ,

      LAST_REFRESH , ERROR , NEXT ,START_WITH

      FROM DBA_SNAPSHOTS

      WHERE OWNER= upper('&&user_name');

       

       

      --** 導出用戶存儲過程:

       

      --set lines 9999 trimsp on pages 0 echo off feed off ver off sqlbl on

      set heading off

      select decode(line,1,'create or replace '||text,text)

      from DBA_source where owner = upper('&&user_name')

      order by owner,name,line

      set heading on

       

       

      --** 導出用戶包:

       

      /* 太長的結果致使查詢無效 :

      ORA-01489: result of string concatenation is too long

      */

      set lines 9999 trimsp on pages 0 echo off feed off ver off sqlbl on

      set heading off

      select decode(line,1,'create or replace '||text,text)

      from DBA_source

      where owner = upper('&&user_name')

      and type = 'PACKAGE'

      order by line;

       

       

      --** 導出用戶包體:

       

       

      prompt

      select decode(line,1,'create or replace '||text,text)

      from DBA_source

      where owner = upper('&&user_name')

      and type = 'PACKAGE BODY'

      order by line;

      set heading on

      --

       

       

      --** 導出用戶觸發器:

       

       

      select 'select dbms_metadata.get_ddl('||chr(39)||'PROCEDURE'||chr(39)||','

      ||chr(39)|| object_name ||chr(39)||','||chr(39)||owner||chr(39)||') from dual ;'

      from dba_objects

      where owner='&&user_name' AND object_type='TRIGGER'

      /

       

      --**undo 表空間的認識

       

    4. 首先要描述undo segment的結構是怎麼樣的
      undo segment分兩個部分,一個是undo segment head,還有一個undo segment block(事務槽)
      undo segment head中包含了這個回滾段的事務信息,並且有一個指針指向undo segment block
      2。一個完成事務在undo segment的過程

      undo segment block就是包含數據塊的前映象,這也是爲何 head會有一個指針指向block的緣由,否者事務沒法對應。

      不僅如此,在事務開始以前,必須在undo得到一個事務槽(事務槽是在undo segment head分配的),這樣在須要修改的塊的ITL(ITL其實也是一個head)也有事務信息指象這個分配的undo segment head,這樣一個完整的事務就所有對應起來了。

      事務在未完成前,也就是沒有commit,那麼在塊的ITL和undo segment head始終標識爲active,若是完成了commit,則在UNDO segment head標識這個事務爲inactive,而後進行塊清除。(所謂塊清除是:由於ITL包含的是一個塊的活動的事務信息,當你完成了COMMIT,固然要把這個塊上的事務對應的信息清除。)
      注意:首先要注意,undo segment head有一個latch,也就是有鎖,當你有新事務想要分配一個undo segment block,首先要在undo segment head註冊這個信息,因爲undo segment head是不能同時被幾個事務同時修改,(爲了保護總體結構不出現混亂),因此須要這個latch。

      undo segment 的訪問是由oracle自己根據segment的繁忙程度自動分配的(固然也能夠你指定)。

      因爲latch是必定要串行執行的,因此若是一個undo segment 若是同時的請求的事務不少,就會存在排隊的現象。這也是爲何須要多個undo segment的根本緣由。

      那麼問題出來了:
      咱們到底須要幾個undo segment 來保證事務在分配的過程不會出現等待,或者說不會對數據庫的運行形成影響。

      你一段時間內會有幾個事務? total
      通常來講保證一個segment一段時間內不超過5個事務
      segment N=total/5 (N就是你須要的回滾段個數)

      3。undo segment的設置和建立問題

      (1 optsize
      (2 shrinks,waits
      (3 視圖:v$waitstat ,v$rollstat

      先來談談第一個optsize問題:
      首先要理解既然UNDO SEGMENT是循環使用的,那麼爲何UNDO SEGMENT又要擴展呢?
      由於當一個UNDO SEGMENT在未完成COMMIT的時候是不能重用的,由於一旦重用就會覆蓋了未完成COMMIT的活動信息。因此當一個SEGMENT出現未提交的數據時,並且SEGMENT大小到達了你設置的最大UNDO SEGMENT大小時是不能重用的,這個時候就是繼續擴展這個SEGMENT。
      這也是爲何須要OPTSIZE這個參數的根本緣由。 既然有擴展,就必須收縮。OPTSIZE這個參數就是當擴展的大小超過了OPTSIZE時,收縮開始了。(這會出現問題,第4個問題會解釋)
      我的認爲這也是爲何一個UNDO SEGMENT中事務儘可能少於5個的根本緣由,若是有不少事務出如今這個UNDO SEGMENT,那麼確定會出現沒有COMMIT的,那麼收縮的成功率將很是小,由於一直存在活動的事務是不能收縮的。這有可能致使UNDO SEGMENT一直擴展而佔滿你的硬盤空間。
      再來談談第二個問題:shrinks (收縮的意思啊)
      若是在v$rollstat出現收縮的次數很是多,這就說明你開始設置的UNDO SEGMENT大小不能知足要求。否者爲何須要去擴展?
      若是waits的數字大於0 ,就說明UNDO SEGMENT的個數太少,因爲每一個UNDO SEGMENT都處於繁忙狀態,當出現新事務的時候必須選擇一個UNDO SEGMENT,因爲很繁忙,必然出現等待。若是多有幾個UNDO SEGMENT就可能不會出現這個問題了。 至少事務可否平均分佈,而不會出現繁忙的狀況。
      4。 最後來談談關於UNDO SEGMENT出現的錯誤問題
      所謂錯誤也就是UNDO SEGMENT大小不夠用,爲何會出現不夠用呢? 或許你會說個人UNDO SEGMENT設置很大啊! 你的系統或許有不少事務,有可能這些事務很小,忽然有一個很大的出來了。須要不少UNDO SEGMENT空間, 固然這個狀況比較少。

      這個時候能夠把SEGMENT設置再大點,這樣好嗎? 很差,由於就是一個二個事務比較大,不必增長整個UNDO SEGMENT,解決方法能夠本身創建一個比較大的UNDO SEGMENT, 指定這個大事務在這個UNDO SEGMENT運行。或者擴大OPTIMAL參數.

      undo 表空間應該是限制大小的,通常用個10g左右,也最好建立兩個undo tablespace,數據庫出問題時,也能夠進行切換undo
      0)表空間管理應該採用local 的管理方式
      0)段空間管理採用mannul管理方式,這也是oracle對undo tablespace默認的管理方式
      0)還有undo_management = AUTO
      0)undo_retention設置能夠比默認值稍微小一些,這樣也有利於undo tablespace的空間回收

       

      --**AWR使用多少空間?

       

      Select occupant_name, occupant_desc, space_usage_kbytes from v$sysaux_occupants where occupant_name like '%AWR%' ;

       

      --**查看SGA內存分配的細節

       

      select * from v$sgastat

       

      --**查看SGA內存分配

       

      select * from v$sga;

       

       

      --**使用新的V$DB_CACHE_ADVICE視圖來幫助改變數據緩存的大小

       

      column buffers_for_estimate format 999,999,999 heading 'Buffers'

      column estd_physical_read_factor format 999.90 heading 'Estd Phys|Read Fact'

      column estd_physical_reads format 999,999,999 heading 'Estd Phys| Reads'

       

      SELECT size_for_estimate, buffers_for_estimate,

      estd_physical_read_factor, estd_physical_reads

      FROM V$DB_CACHE_ADVICE

      WHERE name = 'DEFAULT'

      AND block_size =

      (SELECT value

      FROM V$PARAMETER

      WHERE name = 'db_block_size')

      AND advice_status = 'ON';

       

       

      --**查看全部session正在等待的,已經發生的等待事件

       

      在V$SESSION_WAIT中找到的東西如今在V$SESSION中也能夠找到。

      WAIT_TIME = 0 means that it's waiting
      WAIT_TIME > 0 means that it previously waited this many ms

       

      select event, sum(decode(wait_time,0,1,0)) "Waiting Now",

      sum(decode(wait_time,0,0,1)) "Previous Waits",

      count(*) "Total"

      from v$session_wait

      group by event

      order by count(*);

       

      --**針對全部session找出這兩個等待事件對應的段名和段類型。

       

      SELECT /*+ ordered */ sid, event, owner, segment_name, segment_type,p1,p2,p3

      FROM v$session_wait sw, dba_extents de

      WHERE de.file_id = sw.p1

      AND sw.p2 between de.block_id and de.block_id+de.blocks - 1

      AND (event = 'buffer busy waits' OR event = 'write complete waits')

      AND p1 IS NOT null

      ORDER BY event,sid;

      找出這兩個等待事件對應的段名和段類型。

      從歷史表中取值,不只僅是當前buffer中的數據。

       

       

      --**查找P1, P2, P3表明什麼--查詢 V$EVENT_NAME

       

      col name for a30

      col p1 for a10

      col p2 for a10

      col p3 for a10

      select event#,name,parameter1 p1,parameter2 p2,parameter3 p3

      from v$event_name

      where name in ('buffer busy waits', 'write complete waits');

       

       

      --**會話開始後的全部等待數--查詢 V$SESSION_EVENT

       

      select sid, event, total_waits, time_waited, event_id

      from v$session_event

      where time_waited > 0

      order by time_waited;

      一共多少個session發生過等待事件

      select distinct(sid) from v$session_event where time_waited>0;

       

       

      --**全部會話等待數

       

      select sid, wait_class, total_waits

      from v$session_wait_class order by sid;

       

      --**查看系統等待數v$system_wait_event

       

      select wait_class, total_waits

      from v$system_wait_class

      order by total_waits desc;

       

       

      ---**用戶SCOTT的系統級權限

       

      select b.privilege what_granted,b.admin_option, a.username

      from sys.dba_users a, sys.dba_sys_privs b

      where a.username = b.grantee

      and username='SCOTT'

      order by 1,2;

       

      --**用戶SCOTT的對象級權限

       

      select b.owner || '.' || b.table_name obj,

      b.privilege what_granted, b.grantable,a.username

      from sys.dba_users a, sys.dba_tab_privs b

      where a.username = b.grantee

      and a.username='SCOTT'

      order by 1,2,3;

       

       

      ---**用戶SCOTT的角色

       

      select b.granted_role ||decode(admin_option,'YES','(With Admin Option)',null)

      what_granted from sys.dba_users a,sys.dba_role_privs b

      where a.username=b.grantee

      and username='SCOTT'

      order by 1;

       

      --**用戶SCOTT的全部權限

       

      select a.username,

      b.granted_role || decode(admin_option,'YES',' (With Admin Option)',null)

      what_granted

      from sys.dba_users a, sys.dba_role_privs b

      where a.username = b.grantee

      and username='SCOTT'

      UNION

      select a.username,

      b.privilege || decode(admin_option,'YES',' (With Admin Option)', null)

      what_granted

      from sys.dba_users a, sys.dba_sys_privs b

      where a.username = b.grantee

      and username='SCOTT'

      UNION

      select a.username,

      b.table_name || ' - ' || b.privilege|| decode(grantable,'YES',' (With Grant Option)',null) what_granted

      from sys.dba_users a, sys.dba_tab_privs b

      where a.username = b.grantee

      and username='SCOTT'

      order by 1;

       

       

      --**查詢用戶名及相應的配置文件、默認的表空間和臨時表空間

       

      Select username, profile, default_tablespace,

      temporary_tablespace, created

      from sys.dba_users

      where username='SCOTT'

      order by username;

       

       

      --**查詢顯示了整個系統在總體上的等待數

       

      Select event, total_waits,

      total_timeouts,(time_waited / 100) tot_time,

      (average_wait / 100) Avg_time

      from v$system_event

      order by total_waits desc;

       

      ---**查全部/某個段的狀態

       

      select object_name, statistic_name, value

      from v$segment_statistics

      where value > 100

      order by value;

       

       

      --**查找使用多會話的用戶

       

      select username, count(*)

      from v$session

      group by username;

       

      V$SESSION視圖中用戶名NULL的行是Oracle的後臺進程。

      技巧:

      肯定使用了多會話的用戶,並斷定是一個管理問題(用戶使用了多終端)仍是一個系統問題(會話沒有被清除,或者產生了多餘的進程)。

       

       

      --**關閉有問題的會話

       

      select username, sid, serial#, program, terminal

      from v$session

      where username is not null;

      alter system kill session '144,9';

      咱們發現當一個session被kill掉之後,該session的paddr被修改,若是有多個session被kill,那麼多個session
      的paddr都被更改成相同的進程地址:

      在這種狀況下,不少時候,資源是沒法釋放的,咱們須要查詢spid,在操做系統級來kill這些進程.

      可是因爲此時v$session.paddr已經改變,咱們沒法經過v$session和v$process關聯來得到spid

      那還能夠怎麼辦呢?

      如今咱們得到了進程地址,就能夠在v$process中找到spid,而後可使用Kill或者orakill在系統級來殺掉這些進程.

      當在Oracle中kill session之後, Oracle只是簡單的把相關session的paddr 指向同一個虛擬地址.

      此時v$process和v$session失去關聯,進程就此中斷.

      而後Oracle就等待PMON去清除這些Session.因此一般等待一個被標記爲Killed的Session退出須要花費很長的時間.

      若是此時被Kill的process,從新嘗試執行任務,那麼立刻會收到進程中斷的提示,process退出,此時Oracle會當即啓動PMON
      來清除該session.這被做爲一次異常中斷處理.

       

       

      --**查詢產生鎖的用戶鎖sql

       

      select a.username username, a.sid sid, a.serial# serial,b.id1 id1, c.sql_text sqltext
      from v$session a, v$lock b, v$sqltext c
      where b.id1 in
         (select distinct e.id1
         from v$session d, v$lock e
         where d.lockwait = e.kaddr)
         and a.sid = b.sid
         and c.hash_value = a.sql_hash_value
         and b.request = 0;

       

      select /*+ ordered */ username, v$lock.sid, trunc(id1/power(2,16)) rbs,

      bitand(id1,to_number('ffff','xxxx'))+0 slot,id2 seq, lmode, request

      from v$lock, v$session

      where v$lock.type = 'TX'

      and v$lock.sid = v$session.sid;

       

      查詢 的是行級排他鎖。

       

       

      --**查找用戶正在訪問的對象

       

      一旦發現某些用戶或者系統中的查詢存在問題,查詢V$ACCESS能夠爲您指出有潛在問題的對象(可能缺乏索引)。當想修改一個特殊的對象,或者須要知道在一個給定的時間點上誰在使用該對象時,它也很是有幫助。

      select a.sid, a.username, b.owner, b.object, b.type

      from v$session a, v$access b

      where a.sid = b.sid

      and username='SCOTT'

      /

      用戶正在訪問的對象。對於已經訪問過的對象,不會出如今結果集中。

       

      經過查詢V$ACCESS視圖可查看在給定的時間點上用戶所訪問的全部對象。這有助於查明有問題的對象,在想修改一個特定的對象時也頗有用(查找誰在訪問它)。然而,當系統有一個很大的共享池和數百個用戶時,這個操做的開銷將很大。

       

      得到詳細的用戶信息

      select a.username, c.name, sum(b.value) value

      from v$session a, v$sesstat b, v$statname c

      where a.sid = b.sid

      and b.statistic# = c.statistic#

      and b.value != 0

      and username='SCOTT'

      group by name, username;

       

       

      --**將V$SESSION和V$SQLTEXT鏈接就能夠顯示目前每個會話正在執行的SQL語句

       

      select a.sid, a.username, s.sql_id

      from v$session a, v$sqltext s

      where a.sql_address = s.address

      and a.sql_hash_value = s.hash_value

      order by a.username, a.sid, s.piece;

       

       

      --**顯示每一個會話的物理磁盤命中率和內存命中率

       

      這就很是容易發現哪些用戶執行了大量的物理磁盤和內存讀操做。

       

      select a.username, b.block_gets, b.consistent_gets,

      b.physical_reads, b.block_changes, b.consistent_changes

      from v$session a, v$sess_io b

      where a.sid = b.sid

      order by a.username;

       

       

      --**查詢到正在運行的事務

       

      用以下SQL查詢到正在運行的事務,如其used_urec字段不斷增長,說明該事物正在繼續,若是該字段不斷降低,說明該事物正在回滾。

      SQL> SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk

      FROM v$session a, v$transaction b

      WHERE a.saddr = b.ses_addr;

       

      根據session id能夠查到當前session正在執行的事務信息

      select * from v$transaction where addr in (select taddr from v$session where sid=&sid );

       

       

      --**USED_UBLK和USED_UREC能夠看到事務進行到什麼程度了

       

       

      select a.sid,a.serial#,a.user#,a.username,b.addr,b.USED_UBLK,b.USED_UREC from v$transaction b,v$session a where b.addr in (select a.taddr from v$session a where a.sid = &sid);

      USED_UBLK和USED_UREC能夠看到事務進行到什麼程度了

      重複查詢這兩個值,能夠看到變化,能夠估計事務的進度,尤爲是長時間的回滾操做,當這兩個值爲0,回滾也就完成了

       

       

      --**查看當前用戶的spid

       

      select spid from v$process p, v$session s where s.audsid=userenv('sessionid') and s.paddr=p.addr;

       

      select spid from v$process p join v$session s on p.addr=s.paddr and s.audsid=userenv('sessionid');

       

      --**查看當前用戶的trace file路徑

      /*

      select p.value || '\' || t.instance || '_ora_' || ltrim(to_char(p.spid,'fm99999')) || '.trc'

      from v$process p, v$session s, v$parameter p, v$thread twhere p.addr = s.paddr and s.audsid= userenv('sessionid') and p.name = 'user_dump_dest';

      */

       

       

      --**肯定SCN

       

      select a.name,a.checkpoint_change# start_SCN

      ,b.checkpoint_change# last_SCN

      from v$datafile_header a, v$datafile b

      where a.file#=b.file#

       

      --**查看歸檔日誌信息

       

      select name,completion_time,status from v$archived_log;
      STATUS=A Available,表示歸檔日誌文件有效
      STATUS=U Unavailable,表示歸檔日誌文件無效
      STATUS=D Deleted,表示歸檔日誌已經被刪除
      STATUS=X eXpired,表示歸檔日誌被用戶使用操做系統的命令刪除了

       

       

      --**查看重作日誌信息

       

      select MEMBER,GROUP#,STATUS from v$logfile;

      status null表示在使用

       

      select MEMBERS,GROUP#,STATUS from v$log;

       

      MEMBERS GROUP# STATUS

      ---------- ---------- ----------

      3 1 ACTIVE

      3 2 ACTIVE

      3 3 CURRENT



      --**

      根據SID找SPID

       

      select pro.spid from v$session ses,v$process pro where ses.sid=xxx and ses.paddr=pro.addr;

       

      --**根據SPID找SID,SERIAL

       

      select s.sid,s.serial# from v$session s,v$process p where s.paddr=p.addr and p.spid='xxx';

       

      --**根據PID找SID

       

      SELECT SID,SERIAL#, USERNAME,MACHINE
      FROM v$session b
      WHERE b.paddr = (SELECT addr
      FROM v$process c
      WHERE c.spid = '&pid');

       

      ----oracle 經過pid 找到sid 再找出執行sql

       

      經過sid找出執行的sql語句

      1 SELECT SID,SERIAL#, USERNAME,MACHINE 
      FROM v$session b 
      WHERE b.paddr = (SELECT addr 
      FROM v$process c 
      WHERE c.spid = '&pid');

       

      2 select sql_address,sql_hash_value,sql_id from v$session where sid=20;

      3 select sql_fulltext from V$sqlarea where sql_id='301r15qus4kp1'

       

       

       

      ---**當下的等待

       

      select wait_class, event, sid, state, wait_time, seconds_in_wait

      from v$session_wait

      where wait_class='Application'

      order by wait_class, event, sid;

       

      select wait_class, event, sid, state, wait_time, seconds_in_wait

      from v$session_wait

      order by wait_class, event, sid;

       

      ---**查詢那些應用的鏈接數此時是多少
      select b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE , b.PROGRAM order by count(*) desc;

       

       

       

      ---**查看是否有死鎖

       

      select * from v$locked_object;

      若是查詢結果爲no rows selected,說明數據庫中沒有死鎖。不然說明數據庫中存在死鎖

       

      --**請問如何分辨某個用戶是從哪臺機器登錄ORACLE的?

       

      SELECT machine , terminal FROM V$SESSION;

      --* 根據sid查看sql語句

      Select sql_fulltext from v$sqlarea where sql_id='7pww837hx8qj5';

       

      --求對象的建立代碼

       

      column column_name format a36
        column sql_text format a99
        select dbms_metadata.get_ddl('TABLE','&1') from dual;
        select dbms_metadata.get_ddl('INDEX','&1') from dual;

       

      --查看數據庫本次啓動的時間

       

      Select startup_time from v$instance; 固然 從還原中恢復的時間是不算得

       

      --根據SID找SQL

       

      select b.sql_text "SQL Text"
      from v$session a, v$sqltext b
      where a.sql_address = b.address
      and a.sql_hash_value = b.hash_value
      and (a.SID = &sid)
      order by piece;

       

       

       

      ---*檢查一個表對應的索引和索引對應的列

       

      select index_name,table_name,column_name from user_ind_columns

        where table_name=upper('categoryarticleassign');

相關文章
相關標籤/搜索