Oracle DBA日常维护SQL脚本_自己编写的

查询碎片程度高(实际使用率小于30%)的表,也就是可以收缩的表
条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的block大小了,见create table storged的NEXT参数),5个block相对于几行小表数据来说就相差太大了
算法中/0.9是因为块的pfree一般为10%,所以一个块最多只用了90%,而且一行数据大于8KB时容易产生行链接,把一行分片存储,一样的一个块连90%都用不满
AVG_ROW_LEN还是比较准的,比如个人实验情况一表6个字段,一个number,其他5个都是char(100)但是实际数据都是’1111111’7位,AVG_ROW_LEN显示依然为513
SELECT TABLE_NAME,(BLOCKS8192/1024/1024)“理论大小M”,
(NUM_ROWS
AVG_ROW_LEN/1024/1024/0.9)“实际大小M”,
round((NUM_ROWSAVG_ROW_LEN/1024/1024/0.9)/(BLOCKS8192/1024/1024),3)100||’%’ “实际使用率%”
FROM USER_TABLES where blocks>100 and (NUM_ROWS
AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS8192/1024/1024)<0.3
order by (NUM_ROWS
AVG_ROW_LEN/1024/1024/0.9)/(BLOCKS*8192/1024/1024) desc

查询索引碎片的比例(索引删除行数除以索引总行数的百分比>30%即认为索引碎片大),也就是需要重建的索引
select name,del_lf_rows,lf_rows, round(del_lf_rows/decode(lf_rows,0,1,lf_rows)*100,0)||’%’ frag_pct from index_stats where round(del_lf_rows/decode(lf_rows,0,1,lf_rows)*100,0)>30;

集群因子clustering_factor高的表
集群因子越接近块数越好,接近行数则说明索引列的列值相等的行分布极度散列,可能不走索引扫描而走全表扫描
select tab.table_name,tab.blocks,tab.num_rows,ind.index_name,ind.clustering_factor,
round(nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows),3)*100||’%’ “集群因子接近行数”
from user_tables tab, user_indexes ind where tab.table_name=ind.table_name
and tab.blocks>100
and nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows) between 0.35 and 3

select tab.owner,tab.table_name,tab.blocks,tab.num_rows,ind.index_name,ind.clustering_factor,
round(nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows),3)*100||’%’ “集群因子接近行数”
from dba_tables tab, dba_indexes ind where tab.table_name=ind.table_name and tab.owner
not in (‘SYS’,‘SYSTEM’,‘WMSYS’,‘DBSNMP’,‘CTXSYS’,‘XDB’,‘ORDDATA’,‘SYSMAN’,‘CATALOG’,‘APEX_030200’,‘MDSYS’,‘OLAPSYS’,‘EXFSYS’)
and tab.blocks>100
and nvl(ind.clustering_factor,1)/decode(tab.num_rows,0,1,tab.num_rows) between 0.35 and 3

根据sid查spid或根据spid查sid
select s.sid,s.serial#,p.spid,s.terminal,s.LOGON_TIME,s.status,s.PROGRAM,s.CLIENT_IDENTIFIER,s.machine,s.action,s.MODULE,s.PROCESS “客户端机器进程号”,s.osuser from v s e s s i o n s , v session s,v sessions,vprocess p where s.paddr=p.addr and s.sid=XX or p.spid=YY

