Oracle dba的日常

数据库管理员日常工作中必备的sql列表

 

 

--**** 数据库实例基本情况

 

 

--** ORACLE系统实例名字:

 

select NAME ,CREATED ,LOG_MODE ,

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

from v$database;

 

--** ORACLE实例安装的产品列表:

 

 

COL PARAMETER for a40

COL VALUE for a30

select * from v$option;

 

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

 

col BANNER for a60

select BANNER from v$version;

 

--** 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

 

1、 在AIX系统中用TOPAS命令查看

发现user中的cpu过高,其中oracle的进程CPU比较高。

比如oracle其中最高的进程pid为1138782 占CPU 27%

2、 根据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

3、 根据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 }

      3、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');

转载于:https://www.cnblogs.com/Jace06/p/8657616.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值