根据sid查看具体的sql语句(不要加条件v s e s s i o n . s t a t u s = ’ A C T I V E ’ , 比 如 t o a d 对 同 一 数 据 库 开 两 个 连 接 会 话 , 都 执 行 了 一 些 语 句 , 其 中 一 个 窗 口 查 询 s e l e c t ∗ f r o m v session.status=’ ACTIVE’,比如toad对同一数据库开两个连接会话,都执行了一些语句,其中一个窗口查询select * from v session.status=ACTIVE,toadselectfromvsession时会发现另一个窗口在v s e s s i o n . s t a t u s 是 I N A C T I V E , 并 不 代 表 另 一 个 窗 口 没 有 执 行 过 s q l 语 句 , 而 当 前 窗 口 是 a c t i v e 状 态 , 对 应 的 s q l i d 对 应 的 语 句 就 是 s e l e c t ∗ f r o m v session.status是INACTIVE,并不代表另一个窗口没有执行过sql语句,而当前窗口是active状态,对应的sql_id对应的语句就是select * from v session.statusINACTIVEsqlactivesqlidselectfromvsession而不是之前执行过的sql语句,ACTIVE表示当前正在执行sql。一个sid可能执行过很多个sql,所以有时需要的sql通过如下查不到是正常的,比如查询到某死锁源sid,通过如下查询可能只是个select语句,而真正引起死锁的sql却查不到,是因为可能这个sid持续了很长时间,这个sid之前执行的一些sql在vKaTeX parse error: Expected 'EOF', got '#' at position 41: …name,sid,SERIAL#̲,LOGON_TIME,sta…session a,vKaTeX parse error: Expected 'EOF', got '&' at position 117: …alue and a.sid=&̲sid order by pi…session a,v$sql b
where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value and a.sid=&sid

如果上面语句执行太慢,则按如下两步

select sql_hash_value, prev_hash_value, username,sid,SERIAL#,LOGON_TIME,status, PROGRAM,CLIENT_IDENTIFIER,

machine,action,PROCESS “客户端机器进程号”,osuser from v$session where sid=&sid

select sql_fulltext from v$sql where hash_value=XX

–XX为上面 sql_hash_value,如果 sql_hash_value为0,则XX为上面 prev_hash_value

根据spid查询具体的sql语句(不要加条件v s e s s i o n . s t a t u s = ’ A C T I V E ’ , 比 如 t o a d 对 同 一 数 据 库 开 两 个 连 接 会 话 , 都 执 行 了 一 些 语 句 , 其 中 一 个 窗 口 查 询 s e l e c t ∗ f r o m v session.status=’ ACTIVE’,比如toad对同一数据库开两个连接会话,都执行了一些语句,其中一个窗口查询select * from v session.status=ACTIVE,toadselectfromvsession时会发现另一个窗口在v s e s s i o n . s t a t u s 是 I N A C T I V E , 并 不 代 表 另 一 个 窗 口 没 有 执 行 过 s q l 语 句 , 而 当 前 窗 口 是 a c t i v e 状 态 , 对 应 的 s q l i d 对 应 的 语 句 就 是 s e l e c t ∗ f r o m v session.status是INACTIVE,并不代表另一个窗口没有执行过sql语句,而当前窗口是active状态,对应的sql_id对应的语句就是select * from v session.statusINACTIVEsqlactivesqlidselectfromvsession而不是之前执行过的sql语句,ACTIVE表示当前正在执行sql。)
Select ss.SID,ss.SERIAL#,ss.LOGON_TIME,pr.SPID,sa.SQL_FULLTEXT,ss.machine, ss.TERMINAL,ss.PROGRAM,ss.USERNAME,ss.CLIENT_IDENTIFIER,ss.action,ss.PROCESS “客户端机器进程号”, ss.STATUS, ss.OSUSER,ss.status,ss.last_call_et,sa.sql_text
from v p r o c e s s p r , v process pr, v processpr,vsession ss, vKaTeX parse error: Expected 'EOF', got '&' at position 128: …ue and pr.spid=&̲spid 查看历史sessio…ACTIVE_SESSION_HISTORY来查,如下
select a.sql_id,a.machine,a.* from VKaTeX parse error: Expected 'EOF', got '#' at position 70: ….SESSION_SERIAL#̲=12807 查询上面的mac…session s,v$process p where s.paddr=p.addr and s.machine=‘localhost’

通过上面的spid在oracle服务器上执行netstat -anp |grep spid即可
[oracle@dwdb trace]$ netstat -anp |grep 17630
tcp 210 0 192.168.64.228:11095 192.168.21.16:1521 ESTABLISHED 17630/oracleDB
tcp 0 0 ::ffff:192.168.64.228:1521 ::ffff:192.168.64.220:59848 ESTABLISHED 17630/oracleDB
出现两个,说明来自220,连接了228数据库服务器,但是又通过228服务器的dblink去连接了16服务器

查询死锁堵塞的会话sid
最简单的一个SQL
select * from V S E S S I O N B L O C K E R S s e l e c t ∗ f r o m d b a w a i t e r s 最 常 用 的 一 个 S Q L s e l e c t s i d , s t a t u s , L O G O N T I M E , s q l i d , b l o c k i n g s e s s i o n " 死 锁 直 接 源 " , F I N A L B L O C K I N G S E S S I O N " 死 锁 最 终 源 " , e v e n t , s e c o n d s i n w a i t " 会 话 锁 住 时 间 S " , L A S T C A L L E T " 会 话 S T A T U S 持 续 时 间 S " f r o m v SESSION_BLOCKERS select * from dba_waiters 最常用的一个SQL select sid,status,LOGON_TIME,sql_id,blocking_session "死锁直接源",FINAL_BLOCKING_SESSION "死锁最终源",event,seconds_in_wait "会话锁住时间_S",LAST_CALL_ET "会话STATUS持续时间_S" from v SESSIONBLOCKERSselectfromdbawaitersSQLselectsid,status,LOGONTIME,sqlid,blockingsession"",FINALBLOCKINGSESSION"",event,secondsinwait"S",LASTCALLET"STATUSS"fromvsession where state=‘WAITING’ and BLOCKING_SESSION_STATUS=‘VALID’ and FINAL_BLOCKING_SESSION_STATUS=‘VALID’
可以把两者SID放入v s e s s i o n , 发 现 L O G O N T I M E 字 段 F I N A L B L O C K I N G S E S S I O N 比 S I D 要 早 B L O C K I N G S E S S I O N : S e s s i o n i d e n t i f i e r o f t h e b l o c k i n g s e s s i o n . T h i s c o l u m n i s v a l i d o n l y i f B L O C K I N G S E S S I O N S T A T U S h a s t h e v a l u e V A L I D . F I N A L B L O C K I N G S E S S I O N : S e s s i o n i d e n t i f i e r o f t h e b l o c k i n g s e s s i o n . T h i s c o l u m n i s v a l i d o n l y i f F I N A L B L O C K I N G S E S S I O N S T A T U S h a s t h e v a l u e V A L I D . 如 果 遇 到 R A C 环 境 , 一 定 要 用 g v session,发现LOGON_TIME字段FINAL_BLOCKING_SESSION比SID要早 BLOCKING_SESSION:Session identifier of the blocking session. This column is valid only if BLOCKING_SESSION_STATUS has the value VALID. FINAL_BLOCKING_SESSION:Session identifier of the blocking session. This column is valid only if FINAL_BLOCKING_SESSION_STATUS has the value VALID. 如果遇到RAC环境,一定要用gv sessionLOGONTIMEFINALBLOCKINGSESSIONSIDBLOCKINGSESSION:Sessionidentifieroftheblockingsession.ThiscolumnisvalidonlyifBLOCKINGSESSIONSTATUShasthevalueVALID.FINALBLOCKINGSESSION:Sessionidentifieroftheblockingsession.ThiscolumnisvalidonlyifFINALBLOCKINGSESSIONSTATUShasthevalueVALID.RACgv来查,并且执行alter system kill session 'sid,serial#'要到RAC对应的实例上去执行

把上面被堵塞会话的sid代入如下语句,可以发现锁住的对象和对象的哪一行(如果sid是堵塞源的会话,则 row_wait_obj#=-1,表示锁持有者,就是死锁源了 )
select s.sid,s.username,d.owner,d.object_name,s.row_wait_obj#,s.row_wait_row#,s.row_wait_file#,s.row_wait_block# from v$session s,dba_objects d where s.row_wait_obj#=d.object_id and s.sid in(XX,XX)

查询锁住的DDL对象
select d.session_id,s.SERIAL#,d.name from dba_ddl_locks d,v$session s where d.owner=‘MKLMIGEM’ and d.SESSION_ID=s.sid

查询超过两个小时的不活动会话
select s.sid,s.serial#,p.spid,s.LOGON_TIME,s.LAST_CALL_ET,s.status,s.PROGRAM,s.CLIENT_IDENTIFIER,s.machine,s.terminal,s.action,s.PROCESS “客户端机器进程号”,s.osuser from v s e s s i o n s , v session s,v sessions,vprocess p
where s.paddr=p.addr and s.sid in (select sid from v$session where machine<>&DB服务器名称 and status=‘INACTIVE’ and sql_id is null and LAST_CALL_ET>7200)

查询堵塞别的会话超过30分钟且自身是不活动的会话
select username,sid,serial#,status,seconds_in_wait,LAST_CALL_ET from v s e s s i o n w h e r e s i d i n ( s e l e c t F I N A L B L O C K I N G S E S S I O N f r o m v session where sid in (select FINAL_BLOCKING_SESSION from v sessionwheresidin(selectFINALBLOCKINGSESSIONfromvsession where state=‘WAITING’ and BLOCKING_SESSION_STATUS=‘VALID’ and FINAL_BLOCKING_SESSION_STATUS=‘VALID’) and status=‘INACTIVE’ and sql_id is null and seconds_in_wait>1800

查询可能存在连接池空闲初始配置过大的连接(来自同一台机器的同一个程序的状态为INACTIVE的连接非常多)
select count(ss.SID),ss.machine,ss.status,ss.TERMINAL,ss.PROGRAM,ss.USERNAME,ss.CLIENT_IDENTIFIER
from v$session ss group by ss.machine,ss.status,ss.TERMINAL,ss.PROGRAM,ss.USERNAME,ss.CLIENT_IDENTIFIER having count(ss.SID)>10

查询当前正在执行的sql
SELECT s.sid,s.serial#,s.username,spid,v s q l . s q l i d , m a c h i n e , s . t e r m i n a l , s . p r o g r a m , s q l t e x t F R O M v sql.sql_id,machine,s.terminal,s.program,sql_text FROM v sql.sqlid,machine,s.terminal,s.program,sqltextFROMvprocess,v s e s s i o n s , v session s,v sessions,vsql
WHERE addr=paddr and s.sql_id=v$sql.sql_id AND sql_hash_value=hash_value and s.STATUS=‘ACTIVE’

查询正在执行的SCHEDULER_JOB
select owner,job_name,sid,b.SERIAL#,b.username,spid from ALL_SCHEDULER_RUNNING_JOBS,v s e s s i o n b , v session b,v sessionb,vprocess where session_id=sid and paddr=addr

查询正在执行的dbms_job
select job,b.sid,b.SERIAL#,b.username,spid from DBA_JOBS_RUNNING a ,v s e s s i o n b , v session b,v sessionb,vprocess where a.sid=b.sid and paddr=addr

查询一个会话session、process平均消耗多少PGA内存,查看下面avg_used_M值
select round(sum(pga_used_mem)/1024/1024,0) total_used_M, round(sum(pga_used_mem)/count(1)/1024/1024,0) avg_used_M,
round(sum(pga_alloc_mem)/1024/1024,0) total_alloc_M, round(sum(pga_alloc_mem)/count(1)/1024/1024,0) avg_alloc_M from v$process;

TOP 10 执行次数排序
select *
from (select executions,username,PARSING_USER_ID,sql_id,sql_text
from v$sql,dba_users where user_id=PARSING_USER_ID order by executions desc)
where rownum <=5;

TOP 10 物理读排序(消耗IO排序,即最差性能SQL、低效SQL排序)
select *
from (select DISK_READS,username,PARSING_USER_ID,sql_id,ELAPSED_TIME/1000000,sql_text
from v$sql,dba_users where user_id=PARSING_USER_ID order by DISK_READS desc)
where rownum <=5;
(不要使用DISK_READS/ EXECUTIONS来排序,因为任何一条语句不管执行几次都会耗逻辑读和cpu,可能不会耗物理读(遇到LRU还会耗物理读,LRU规则是执行最不频繁的且最后一次执行时间距离现在最久远的就会被交互出buffer cache),是因为buffer cache存放的是数据块,去数据块里找行一定会消耗cpu和逻辑读的。Shared pool执行存放sql的解析结果,sql执行的时候只是去share pool中找hash value,如果有匹配的就是软解析。所以物理读逻辑读是在buffer cache中,软解析硬解析是在shared pool)

TOP 10 逻辑读排序(消耗内存排序)
select *
from (select BUFFER_GETS,username,PARSING_USER_ID,sql_id,ELAPSED_TIME/1000000,sql_text
from v$sql,dba_users where user_id=PARSING_USER_ID order by BUFFER_GETS desc)
where rownum <=5;
(不要使用BUFFER_GETS/ EXECUTIONS来排序,因为任何一条语句不管执行几次都会耗逻辑读和cpu,可能不会耗物理读(遇到LRU还会耗物理读,LRU规则是执行最不频繁的且最后一次执行时间距离现在最久远的就会被交互出buffer cache),是因为buffer cache存放的是数据块,去数据块里找行一定会消耗cpu和逻辑读的。Shared pool执行存放sql的解析结果,sql执行的时候只是去share pool中找hash value,如果有匹配的就是软解析。所以物理读逻辑读是在buffer cache中,软解析硬解析是在shared pool)

TOP 10 CPU排序(单位秒=cpu_time/1000000)
select *
from (select CPU_TIME/1000000,username,PARSING_USER_ID,sql_id,ELAPSED_TIME/1000000,sql_text
from v$sql,dba_users where user_id=PARSING_USER_ID order by CPU_TIME/1000000 desc)
where rownum <=5;
(不要使用CPU_TIME/ EXECUTIONS来排序,因为任何一条语句不管执行几次都会耗逻辑读和cpu,可能不会耗物理读(遇到LRU还会耗物理读,LRU规则是执行最不频繁的且最后一次执行时间距离现在最久远的就会被交互出buffer cache),是因为buffer cache存放的是数据块,去数据块里找行一定会消耗cpu和逻辑读的。Shared pool执行存放sql的解析结果,sql执行的时候只是去share pool中找hash value,如果有匹配的就是软解析。所以物理读逻辑读是在buffer cache中,软解析硬解析是在shared pool)

查询等待事件
select event,sum(decode(wait_time,0,0,1)) “之前等待次数”, sum(decode(wait_time,0,1,0)) “正在等待次数”,count(*) from v$session_wait group by event order by 4 desc

查询当前等待事件对应的对象

select distinct wait_class#,wait_class from v$session_wait_class order by 1

以上sql发现wait_class#=6的是空闲等待

select * from

(select sid,event,p1text,p1,p2text,p2,p3text,p3,WAIT_TIME,SECONDS_IN_WAIT,wait_class# from v$session_wait where wait_class# <> 6 order by wait_time desc)

where rownum <=10;

能查出等待的对象是否来自数据文件(如果以上查到p1text是file#或file number)

select * from

(select owner,segment_name,segment_type,block_id,bytes from dba_extents where file_id=p1 and block_id<p2 order="" by="" block_id="" desc)

where rownum<2

把上面第二个sql结果的p1、p2值代入上述sql的file_id、block_id

通过AWR的top sql或v$sql.sql_text查看是否有该对象的语句,检查该语句的执行计划就可以查出问题所在

查询当前正在消耗临时空间的sql语句

Select distinct se.username,

     se.sid,

     su.blocks * to_number(rtrim(p.value))/1024/1024 as space_G,

     su.tablespace,

     sql_text

from V$TEMPSEG_USAGE su, v$parameter p, v$session se, v$sql s

where p.name = ‘db_block_size’

 and su.session_addr=se.saddr

 and su.sqlhash=s.hash_value

 and su.sqladdr=s.address

 and se.STATUS='ACTIVE'

select v s q l . s q l i d , v sql.sql_id,v sql.sqlid,vsql.sql_fulltext,swa.TEMPSEG_SIZE/1024/1024 TEMPSEG_M, swa.* from v s q l w o r k a r e a a c t i v e s w a , v sql_workarea_active swa,v sqlworkareaactiveswa,vsql where swa.sql_id=v$sql.sql_id and swa.NUMBER_PASSES>0

查询因PGA不足而使用临时表空间的最频繁的10条SQL语句
select * from
(
select OPERATION_TYPE,ESTIMATED_OPTIMAL_SIZE,ESTIMATED_ONEPASS_SIZE,
sum(OPTIMAL_EXECUTIONS) optimal_cnt,sum(ONEPASS_EXECUTIONS) as onepass_cnt,
sum(MULTIPASSES_EXECUTIONS) as mpass_cnt,s.sql_text
from V S Q L W O R K A R E A s w a , v SQL_WORKAREA swa, v SQLWORKAREAswa,vsql s
where swa.sql_id=s.sql_id
group by OPERATION_TYPE,ESTIMATED_OPTIMAL_SIZE,ESTIMATED_ONEPASS_SIZE,sql_text
having sum(ONEPASS_EXECUTIONS+MULTIPASSES_EXECUTIONS)>0
order by sum(ONEPASS_EXECUTIONS) desc
)
where rownum<10

查询正在消耗PGA的SQL
select s.sql_text, sw.EXPECTED_SIZE, sw.ACTUAL_MEM_USED,sw.NUMBER_PASSES, sw.TEMPSEG_SIZE
from v s q l w o r k a r e a a c t i v e s w , v sql_workarea_active sw, v sqlworkareaactivesw,vsql s where sw.sql_id=s.sql_id;

查询需要使用绑定变量的sql,10G以后推荐第二种
(任何一条执行过的语句不管执行了几次在V S Q L 中 都 只 有 一 条 记 录 , V SQL中都只有一条记录,V SQLVSQL中会记录执行了几次。两条一模一样的语句但是在不同的schema下执行的两种结果,如select * from t1.test在sye、system下执行则V S Q L 只 有 一 条 记 录 ( 谁 先 执 行 则 P A R S I N G S C H E M A N A M E 显 示 谁 ) 。 如 在 s y s 和 s y s t e m 都 执 行 s e l e c t ∗ f r o m t e s t 则 V SQL只有一条记录(谁先执行则PARSING_SCHEMA_NAME显示谁)。如在sys和system都执行select * from test则V SQL(PARSINGSCHEMANAME)syssystemselectfromtestVSQL中有两条记录,两条记录的CHILD_NUMBER和PARSING_SCHEMA_NAME不一样。同一个用户下执行一样的语句如果大小写不一样或加了hint的话则会出现多个V S Q L 记 录 , 说 明 V SQL记录,说明V SQLVSQL对应的sql语句必须一模一样,如果alter system flush shared_pool(主站慎用)后再执行一样的语句,发现语句在V S Q L 中 的 S Q L I D 和 H A S H V A L U E 与 之 前 的 一 样 , 说 明 S Q L I D 和 H A S H V A L U E 应 该 是 o r a c l e 自 己 的 一 套 算 法 来 的 , 只 是 根 据 s q l 语 句 内 容 来 进 行 转 换 , s q l 语 句 不 变 则 S Q L I D 和 H A S H V A L U E 也 不 变 。 ) 第 一 种 s e l e c t ∗ f r o m ( s e l e c t c o u n t ( ∗ ) , s q l i d , s u b s t r ( s q l t e x t , 1 , 40 ) f r o m v SQL中的SQL_ID和HASH_VALUE与之前的一样,说明SQL_ID和HASH_VALUE应该是oracle自己的一套算法来的,只是根据sql语句内容来进行转换,sql语句不变则SQL_ID和HASH_VALUE也不变。) 第一种 select * from ( select count(*),sql_id, substr(sql_text,1,40) from v SQLSQLIDHASHVALUESQLIDHASHVALUEoraclesqlsqlSQLIDHASHVALUEselectfrom(selectcount(),sqlid,substr(sqltext,1,40)fromvsql
group by sql_id, substr(sql_text,1,40) having count() > 10 order by count() desc) where rownum<10
第二种
count(1)>10表示类语句运行了10次以上
select sql_id, FORCE_MATCHING_SIGNATURE, sql_text
from v S Q L w h e r e F O R C E M A T C H I N G S I G N A T U R E i n ( s e l e c t / ∗ + u n n e s t ∗ / F O R C E M A T C H I N G S I G N A T U R E f r o m v SQL where FORCE_MATCHING_SIGNATURE in (select /*+ unnest */ FORCE_MATCHING_SIGNATURE from v SQLwhereFORCEMATCHINGSIGNATUREin(select/+unnest/FORCEMATCHINGSIGNATUREfromvsql
where FORCE_MATCHING_SIGNATURE > 0
and FORCE_MATCHING_SIGNATURE != EXACT_MATCHING_SIGNATURE
group by FORCE_MATCHING_SIGNATURE
having count(1) > 10)

查看数据文件可用百分比( dba_free_space并不会包含所有file_id,如果该数据文件满了,则 dba_free_space.file_id没有该数据文件,所以以下sql中 a.file_id=b.file_id的条件过滤后是不会有所有file_id的 )
select b.file_id,b.tablespace_name,b.file_name,b.AUTOEXTENSIBLE,
ROUND(b.MAXBYTES/1024/1024/1024,2) ||‘G’ “文件最大可用总容量”,
ROUND(b.bytes/1024/1024/1024,2) ||‘G’ “文件总容量”,
ROUND((b.bytes-sum(nvl(a.bytes,0)))/1024/1024/1024,2)||‘G’ “文件已用容量”,
ROUND(sum(nvl(a.bytes,0))/1024/1024/1024,2)||‘G’ “文件可用容量”,
ROUND(sum(nvl(a.bytes,0))/(b.bytes),2)*100||’%’ “文件可用百分比”
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.file_id,b.bytes,b.AUTOEXTENSIBLE,b.MAXBYTES
order by b.tablespace_name;
–如下为标准版
select b.file_id,b.tablespace_name,b.file_name,b.AUTOEXTENSIBLE,
ROUND(b.MAXBYTES/1024/1024/1024,2) ||‘G’ “文件最大可用总容量”,
ROUND(b.bytes/1024/1024/1024,2) ||‘G’ “文件当前总容量”,
ROUND((b.bytes-sum(nvl(a.bytes,0)))/1024/1024/1024,2)||‘G’ “文件当前已用容量”,
ROUND((decode(AUTOEXTENSIBLE,‘NO’,b.BYTES,b.MAXBYTES)+sum(nvl(a.bytes,0))-b.bytes)/1024/1024/1024,2)||‘G’ “文件可用容量”,
ROUND((decode(AUTOEXTENSIBLE,‘NO’,b.BYTES,b.MAXBYTES)+sum(nvl(a.bytes,0))-b.bytes)/(decode(AUTOEXTENSIBLE,‘NO’,b.BYTES,b.MAXBYTES)),2)*100||’%’ “文件可用百分比”
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.file_id,b.bytes,b.AUTOEXTENSIBLE,b.MAXBYTES
order by decode(AUTOEXTENSIBLE,‘NO’,b.BYTES,b.MAXBYTES)+sum(nvl(a.bytes,0))-b.bytes;

查看数据库文件的实际总量,单位G
select a.datafile_size+b.tempfile_size-c.free_size from
(select sum(bytes/1024/1024/1024) datafile_size from dba_data_files ) a,
(select sum(bytes/1024/1024/1024) tempfile_size from dba_temp_files ) b,
(select sum(bytes/1024/1024/1024) free_size from dba_free_space ) c

查看表空间可用百分比( dba_free_space不会包含所有tablespace,如果一个表空间的数据文件都满了,则这个表空间不会出现在 dba_free_space中 )
select b.tablespace_name,a.maxsize max_M,a.total total_M,b.free free_M,round((b.free/a.total)100) “% Free” from
(select tablespace_name, sum(bytes/(1024
1024)) total ,sum(MAXBYTES/(10241024)) maxsize from dba_data_files group by tablespace_name) a,
(select tablespace_name, round(sum(bytes/(1024
1024))) free from dba_free_space group by tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name order by “% Free”;
–如下为标准版
select b.tablespace_name,a.maxsize max_M,a.total total_M,b.free free_M,round(((a.maxsize+b.free-a.total)/a.maxsize)100) “% Free” from
(select tablespace_name, sum(bytes/(1024
1024)) total ,sum((decode(AUTOEXTENSIBLE,‘NO’,BYTES,MAXBYTES))/(10241024)) maxsize from dba_data_files group by tablespace_name) a,
(select tablespace_name, round(sum(bytes/(1024
1024))) free from dba_free_space group by tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name order by “% Free”;

查看临时表空间使用率
SELECT temp_used.tablespace_name,round(total),used,
round(total - used) as “Free”,
round(nvl(total-used, 0) * 100/total,1) “Free percent”
FROM (SELECT tablespace_name, SUM(bytes_used)/1024/1024 used
FROM GV T E M P S P A C E H E A D E R G R O U P B Y t a b l e s p a c e n a m e ) t e m p u s e d , ( S E L E C T t a b l e s p a c e n a m e , S U M ( d e c o d e ( a u t o e x t e n s i b l e , ′ Y E S ′ , M A X B Y T E S , b y t e s ) ) / 1024 / 1024 t o t a l F R O M d b a t e m p f i l e s G R O U P B Y t a b l e s p a c e n a m e ) t e m p t o t a l W H E R E t e m p u s e d . t a b l e s p a c e n a m e = t e m p t o t a l . t a b l e s p a c e n a m e 或 S E L E C T a . t a b l e s p a c e n a m e , r o u n d ( a . B Y T E S / 1024 / 1024 ) t o t a l M , r o u n d ( a . b y t e s / 1024 / 1024 − n v l ( b . b y t e s / 1024 / 1024 , 0 ) ) f r e e M , r o u n d ( b . b y t e s / 1024 / 1024 ) u s e d , r o u n d ( b . u s i n g / 1024 / 1024 ) u s i n g F R O M ( S E L E C T t a b l e s p a c e n a m e , S U M ( d e c o d e ( a u t o e x t e n s i b l e , ′ Y E S ′ , M A X B Y T E S , b y t e s ) ) b y t e s F R O M d b a t e m p f i l e s G R O U P B Y t a b l e s p a c e n a m e ) a , ( S E L E C T t a b l e s p a c e n a m e , S U M ( b y t e s c a c h e d ) b y t e s , s u m ( b y t e s u s e d ) u s i n g F R O M v TEMP_SPACE_HEADER GROUP BY tablespace_name) temp_used, (SELECT tablespace_name, SUM(decode(autoextensible,'YES',MAXBYTES,bytes))/1024/1024 total FROM dba_temp_files GROUP BY tablespace_name) temp_total WHERE temp_used.tablespace_name = temp_total.tablespace_name 或 SELECT a.tablespace_name, round(a.BYTES/1024/1024) total_M, round(a.bytes/1024/1024 - nvl(b.bytes/1024/1024, 0)) free_M, round(b.bytes/1024/1024) used,round(b.using/1024/1024) using FROM (SELECT tablespace_name, SUM (decode(autoextensible,'YES',MAXBYTES,bytes)) bytes FROM dba_temp_files GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM (bytes_cached) bytes,sum(bytes_used) using FROM v TEMPSPACEHEADERGROUPBYtablespacename)tempused,(SELECTtablespacename,SUM(decode(autoextensible,YES,MAXBYTES,bytes))/1024/1024totalFROMdbatempfilesGROUPBYtablespacename)temptotalWHEREtempused.tablespacename=temptotal.tablespacenameSELECTa.tablespacename,round(a.BYTES/1024/1024)totalM,round(a.bytes/1024/1024nvl(b.bytes/1024/1024,0))freeM,round(b.bytes/1024/1024)used,round(b.using/1024/1024)usingFROM(SELECTtablespacename,SUM(decode(autoextensible,YES,MAXBYTES,bytes))bytesFROMdbatempfilesGROUPBYtablespacename)a,(SELECTtablespacename,SUM(bytescached)bytes,sum(bytesused)usingFROMvtemp_extent_pool GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+)

查询undo表空间使用情况
select tablespace_name,status,sum(bytes)/1024/1024 M from dba_undo_extents group by tablespace_name,status

查询使用undo比较多的SQL

select *from (

select maxqueryid,

round(sum(undoblks )*8/1024) consumed_size_MB

from v$undostat group by maxqueryid order by consumed_size_MB desc

) where rownum<10;

估计undo需要多大
SELECT (UR * (UPS * DBS)) AS “Bytes”
FROM (select max(tuned_undoretention) AS UR from v u n d o s t a t ) , ( S E L E C T u n d o b l k s / ( ( e n d t i m e − b e g i n t i m e ) ∗ 86400 ) A S U P S F R O M v undostat), (SELECT undoblks/((end_time-begin_time)*86400) AS UPS FROM v undostat),(SELECTundoblks/((endtimebegintime)86400)ASUPSFROMvundostat
WHERE undoblks = (SELECT MAX(undoblks) FROM v u n d o s t a t ) ) , ( S E L E C T b l o c k s i z e A S D B S F R O M d b a t a b l e s p a c e s W H E R E t a b l e s p a c e n a m e = ( S E L E C T U P P E R ( v a l u e ) F R O M v undostat)), (SELECT block_size AS DBS FROM dba_tablespaces WHERE tablespace_name = (SELECT UPPER(value) FROM v undostat)),(SELECTblocksizeASDBSFROMdbatablespacesWHEREtablespacename=(SELECTUPPER(value)FROMvparameter WHERE name = ‘undo_tablespace’));

产生undo的当前活动会话是哪些

SELECT a.inst_id, a.sid, c.username, c.osuser, c.program, b.name,

a.value, d.used_urec, d.used_ublk

FROM gv s e s s t a t a , v sesstat a, v sesstata,vstatname b, gv s e s s i o n c , g v session c, gv sessionc,gvtransaction d

WHERE a.statistic# = b.statistic#

AND a.inst_id = c.inst_id

AND a.sid = c.sid

AND c.inst_id = d.inst_id

AND c.saddr = d.ses_addr

AND b.name = ‘undo change vector size’

AND a.value>0

ORDER BY a.value DESC

select s.sid,s.serial#,s.sql_id,v.usn,r.status, v.rssize/1024/1024 mb

from dba_rollback_segs r, v r o l l s t a t v , v rollstat v,v rollstatv,vtransaction t,v$session s

Where r.segment_id = v.usn and v.usn=t.xidusn and t.addr=s.taddr

order by 6 desc;

查看ASM磁盘组使用率
select name,round(total_mb/1024) “总容量”,round(free_mb/1024) “空闲空间”,round((free_mb/total_mb)*100) “可用空间比例” from gv$asm_diskgroup

统计每个用户使用表空间率
SELECT c.owner “用户”,
a.tablespace_name “表空间名”,
total/1024/1024 “表空间大小M”,
free/1024/1024 “表空间剩余大小M”,
( total - free )/1024/1024 “表空间使用大小M”,
Round(( total - free ) / total, 4) * 100 “表空间总计使用率 %”,
c.schemas_use/1024/1024 “用户使用表空间大小M”,
round((schemas_use)/total,4)*100 “用户使用表空间率 %”

FROM (SELECT tablespace_name,
Sum(bytes) free
FROM DBA_FREE_SPACE
GROUP BY tablespace_name) a,
(SELECT tablespace_name,
Sum(bytes) total
FROM DBA_DATA_FILES
GROUP BY tablespace_name) b,
(Select owner ,Tablespace_Name,
Sum(bytes) schemas_use
From Dba_Segments
Group By owner,Tablespace_Name) c
WHERE a.tablespace_name = b.tablespace_name
and a.tablespace_name =c.Tablespace_Name
order by “用户”,“表空间名”

查看闪回区\快速恢复区空间使用率
select sum(percent_space_used)||’%’ “已使用空间比例” from V R E C O V E R Y A R E A U S A G E 或 s e l e c t r o u n d ( 100 ∗ ( a . s p a c e u s e d / s p a c e l i m i t ) , 2 ) ∣ ∣ ′ RECOVERY_AREA_USAGE 或 select round(100*(a.space_used/space_limit),2)||'%' "已使用空间比例",a.* from v RECOVERYAREAUSAGEselectround(100(a.spaceused/spacelimit),2)recovery_file_dest a;

查看僵死进程,分两种(一种是会话不在的,另一种是会话标记为killed的但是会话还在的)
alter system kill session一执行则session即标记为KILLED,但是如果会话产生的数据量大则这个kill可能会比较久,在这个过程中session标记为KILLED但是这个会话还在V s e s s i o n 中 , 则 V session中,则V sessionVsession.paddr还在,所以可以匹配到V p r o c e s s . a d d r , 所 以 p r o c e s s 进 程 还 在 ; 当 k i l l 过 程 执 行 完 毕 , 则 这 个 会 话 即 不 在 V process.addr,所以process进程还在;当kill过程执行完毕,则这个会话即不在V process.addrprocesskillVsession中

会话不在的
select * from v p r o c e s s w h e r e a d d r n o t i n ( s e l e c t p a d d r f r o m v process where addr not in (select paddr from v processwhereaddrnotin(selectpaddrfromvsession) and pid not in (1,17,18)

会话还在的,但是会话标记为killed
select * from v p r o c e s s w h e r e a d d r i n ( s e l e c t p a d d r f r o m v process where addr in (select paddr from v processwhereaddrin(selectpaddrfromvsession where status=‘KILLED’)

再根据上述结果中的SPID通过如下命令可以查看到process的启动时间
ps auxw|head -1;ps auxw|grep SPID

查看行迁移或行链接的表
select * From dba_tables where nvl(chain_cnt,0)<>0
chain_cnt :Number of rows in the table that are chained from one data block to another or that have migrated to a new block, requiring a link to preserve the old rowid. This column is updated only after you analyze the table.

数据缓冲区命中率(百分比小于90就要加大db_cache_size)
SELECT a.VALUE+b.VALUE logical_reads, c.VALUE phys_reads,
round(100*(1-c.value/(a.value+b.value)),2)||’%’ hit_ratio
FROM v s y s s t a t a , v sysstat a,v sysstata,vsysstat b,v s y s s t a t c W H E R E a . N A M E = ′ d b b l o c k g e t s ′ A N D b . N A M E = ′ c o n s i s t e n t g e t s ′ A N D c . N A M E = ′ p h y s i c a l r e a d s ′ ; 或 S E L E C T D B B L O C K G E T S + C O N S I S T E N T G E T S L o g i c a l r e a d s , P H Y S I C A L R E A D S p h y s r e a d s , r o u n d ( 100 ∗ ( 1 − ( P H Y S I C A L R E A D S / ( D B B L O C K G E T S + C O N S I S T E N T G E T S ) ) ) , 2 ) ∣ ∣ ′ F R O M V sysstat c WHERE a.NAME='db block gets' AND b.NAME='consistent gets' AND c.NAME='physical reads'; 或 SELECT DB_BLOCK_GETS+CONSISTENT_GETS Logical_reads,PHYSICAL_READS phys_reads, round(100*(1-(PHYSICAL_READS/(DB_BLOCK_GETS+CONSISTENT_GETS))),2)||'%' "Hit Ratio" FROM V sysstatcWHEREa.NAME=dbblockgetsANDb.NAME=consistentgetsANDc.NAME=physicalreads;SELECTDBBLOCKGETS+CONSISTENTGETSLogicalreads,PHYSICALREADSphysreads,round(100(1(PHYSICALREADS/(DBBLOCKGETS+CONSISTENTGETS))),2)FROMVBUFFER_POOL_STATISTICS WHERE NAME=‘DEFAULT’;

共享池命中率(百分比小于90就要加大shared_pool_size)
以下两者应该都可以,看个人怎么理解
select sum(pinhits)/sum(pins)*100 from v l i b r a r y c a c h e ; s e l e c t s u m ( p i n h i t s − r e l o a d s ) / s u m ( p i n s ) ∗ 100 f r o m v librarycache; select sum(pinhits-reloads)/sum(pins)*100 from v librarycache;selectsum(pinhitsreloads)/sum(pins)100fromvlibrarycache;

查询归档日志切换频率
select sequence#,to_char(first_time,‘yyyymmdd_hh24:mi:ss’)
firsttime,round((first_time-lag(first_time) over(order by first_time))2460,2) minutes from
vKaTeX parse error: Expected 'EOF', got '#' at position 90: …select sequence#̲,to_char(first_…loghist where first_time>sysdate-3 order by 1;

SELECT TO_CHAR(first_time, ‘MM/DD’) DAY,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘00’, 1, 0)) H00,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘01’, 1, 0)) H01,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘02’, 1, 0)) H02,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘03’, 1, 0)) H03,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘04’, 1, 0)) H04,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘05’, 1, 0)) H05,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘06’, 1, 0)) H06,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘07’, 1, 0)) H07,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘08’, 1, 0)) H08,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘09’, 1, 0)) H09,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘10’, 1, 0)) H10,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘11’, 1, 0)) H11,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘12’, 1, 0)) H12,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘13’, 1, 0)) H13,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘14’, 1, 0)) H14,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘15’, 1, 0)) H15,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘16’, 1, 0)) H16,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘17’, 1, 0)) H17,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘18’, 1, 0)) H18,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘19’, 1, 0)) H19,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘20’, 1, 0)) H20,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘21’, 1, 0)) H21,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘22’, 1, 0)) H22,
SUM(DECODE(TO_CHAR(first_time, ‘HH24’), ‘23’, 1, 0)) H23,
COUNT(*) TOTAL
FROM (SELECT ROWNUM RN, FIRST_TIME FROM V$LOG_HISTORY WHERE first_time>sysdate-18
and FIRST_TIME>ADD_MONTHS(SYSDATE,-1) ORDER BY FIRST_TIME)
GROUP BY TO_CHAR(first_time, ‘MM/DD’)
ORDER BY MIN(RN);

查询lgwr进程写日志时每执行一次lgwr需要多少秒,在state是waiting的情况下,某个等待编号seq#下,seconds_in_wait达多少秒,就是lgwr进程写一次IO需要多少秒
select event,state,seq#,seconds_in_wait,program from v$session where program like ‘%LGWR%’ and state=‘WAITING’

查询没有索引的表
Select table_name from user_tables where table_name not in (select table_name from user_indexes)
Select table_name from user_tables where table_name not in (select table_name from user_ind_columns)

查询一个AWR周期内的平均session数、OS平均负载、平均db time、平均每秒多少事务
select to_char(max(BEGIN_TIME),‘yyyy-mm-dd hh24:mi’)||to_char(max(end_time),’–hh24:mi’) time,
snap_id,
trunc(sum(case metric_name when ‘Session Count’ then average end),2) sessions,
trunc(sum(case metric_name when ‘Current OS Load’ then average end),2) OS_LOAD,
(trunc(sum(case metric_name when ‘Database Time Per Sec’ then average end),2)/100)(ceil((max(end_time)-max(BEGIN_TIME))246060)) Database_Time_second,
trunc(sum(case metric_name when ‘User Transaction Per Sec’ then average end),2) User_Transaction_Per_Sec
from dba_hist_sysmetric_summary
group by snap_id
order by snap_id;
–Database Time Per Sec对应值的单位是百分一秒/每秒
–(/100)(ceil((max(end_time)-max(BEGIN_TIME))246060))是代表每个snap周期内的总秒数,oracle 两个时间相减默认的是天数,2460*60 为相差的秒数
–这个SQL查到的DB TIME比较准确,和awr上面的db time比较一致

查询产生热块较多的对象
xKaTeX parse error: Expected 'EOF', got '#' at position 132: …(SELECT addr,ts#̲,file#,dbarfil,…bh
ORDER BY tch DESC)
WHERE ROWNUM < 11) b
WHERE e.relative_fno = b.dbarfil
AND e.block_id <= b.dbablk
AND e.block_id + e.blocks > b.dbablk;

手工创建快照的语句
exec dbms_workload_repository.create_snapshot;

AWR设置每隔30分钟收集一次报告,保留14天的报告
exec DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention=>142460, interval=>30);
select * from dba_hist_wr_control;

AWR基线查看和创建
select * from dba_hist_baseline;
exec DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id=>7550,end_snap_id=>7660,baseline_name=>‘am_baseline’);

导出AWR报告的SQL语句
select * from dba_hist_snapshot
select * from table(dbms_workload_repository.awr_report_html(DBID, INSTANCE_NUMBER, startsnapid,endsnapid))
select * from TABLE(DBMS_WORKLOAD_REPOSITORY.awr_diff_report_html(DBID, INSTANCE_NUMBER, startsnapid,endsnapid, DBID, INSTANCE_NUMBER, startsnapid,endsnapid));

导出最新ADDM的报告(需要sys用户)
select dbms_advisor.get_task_report(task_name) from dba_advisor_tasks
where task_id =(
select max(t.task_id) from dba_advisor_tasks t, dba_advisor_log l where
t.task_id=l.task_id and t.advisor_name=‘ADDM’ and l.status=‘COMPLETED’ );

select task_id,task_name,description from dba_advisor_tasks order by 1 desc

select dbms_advisor.get_task_report(task_name) from dba_advisor_tasks where task_id =XX

查询某个SQL的执行计划
select * from table(dbms_xplan.display_cursor(‘sql_id’,0,’ advanced '));
上面的0表示v s q l . c h i l d n u m b e r 为 0 , 如 果 一 个 s q l i d 在 v sql.child_number为0,如果一个sql_id在v sql.childnumber0sqlidvsql中有多行说明有多个child_number,要看哪儿child_number的执行计划,就写哪个的值,比如要看child_number为2的执行计划,就把上面sql的0改为2

官方文档对display_cursor这个函数的说明里面没有advanced这个参数值,只有BASIC、TYPICAL、ALL这几个,不过实践中发现advanced这个参数值显示的内容比这几个参数值显示的都多

含顺序的
select * from table(xplan.display_cursor(‘v$sql.sql_id’,0,‘advanced’));
不过要先创建xplan包,再执行
SQL> CREATE PUBLIC SYNONYM XPLAN FOR SYS.XPLAN;
SQL> grant execute on sys.xplan to public;

查询Rman的配置信息
SELECT NAME,VALUE FROM V$RMAN_CONFIGURATION;

查询Rman备份集详细信息(未过期的,过期并已删除的查不到)
SELECT B.RECID BackupSet_ID,
A.SET_STAMP,
DECODE (B.INCREMENTAL_LEVEL,
‘’, DECODE (BACKUP_TYPE, ‘L’, ‘Archivelog’, ‘Full’),
1, ‘Incr-1级’,
0, ‘Incr-0级’,
B.INCREMENTAL_LEVEL)
“Type LV”,
B.CONTROLFILE_INCLUDED “包含CTL”,
DECODE (A.STATUS,
‘A’, ‘AVAILABLE’,
‘D’, ‘DELETED’,
‘X’, ‘EXPIRED’,
‘ERROR’)
“STATUS”,
A.DEVICE_TYPE “Device Type”,
A.START_TIME “Start Time”,
A.COMPLETION_TIME “Completion Time”,
A.ELAPSED_SECONDS “Elapsed Seconds”,
A.BYTES/1024/1024/1024 “Size(G)”,
A.COMPRESSED,
A.TAG “Tag”,
A.HANDLE “Path”
FROM GV B A C K U P P I E C E A , G V BACKUP_PIECE A, GV BACKUPPIECEA,GVBACKUP_SET B
WHERE A.SET_STAMP = B.SET_STAMP AND A.DELETED = ‘NO’
ORDER BY A.COMPLETION_TIME DESC;

查询Rman备份进度
SELECT SID, SERIAL#, opname,ROUND(SOFAR/TOTALWORK*100)||’%’ “%_COMPLETE”,
TRUNC(elapsed_seconds/60) || ‘:’ || MOD(elapsed_seconds,60) elapsed,
TRUNC(time_remaining/60) || ‘:’ || MOD(time_remaining,60) remaining,
CONTEXT,target,SOFAR, TOTALWORK
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE ‘RMAN%’
AND OPNAME NOT LIKE ‘%aggregate%’
AND TOTALWORK != 0
AND SOFAR <> TOTALWORK;

查询执行过全表扫描的sql语句的SQL_ID和sql_fulltext
select s.sid,s.serial#,s.inst_id,s.sql_id,s.username,s.target,s.ELAPSED_SECONDS,s.START_TIME,s.LAST_UPDATE_TIME,v.sql_fulltext
from gv s e s s i o n l o n g o p s s , g v session_longops s,gv sessionlongopss,gvsql v
where s.OPNAME = ‘Table Scan’
and s.SQL_PLAN_OPERATION = ‘TABLE ACCESS’
and s.SQL_PLAN_OPTIONS = ‘FULL’
and s.sql_id=v.sql_id
order by s.LAST_UPDATE_TIME desc

查询死事务需要多长的回滚时间
X K T U X E : [ K ] e r n e l [ T ] r a n s a c t i o n [ U ] n d o T r a n s a [ x ] t i o n [ E ] n t r y ( t a b l e ) X KTUXE:[K]ernel [T]ransaction [U]ndo Transa[x]tion [E]ntry (table) X KTUXE[K]ernel[T]ransaction[U]ndoTransa[x]tion[E]ntry(table)XKTUXE表的一个重要功能是,可以获得无法通过v t r a n s a c t i o n 来 观 察 的 死 事 务 信 息 , 当 一 个 数 据 库 发 生 异 常 中 断 , 或 者 进 行 延 迟 事 务 恢 复 时 , 数 据 库 启 动 后 , 无 法 通 过 V transaction来观察的死事务信息,当一个数据库发生异常中断,或者进行延迟事务恢复时,数据库启动后,无法通过V transactionVTRANSACTION来观察事务信息,但是X K T U X E 可 以 帮 助 我 们 获 得 这 些 信 息 。 该 表 中 的 K T U X E C F L 代 表 了 事 务 的 F l a g 标 记 , 通 过 这 个 标 记 可 以 找 到 那 些 D e a d 事 务 : S Q L > s e l e c t d i s t i n c t K T U X E C F L , c o u n t ( ∗ ) f r o m x KTUXE可以帮助我们获得这些信息。该表中的KTUXECFL代表了事务的Flag标记,通过这个标记可以找到那些Dead事务: SQL> select distinct KTUXECFL,count(*) from x KTUXEKTUXECFLFlagDeadSQL>selectdistinctKTUXECFL,count()fromxktuxe group by KTUXECFL;
KTUXECFL COUNT(*)
------------------------ ----------
DEAD 1
NONE 2393

KTUXESIZ用来记录事务使用的回滚段块数,可以通过观察这个字段来评估恢复进度,例如如下事务回滚经过测算需要大约3小时::
SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ from x$ktuxe where KTUXECFL =‘DEAD’;
ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ
---------------- ---------- ---------- ---------- ----------
FFFFFFFF7D07B91C 10 39 2567412 1086075

SQL> select ADDR,KTUXEUSN,KTUXESLT,KTUXESQN,KTUXESIZ from x$ktuxe where KTUXECFL =‘DEAD’;
ADDR KTUXEUSN KTUXESLT KTUXESQN KTUXESIZ
---------------- ---------- ---------- ---------- ----------
FFFFFFFF7D07B91C 10 39 2567412 1086067

SQL> declare
l_start number;
l_end number;
begin
select ktuxesiz into l_start from x k t u x e w h e r e K T U X E U S N = 10 a n d K T U X E S L T = 39 ; d b m s l o c k . s l e e p ( 60 ) ; s e l e c t k t u x e s i z i n t o l e n d f r o m x ktuxe where KTUXEUSN=10 and KTUXESLT=39; dbms_lock.sleep(60); select ktuxesiz into l_end from x ktuxewhereKTUXEUSN=10andKTUXESLT=39;dbmslock.sleep(60);selectktuxesizintolendfromxktuxe where KTUXEUSN=10 and KTUXESLT=39;
dbms_output.put_line(‘time_H:’|| round(l_end/(l_start -l_end)/60,2));
end;
/

time_H:3

把XXX用户下面的某些YYY表赋权给user,XXX\YYY要大写
set serveroutput on
–XXX要大写
declare tablename varchar2(200);
begin
for x IN (SELECT * FROM dba_tables where owner=‘XXX’ and table_name like ‘%YYY%’) loop
tablename:=x.table_name;
dbms_output.put_line(‘GRANT SELECT ON XXX.’||tablename||’ to user’);
EXECUTE IMMEDIATE ‘GRANT SELECT ON XXX.’||tablename||’ TO user’;
end loop;
end;

Oracle查出一个用户具有的所有系统权限和对象权限
系统权限(和用户自己查询select * from session_privs的结果一致)
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = ‘用户名’
UNION ALL
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN
(SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = ‘用户名’);

对象权限(和用户自己查询select * FROM TABLE_PRIVILEGES where GRANTEE='当前用户’的结果一致)
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = ‘用户名’
UNION ALL
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE IN
(SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = ‘用户名’);

查询某个用户拥有的角色
select * from dba_role_privs where GRANTEE=‘用户名’;

查询拥有DBA角色权限的用户
select * from dba_role_privs where GRANTED_ROLE=‘DBA’;

查询某个角色拥有的系统权限
select * from ROLE_SYS_PRIVS where role=‘角色名’

清除某个SQL的执行计划
Exec DBMS_SHARED_POOL.PURGE(‘v s q l a r e a . A D D R E S S , v sqlarea.ADDRESS,v sqlarea.ADDRESS,vsqlarea.HASH_VALUE’,‘c’)

查询密码是否有过期限制,默认是180天,一般修改为unlimited
select * from dba_profiles where profile=‘DEFAULT’ and RESOURCE_NAME like ‘PASSWORD%’;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED

查询和修改隐含参数(必须在sysdba权限下操作)
select a.ksppinm name, b.ksppstvl value, a.ksppdesc description
from x k s p p i a , x ksppi a, x ksppia,xksppcv b
where a.indx = b.indx and a.ksppinm like ‘%_small_table_threshold%’

alter system set “_small_table_threshold”=value scope=both sid=’*’;
不加sid则说明在默认在RAC的所有实例中修改
需要注意的是一定要加上双引号, 另外引号内不能有空格, 只能包含参数的名字

评估PGA该设置多少
select PGA_TARGET_FOR_ESTIMATE from (select * from V$PGA_TARGET_ADVICE where ESTD_OVERALLOC_COUNT=0 order by 1) where rownum=1;

评估SGA该设置多少
select SGA_SIZE from (select * from V$SGA_TARGET_ADVICE where ESTD_DB_TIME_FACTOR=1 order by 1) where rownum=1;

查看shared pool还剩多少
select * from v$sgastat where name=‘free memory’ and pool=‘shared pool’;

统计所有表的容量大小(含分区字段、LOB字段)
一般先执行select distinct SEGMENT_TYPE from dba_segments where owner<>‘SYS’ and tablespace_name<>'SYSAUX’查看到所有的segment_type
一般如下SQL就足够了
SELECT
owner,table_name, TRUNC(sum(bytes)/1024/1024) Meg
FROM
(SELECT segment_name table_name, owner, bytes
FROM dba_segments
WHERE segment_type = ‘TABLE’
UNION ALL
SELECT s.segment_name table_name, pt.owner, s.bytes
FROM dba_segments s, dba_part_tables pt
WHERE s.segment_name = pt.table_name
AND s.owner = pt.owner
AND s.segment_type = ‘TABLE PARTITION’
UNION ALL
SELECT i.table_name, i.owner, s.bytes
FROM dba_indexes i, dba_segments s
WHERE s.segment_name = i.index_name
AND s.owner = i.owner
AND s.segment_type = ‘INDEX’
UNION ALL
SELECT pi.table_name, pi.owner, s.bytes
FROM dba_part_indexes pi, dba_segments s
WHERE s.segment_name = pi.index_name
AND s.owner = pi.owner
AND s.segment_type = ‘INDEX PARTITION’
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.segment_name
AND s.owner = l.owner
AND s.segment_type = ‘LOBSEGMENT’
UNION ALL
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.index_name
AND s.owner = l.owner
AND s.segment_type = ‘LOBINDEX’
union all
SELECT l.table_name, l.owner, s.bytes
FROM dba_lobs l, dba_segments s
WHERE s.segment_name = l.segment_name
AND s.owner = l.owner
AND s.segment_type = ‘LOB PARTITION’
)
GROUP BY owner,table_name
HAVING SUM(bytes)/1024/1024 > 10
ORDER BY SUM(bytes) desc

查看当前会话的SID
select * from V$MYSTAT where rownum<2

查询某个SID的某个统计信息,比如consistent gets一致性读
select A.SID,A.STATISTIC#,A.VALUE SID_VALUE,B.NAME,B.VALUE ALL_SID_VALUE from V S E S S T A T A , V SESSTAT A ,V SESSTATA,VSYSSTAT B where A.STATISTIC#=B.STATISTIC#
and A.SID=1187 and B.NAME=‘consistent gets’
V S Y S S T A T 统 计 整 个 D B 的 统 计 信 息 , V SYSSTAT统计整个DB的统计信息,V SYSSTATDBVSYSSTAT已经取代了V S T A T N A M E , 并 且 多 了 V A L U E 这 一 列 V STATNAME,并且多了VALUE这一列 V STATNAMEVALUEVSESSTAT统计每个用户的统计信息

查询某个SID的某个等待事件的信息,比如log file sync
select A.SID,A.EVENT,C.NAME,C.PARAMETER1,C.PARAMETER2,C.PARAMETER3,
A.TIME_WAITED SID_TIMEWAITED,B.TIME_WAITED ALL_SID_TIMEWAITED,A.TOTAL_WAITS SID_TOTALWAITS,B.TOTAL_WAITS ALL_SID_TOTALWAITS
from V S E S S I O N E V E N T A , V SESSION_EVENT A ,V SESSIONEVENTA,VSYSTEM_EVENT B,V E V E N T N A M E C w h e r e A . E V E N T = B . E V E N T a n d A . E V E N T = C . N A M E a n d A . S I D = 1 a n d C . N A M E = ′ l o g f i l e s y n c ′ V EVENT_NAME C where A.EVENT=B.EVENT and A.EVENT=C.NAME and A.SID=1 and C.NAME='log file sync' V EVENTNAMECwhereA.EVENT=B.EVENTandA.EVENT=C.NAMEandA.SID=1andC.NAME=logfilesyncVSESSION_EVENT描述每个用户的等待事件信息
V S Y S T E M E V E N T 描 述 整 个 D B 等 待 事 件 信 息 V SYSTEM_EVENT描述整个DB等待事件信息 V SYSTEMEVENTDBVEVENT_NAME描述等待事件信本身的信息(比如V A C T I V E S E S S I O N H I S T O R Y 的 P 1 T E X T 、 P 2 T E X T 、 P 2 T E X T 匹 配 V ACTIVE_SESSION_HISTORY的P1TEXT、P2TEXT、P2TEXT匹配V ACTIVESESSIONHISTORYP1TEXTP2TEXTP2TEXTVEVENT_NAME的PARAMETER1、PARAMETER2、PARAMETER3)

RAC跨节点杀会话
alter system kill session ‘SID,serial#,@1’ --杀掉1节点的进程
alter system kill session ‘SID,serial#,@2’ --杀掉2节点的进程

Truncate 分区的SQL
ALTER TABLE table_name TRUNCATE PARTITION p1 DROP STORAGE UPDATE GLOBAL INDEXES;
Drop分区的SQL
ALTER TABLE table_name DROP PARTITION p1 UPDATE GLOBAL INDEXES;

DATAGUARD主备延迟多少时间的查询方法
备 库sqlplus>select value from v d a t a g u a r d s t a t s w h e r e n a m e = ′ a p p l y l a g ′ 或 备 库 s q l p l u s > s e l e c t c e i l ( ( s y s d a t e − n e x t t i m e ) ∗ 24 ∗ 60 ) " M " f r o m v dataguard_stats where name='apply lag' 或 备库sqlplus>select ceil((sysdate-next_time)*24*60) "M" from v dataguardstatswherename=applylagsqlplus>selectceil((sysdatenexttime)2460)"M"fromvarchived_log where applied=‘YES’ AND SEQUENCE#=(SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE applied=‘YES’);

查看某个包或存储过程是否正在被调用,如果如下有结果,则此时不能编译,否则会锁住
select * from V$DB_OBJECT_CACHE where pin>0 and name=upper(‘XX’)

查询数据库打补丁的记录

select * from dba_registry_history;

查询某表的索引字段的distinct行数和CLUSTERING_FACTOR信息

select a.table_name,a.index_name,b.COLUMN_NAME,a.blevel,a.distinct_keys,A.CLUSTERING_FACTOR,A.NUM_ROWS,trunc((a.distinct_keys/A.NUM_ROWS),2)*100||’%’ “distinct%”,trunc((a.CLUSTERING_FACTOR/A.NUM_ROWS),2)*100||’%’ “CLUSTERING_FACTOR%” from DBA_IND_STATISTICS a,DBA_IND_COLUMNS b where a.table_name=‘XX’ and a.INDEX_NAME=b.index_name order by 5 desc

查询某表的所有字段的distinct行数

select a.table_name,b.num_rows,a.column_name,a.data_type,a.data_length,a.num_distinct,trunc((a.num_distinct/b.num_rows),2)*100||’%’ from dba_TAB_COLS a,dba_tables b where a.table_name=‘XX’ and a.table_name=b.table_name order by 6 desc

查询5G以上空闲空间可以进行收缩的数据文件

select ‘alter database datafile ‘’’ || a.file_name || ‘’’ resize ’ ||

round(a.filesize - (a.filesize - c.hwmsize) * 0.8) || ‘M;’,

a.filesize || ‘M’ as “数据文件的总大小”,

c.hwmsize || ‘M’ as “数据文件的实用大小”

from (select file_id, file_name, round(bytes / 1024 / 1024) as filesize

from dba_data_files) a,

(select file_id, round(max(block_id) * 8 / 1024) as HWMsize

from dba_extents group by file_id) c

where a.file_id = c.file_id

and a.filesize - c.hwmsize > 5000;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
changefilter.sql oracle的连接数查看和连接用户的查看.sql Sun30新建oracle用户.sql user_job.sql xaview.sql 修改分区索引.SQL 修改数据库核心字符集.txt 僵死进程查询.sql 创建ORACLE表空间.sql 回滚段等待.SQL 在数据库中建JOB.sql 外连接.SQL 外部例程.SQL 建6节点回滚段.SQL 建回滚段.SQL 建立一个与现存数据库相同但不含数据的空库.sql 扩展超过100M查询.sql 整理表空间碎片.sql 新建表.sql 显示数据文件信息.sql 查插入表的性能.sql 查看session正在执行什么SQL.sql 查看session正在等待何种系统资源.sql 查看哪些session正在使用哪些回滚段.sql 查看某个进程正在执行什么SQL语句.sql 查看用户表所占空间的大小.sql 查看系统SGA区状态.sql 查看系统中使用了哪些设备文件.sql 查看系统中每个表空间的使用情况.sql 查看系统中每个表空间的大小.sql 查看系统联接数.sql 查看系统锁.sql 查看表空间使用情况.sql 查看进程占用回滚段的情况.sql 查看那些数据库对象被修改过.sql 用oupput的ora过程.sql 用户命令查询.sql 用户进程查询.sql 监控数据库性能的SQL.sql 看user_job.sql 索引表清除sql生成.sql 索引表空间使用情况查询.sql 索引表空间整理.sql 统计.sql 获取数据库版本信息.sql 表空间使用情况.txt 表空间使用查询.sql 表空间剩余空间查看.sql 表空间回收.sql 过滤表清除sql生成.sql 进程使用回滚段查询.sql 锁表查询.sql

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值