1. 数据字典记载了数据库的系统信息,它是只读表和视图的集会。数据字典包含数据字典基表和数据字典视图两部分,其中,基表存储数据库的基本信息,普通用户不能之间访问数据字典基表;数据字典视图是基于数据字典基表建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括USER_XXX,ALL_XXX,DBA_XXX三种类型。 
  2.  
  3. 常用数据字典 
  4.  
  5. DICT用于显示当前用户可访问的所有数据字典视图,并给出了这些数据字典视图的作用。 
  6.  
  7. DICT_COLUMNS用于显示数据字典视图的每个列的作用。 
  8.  
  9. DUAL用于取得函数的返回值。 
  10.  
  11. GLOBAL_NAME用于显示当前数据库的全名。 
  12.  
  13. IND用于显示当前用户所拥有的所有索引和索引的统计信息。 
  14.  
  15. OBJ用于显示当前用户所拥有的所有对象。 
  16.  
  17. SEQ用于显示当前用户所拥有的所有序列。 
  18.  
  19. SYN用于显示当前用户所拥有的同义词和同义词所对应的数据库对象名。 
  20.  
  21. TAB用于显示当前用户所用于的表,视图和序列。 
  22.  
  23.   
  24.  
  25. 动态性能视图用于记录当前例程的活动信息。启动例程时,oracle会自动建立动态性能视图;停止例程时,oracle会自动删除动态性能视图。需要注意的时,数据字典的信息时从数据文件中取得,而动态性能视图时从SGA和控制文件中取得。通过查询动态性能视图,一方面可以获得性能数据,另一方面可以取得与磁盘和内存结构相关的其他信息。所有的动态性能视图都是以V_$开始的,oracle为每个动态性能视图提供了相应的同义词(以V$开始) 
  26.  
  27. V$FIXED_TABLE用于列出所有可用的动态性能视图和动态性能表。 
  28.  
  29. V$INSTANCE用于获取当前例程的详细信息。 
  30.  
  31. V$SGA用于取得SGA更详细的信息。 
  32.  
  33. V$PARAMETER用于取得初始化参数的详细信息。 
  34.  
  35. V$VERSION用于取得oracle版本的详细信息。 
  36.  
  37. V$OPTION 用于显示已经安装的oracle选项。其中,TRUE表示该选项已经安装,FALSE表示该选项没有安装。 
  38.  
  39.  
  40. V$SESSION 用于显示会话的详细信息。 
  41.  
  42.  
  43. V$PROCESS 用于显示与oracle相关的所有进程的信息(包括后台进程和服务器进程)。 
  44.  
  45.  
  46. V$BGPROCESS 用于显示后台进程的详细信息。 
  47.  
  48.  
  49. V$DATABASE 用于取得当前数据库的详细信息(如数据库名,日志模式以及建立时间)。 
  50.  
  51.  
  52. V$CONTROLFILE 用于取得当前数据库所有控制文件的信息。 
  53.  
  54.  
  55. V$DATAFILE 用于取得当前数据库所有数据文件的详细信息。 
  56.  
  57.  
  58. V$DBFILE 用于取得数据文件编号及名称。 
  59.  
  60.  
  61. V$LOGFILE 用于显示重做日志成员的信息。 
  62.  
  63.  
  64. V$LOG 用于显示日志组的详细信息。 
  65.  
  66.  
  67. V$THREAD 用于取得重做线程的详细信息。 
  68.  
  69.  
  70. V$LOCK 用于显示锁信息。 
  71.  
  72.  
  73. V$LOCKED_OBJECT 用于显示被加锁的数据库对象。 
  74.  
  75.  
  76. V$ROLLNAME和V$ROLLSTAT 
  77.  
  78. V$ROLLNAME动态性能视图用于显示处于online状态的undo段,而V$ROLLSTAT用于显示undo段统计信息。通过在二者之间执行连接查询,可以显示undo段的详细统计信息。 
  79.  
  80.  
  81. V$TABLESPACE 用于显示表空间的信息。 
  82.  
  83.  
  84. V$TEMPFILE用于显示当前数据库所包含的临时文件。 
  85.  
  86. 2. 
  87.  
  88. 常用DBA管理脚本  
  89.  
  90. 一、数据库构架体系  
  91.  
  92. 1、表空间的监控是一个重要的任务,我们必须时刻关心表空间的设置,是否满足现在应用的需求,以下的语句可以查询到表空间的详细信息 
  93.  
  94. SELECT TABLESPACE_NAME,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,  
  95. MAX_EXTENTS,PCT_INCREASE,MIN_EXTLEN,STATUS,  
  96. CONTENTS,LOGGING,  
  97. EXTENT_MANAGEMENT, -- Columns not available in v8.0.x  
  98. ALLOCATION_TYPE, -- Remove these columns if running  
  99. PLUGGED_IN, -- against a v8.0.x database  
  100. SEGMENT_SPACE_MANAGEMENT --use only in v9.2.x or later  
  101. FROM DBA_TABLESPACES  
  102. ORDER BY TABLESPACE_NAME; 
  103.  
  104.  
  105.  
  106. 2、对于某些数据文件没有设置为自动扩展的表空间来说,如果表空间满了,就将意味着数据库可能会因为没有空间而停止下来。监控表空间,最主要的就是监控剩余空间的大小或者是使用率。以下是监控表空间使用率与剩余空间大小的语句 
  107.  
  108. SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,SPACE-NVL(FREE_SPACE,0) "USED_SPACE(M)",  
  109. ROUND((1-NVL(FREE_SPACE,0)/SPACE)*100,2) "USED_RATE(%)",FREE_SPACE "FREE_SPACE(M)"  
  110. FROM  
  111. (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS  
  112. FROM DBA_DATA_FILES  
  113. GROUP BY TABLESPACE_NAME) D,  
  114. (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) FREE_SPACE  
  115. FROM DBA_FREE_SPACE  
  116. GROUP BY TABLESPACE_NAME) F  
  117. WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)  
  118. UNION ALL --if have tempfile  
  119. SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,  
  120. USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2) "USED_RATE(%)",  
  121. NVL(FREE_SPACE,0) "FREE_SPACE(M)"  
  122. FROM  
  123. (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS  
  124. FROM DBA_TEMP_FILES  
  125. GROUP BY TABLESPACE_NAME) D,  
  126. (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,  
  127. ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE  
  128. FROM V$TEMP_SPACE_HEADER  
  129. GROUP BY TABLESPACE_NAME) F  
  130. WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
  131.  
  132. 3、除了监控表空间的剩余空间,有时候我们也有必要了解一下该表空间是否具有自动扩展空间的能力,虽然我们建议在生产系统中预先分配空间。以下语句将完成这一功能 
  133.  
  134.  
  135.  
  136. SELECT T.TABLESPACE_NAME,D.FILE_NAME,  
  137. D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS  
  138. FROM DBA_TABLESPACES T,  
  139. DBA_DATA_FILES D  
  140. WHERE T. TABLESPACE_NAME =D. TABLESPACE_NAME  
  141. ORDER BY TABLESPACE_NAME,FILE_NAME 
  142.  
  143.  
  144.  
  145. 4、我相信使用字典管理的表空间的也不少吧,因为字典管理的表空间中,每个表的下一个区间的大小是不可以预料的,所以我们必须监控那些表在字典管理的表空间中的下一个区间的分配将会引起性能问题或由于是非扩展的表空间而导致系统停止。以下语句检查那些表的扩展将引起表空间的扩展。 
  146.  
  147.  
  148.  
  149. SELECT A.OWNER,A.TABLE_NAME,A.NEXT_EXTENT,A.TABLESPACE_NAME  
  150. FROM ALL_TABLES A,  
  151. (SELECT TABLESPACE_NAME, MAX(BYTES) BIG_CHUNK  
  152. FROM DBA_FREE_SPACE  
  153. GROUP BY TABLESPACE_NAME) F  
  154. WHERE F.TABLESPACE_NAME = A.TABLESPACE_NAME  
  155. AND A.NEXT_EXTENT > F.BIG_CHUNK 
  156.  
  157.  
  158.  
  159. 5、段的占用空间与区间数也是很需要注意的一个问题,如果一个段的占用空间太大,或者跨越太多的区间(在字典管理的表空间中,将有严重的性能影响),如果段没有可以再分配的区间,将导致数据库错误。所以,段的大小与区间监控也是一个很重要的工作 
  160.  
  161.  
  162.  
  163. SELECT S.OWNER,S.SEGMENT_NAME,S.SEGMENT_TYPE,S.PARTITION_NAME,  
  164. ROUND(BYTES/(1024*1024),2) "USED_SPACE(M)",  
  165. EXTENTS USED_EXTENTS,S.MAX_EXTENTS,S.BLOCKS ALLOCATED_BLOCKS,  
  166. S.BLOCKS USED_BOLCKS,S.PCT_INCREASE,S.NEXT_EXTENT/1024 "NEXT_EXTENT(K)"  
  167. FROM DBA_SEGMENTS S  
  168. WHERE S.OWNER NOT IN ('SYS','SYSTEM')  
  169. ORDER BY Used_Extents DESC 
  170.  
  171.  
  172.  
  173. 6、对象的空间分配与空间利用情况,除了从各个方面的分析,如分析表,查询rowid等方法外,其实oracle提供了一个查询空间的包dbms_space,如果我们稍封装一下,将是非常好用的一个东西。 
  174.  
  175.  
  176. CREATE OR REPLACE PROCEDURE show_space  
  177. (p_segname in varchar2,  
  178. p_type in varchar2 default 'TABLE' ,  
  179. p_owner in varchar2 default user)  
  180. AS  
  181. v_segname varchar2(100);  
  182. v_type varchar2(10);  
  183. l_free_blks number;  
  184. l_total_blocks number;  
  185. l_total_bytes number;  
  186. l_unused_blocks number;  
  187. l_unused_bytes number;  
  188. l_LastUsedExtFileId number;  
  189. l_LastUsedExtBlockId number;  
  190. l_LAST_USED_BLOCK number;  
  191. PROCEDURE p( p_label in varchar2, p_num in number )  
  192. IS  
  193. BEGIN  
  194. dbms_output.put_line( rpad(p_label,40,'.')|| p_num );  
  195. END;  
  196. BEGIN  
  197. v_segname := upper(p_segname);  
  198. v_type := p_type;  
  199. if (p_type = 'i' or p_type = 'I'then  
  200. v_type := 'INDEX';  
  201. end if;  
  202. if (p_type = 't' or p_type = 'T'then  
  203. v_type := 'TABLE';  
  204. end if;  
  205. if (p_type = 'c' or p_type = 'C'then  
  206. v_type := 'CLUSTER';  
  207. end if;  
  208. --以下部分不能用于ASSM  
  209. dbms_space.free_blocks  
  210. ( segment_owner => p_owner,  
  211. segment_name => v_segname,  
  212. segment_type => v_type,  
  213. freelist_group_id => 0,  
  214. free_blks => l_free_blks );  
  215. --以上部分不能用于ASSM  
  216. dbms_space.unused_space  
  217. ( segment_owner => p_owner,  
  218. segment_name => v_segname,  
  219. segment_type => v_type,  
  220. total_blocks => l_total_blocks,  
  221. total_bytes => l_total_bytes,  
  222. unused_blocks => l_unused_blocks,  
  223. unused_bytes => l_unused_bytes,  
  224. LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,  
  225. LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,  
  226. LAST_USED_BLOCK => l_LAST_USED_BLOCK );  
  227. --显示结果  
  228. p( 'Free Blocks', l_free_blks );  
  229. p( 'Total Blocks', l_total_blocks );  
  230. p( 'Total Bytes', l_total_bytes );  
  231. p( 'Unused Blocks', l_unused_blocks );  
  232. p( 'Unused Bytes', l_unused_bytes );  
  233. p( 'Last Used Ext FileId', l_LastUsedExtFileId );  
  234. p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );  
  235. p( 'Last Used Block', l_LAST_USED_BLOCK );  
  236. END
  237.  
  238.  
  239.  
  240. 执行结果将如下所示 
  241.  
  242.  
  243. SQL> set serveroutput on;  
  244. SQL> exec show_space('test');  
  245. Free Blocks.............................1  
  246. Total Blocks............................8  
  247. Total Bytes.............................65536  
  248. Unused Blocks...........................6  
  249. Unused Bytes............................49152  
  250. Last Used Ext FileId....................1  
  251. Last Used Ext BlockId...................48521  
  252. Last Used Block.........................2  
  253. PL/SQL procedure successfully completed 
  254.  
  255.  
  256.  
  257.  
  258.  
  259. 8、数据库的索引如果有比较频繁的Delete操作,将可能导致索引产生很多碎片,所以,在有的时候,需要对所有的索引重新REBUILD,以便合并索引块,减少碎片,提高查询速度。 
  260.  
  261.  
  262. SQL> set heading off  
  263. SQL> set feedback off  
  264. SQL> spool d:index.sql  
  265. SQL> SELECT 'alter index ' || index_name || ' rebuild '  
  266. ||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'  
  267. FROM all_indexes  
  268. WHERE ( tablespace_name != 'INDEXES'  
  269. OR next_extent != ( 256 * 1024 )  
  270. )  
  271. AND owner = USER  
  272. SQL>spool off 
  273.  
  274.  
  275.  
  276. 这个时候,我们打开spool出来的文件,就可以直接运行了。  
  277.  
  278. 9、表的主键是必要的,没有主键的表可以说是不符合设计规范的,所以我们需要监控表是否有主键 
  279.  
  280. SELECT table_name  
  281. FROM all_tables  
  282. WHERE owner = USER  
  283. MINUS  
  284. SELECT table_name  
  285. FROM all_constraints  
  286. WHERE owner = USER  
  287. AND constraint_type = 'P' 
  288.  
  289. 二、性能监控  
  290.  
  291. 1、数据缓冲区的命中率已经不是性能调整中的主要问题了,但是,过低的命中率肯定是不可以的,在任何情况下,我们必须保证有一个大的data buffer和一个高的命中率。  
  292. 这个语句可以获得整体的数据缓冲命中率,越高越好 
  293.  
  294.  
  295. SELECT a.VALUE + b.VALUE logical_reads,  
  296. c.VALUE phys_reads,  
  297. round(100*(1-c.value/(a.value+b.value)),4) hit_ratio  
  298. FROM v$sysstat a,v$sysstat b,v$sysstat c  
  299. WHERE a.NAME='db block gets'  
  300. AND b.NAME='consistent gets'  
  301. AND c.NAME='physical reads' 
  302.  
  303.  
  304.  
  305. 2、库缓冲说明了SQL语句的重载率,当然,一个SQL语句应当被执行的越多越好,如果重载率比较高,就考虑增加共享池大小或者是提高Bind变量的使用  
  306. 以下语句查询了Sql语句的重载率,越低越好 
  307.  
  308.  
  309.  
  310. SELECT SUM(pins) total_pins,SUM(reloads) total_reloads,  
  311. SUM(reloads)/SUM(pins)*100 libcache_reload_ratio  
  312. FROM v$librarycache 
  313.  
  314.  
  315.  
  316. 3、用户锁,数据库的锁有的时候是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。  
  317. 这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。  
  318. 可以通过alter system kill session ‘sid,serial#’来杀掉会话 
  319.  
  320.  
  321. SELECT /*+ rule */ s.username,  
  322. decode(l.type,'TM','TABLE LOCK',  
  323. 'TX','ROW LOCK',  
  324. NULL) LOCK_LEVEL,  
  325. o.owner,o.object_name,o.object_type,  
  326. s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser  
  327. FROM v$session s,v$lock l,dba_objects o  
  328. WHERE l.sid = s.sid  
  329. AND l.id1 = o.object_id(+)  
  330. AND s.username is NOT NULL 
  331.  
  332.  
  333.  
  334. 4、锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待  
  335. 以下的语句可以查询到谁锁了表,而谁在等待。 
  336.  
  337.  
  338. SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,  
  339. o.owner,o.object_name,o.object_type,s.sid,s.serial#  
  340. FROM v$locked_object l,dba_objects o,v$session s  
  341. WHERE l.object_id=o.object_id  
  342. AND l.session_id=s.sid  
  343. ORDER BY o.object_id,xidusn DESC 
  344.  
  345.  
  346.  
  347. 以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN  
  348.  
  349. 5、如果发生了事务或锁,想知道哪些回滚段正在被使用吗?其实通过事务表,我们可以详细的查询到事务与回滚段之间的关系。同时,如果关联会话表,我们则可以知道是哪个会话发动了这个事务。 
  350.  
  351.  
  352. SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL "UBA filenum",  
  353. t.UBABLK "UBA Block number",t.USED_UBLK "Number os undo Blocks Used",  
  354. t.START_TIME,t.STATUS,t.START_SCNB,t.XIDUSN RollID,r.NAME RollName  
  355. FROM v$session s,v$transaction t,v$rollname r  
  356. WHERE s.SADDR=t.SES_ADDR  
  357. AND t.XIDUSN=r.usn 
  358.  
  359.  
  360.  
  361.  
  362.  
  363. 7、如果利用会话跟踪或者是想查看某个会话的跟踪文件,那么查询到OS上的进程或线程号是非常重要的,因为文件的令名中,就包含这个信息,以下的语句可以查询到进程或线程号,由此就可以找到对应的文件。 
  364.  
  365.  
  366. SELECT p1.value||''||p2.value||'_ora_'||p.spid filename  
  367. FROM  
  368. v$process p,  
  369. v$session s,  
  370. v$parameter p1,  
  371. v$parameter p2  
  372. WHERE p1.name = 'user_dump_dest'  
  373. AND p2.name = 'db_name'  
  374. AND p.addr = s.paddr  
  375. AND s.audsid = USERENV ('SESSIONID'); 
  376.  
  377.  
  378.  
  379. 8、在ORACLE 9i中,可以监控索引的使用,如果没有使用到的索引,完全可以删除掉,减少DML操作时的操作。  
  380. 以下就是开始索引监控与停止索引监控的脚本 
  381.  
  382.  
  383. set heading off  
  384. set echo off  
  385. set feedback off  
  386. set pages 10000  
  387. spool start_index_monitor.sql  
  388.  
  389. SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'  
  390. FROM dba_indexes  
  391. WHERE owner = USER;  
  392.  
  393. spool off  
  394. set heading on  
  395. set echo on  
  396. set feedback on  
  397. ------------------------------------------------  
  398. set heading off  
  399. set echo off  
  400. set feedback off  
  401. set pages 10000  
  402. spool stop_index_monitor.sql  
  403.  
  404. SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'  
  405. FROM dba_indexes  
  406. WHERE owner = USER;  
  407.  
  408. spool off  
  409. set heading on  
  410. set echo on  
  411. set feedback on 
  412.  
  413.  
  414. 如果需要监控更多的用户,可以将owner=User改写成别的  
  415. 监控结果在视图v$object_usage中查询 
  416. 感谢fenng,他提供了一个更新版的show_space脚本 
  417.  
  418.  
  419.  
  420. CREATE OR REPLACE PROCEDURE show_space  
  421. ( p_segname IN VARCHAR2,  
  422. p_owner IN VARCHAR2 DEFAULT USER,  
  423. p_type IN VARCHAR2 DEFAULT 'TABLE',  
  424. p_partition IN VARCHAR2 DEFAULT NULL )  
  425. -- This procedure uses AUTHID CURRENT USER so it can query DBA_*  
  426. -- views using privileges from a ROLE and so it can be installed  
  427. -- once per database, instead of once per user who wanted to use it.  
  428. AUTHID CURRENT_USER  
  429. as  
  430. l_free_blks number;  
  431. l_total_blocks number;  
  432. l_total_bytes number;  
  433. l_unused_blocks number;  
  434. l_unused_bytes number;  
  435. l_LastUsedExtFileId number;  
  436. l_LastUsedExtBlockId number;  
  437. l_LAST_USED_BLOCK number;  
  438. l_segment_space_mgmt varchar2(255);  
  439. l_unformatted_blocks number;  
  440. l_unformatted_bytes number;  
  441. l_fs1_blocks number; l_fs1_bytes number;  
  442. l_fs2_blocks number; l_fs2_bytes number;  
  443. l_fs3_blocks number; l_fs3_bytes number;  
  444. l_fs4_blocks number; l_fs4_bytes number;  
  445. l_full_blocks number; l_full_bytes number;  
  446.  
  447. -- Inline procedure to print out numbers nicely formatted  
  448. -- with a simple label.  
  449. PROCEDURE p( p_label in varchar2, p_num in number )  
  450. IS  
  451. BEGIN  
  452. dbms_output.put_line( rpad(p_label,40,'.') ||  
  453. to_char(p_num,'999,999,999,999') );  
  454. END;  
  455. BEGIN  
  456. -- This query is executed dynamically in order to allow this procedure  
  457. -- to be created by a user who has access to DBA_SEGMENTS/TABLESPACES  
  458. -- via a role as is customary.  
  459. -- NOTE: at runtime, the invoker MUST have access to these two  
  460. -- views!  
  461. -- This query determines if the object is an ASSM object or not.  
  462. BEGIN  
  463. EXECUTE IMMEDIATE  
  464. 'select ts.segment_space_management  
  465. FROM dba_segments seg, dba_tablespaces ts  
  466. WHERE seg.segment_name = :p_segname  
  467. AND (:p_partition is null or  
  468. seg.partition_name = :p_partition)  
  469. AND seg.owner = :p_owner  
  470. AND seg.tablespace_name = ts.tablespace_name'  
  471. INTO l_segment_space_mgmt  
  472. USING p_segname, p_partition, p_partition, p_owner;  
  473. EXCEPTION  
  474. WHEN too_many_rows THEN  
  475. dbms_output.put_line  
  476. 'This must be a partitioned table, use p_partition => ');  
  477. RETURN;  
  478. END;  
  479.  
  480. -- If the object is in an ASSM tablespace, we must use this API  
  481. -- call to get space information; else we use the FREE_BLOCKS  
  482. -- API for the user managed segments.  
  483. IF l_segment_space_mgmt = 'AUTO'  
  484. THEN  
  485. dbms_space.space_usage  
  486. ( p_owner, p_segname, p_type, l_unformatted_blocks,  
  487. l_unformatted_bytes, l_fs1_blocks, l_fs1_bytes,  
  488. l_fs2_blocks, l_fs2_bytes, l_fs3_blocks, l_fs3_bytes,  
  489. l_fs4_blocks, l_fs4_bytes, l_full_blocks, l_full_bytes, p_partition);  
  490.  
  491. p( 'Unformatted Blocks ', l_unformatted_blocks );  
  492. p( 'FS1 Blocks (0-25) ', l_fs1_blocks );  
  493. p( 'FS2 Blocks (25-50) ', l_fs2_blocks );  
  494. p( 'FS3 Blocks (50-75) ', l_fs3_blocks );  
  495. p( 'FS4 Blocks (75-100)', l_fs4_blocks );  
  496. p( 'Full Blocks ', l_full_blocks );  
  497. ELSE  
  498. dbms_space.free_blocks(  
  499. segment_owner => p_owner,  
  500. segment_name => p_segname,  
  501. segment_type => p_type,  
  502. freelist_group_id => 0,  
  503. free_blks => l_free_blks);  
  504.  
  505. p( 'Free Blocks', l_free_blks );  
  506. END IF;  
  507.  
  508. -- And then the unused space API call to get the rest of the  
  509. -- information.  
  510. dbms_space.unused_space  
  511. ( segment_owner => p_owner,  
  512. segment_name => p_segname,  
  513. segment_type => p_type,  
  514. partition_name => p_partition,  
  515. total_blocks => l_total_blocks,  
  516. total_bytes => l_total_bytes,  
  517. unused_blocks => l_unused_blocks,  
  518. unused_bytes => l_unused_bytes,  
  519. LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,  
  520. LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,  
  521. LAST_USED_BLOCK => l_LAST_USED_BLOCK );  
  522.  
  523. p( 'Total Blocks', l_total_blocks );  
  524. p( 'Total Bytes', l_total_bytes );  
  525. p( 'Total MBytes', trunc(l_total_bytes/1024/1024) );  
  526. p( 'Unused Blocks', l_unused_blocks );  
  527. p( 'Unused Bytes', l_unused_bytes );  
  528. p( 'Last Used Ext FileId', l_LastUsedExtFileId );  
  529. p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );  
  530. p( 'Last Used Block', l_LAST_USED_BLOCK );  
  531. END
  532.  
  533.  
  534.  
  535. 隐含参数:  
  536. select a.ksppinm "parameter ", a.ksppdesc "descriptoin "  
  537. from x$ksppi a,x$ksppcv b,x$ksppsv c  
  538. where a.indx=b.indx and a.indx=c.indx and a.ksppinm like '/_%' escape '/'
  539.  
  540. Check OS process id from Oracle sid 
  541.  
  542.  
  543.  
  544. select spid from v$process  
  545. where addr in ( select paddr from v$session where sid=[$sid) ] 
  546.  
  547.  
  548.  
  549. Check Oracle sid from OS process id 
  550.  
  551.  
  552. select sid from v$session  
  553. where paddr in ( select addr from v$process where spid=[$pid) ] 
  554.  
  555.  
  556.  
  557. Check current SQL in a session 
  558.  
  559.  
  560. select SQL_TEXT from V$SQLTEXT  
  561. where HASH_VALUE =  
  562. select SQL_HASH_VALUE from v$session  
  563. where sid = &sid)  
  564. order by PIECE 
  565.  
  566.  
  567.  
  568. Checking v$session_wait 
  569.  
  570.  
  571. select * from v$session_wait  
  572. where event not like 'rdbms%'  
  573. and event not like 'SQL*N%'  
  574. and event not like '%timer'
  575.  
  576.  
  577.  
  578. Dictionary Cache Hits 
  579.  
  580.  
  581. SELECT sum(getmisses)/sum(gets) FROM v$rowcache;  
  582. /*It should be < 15%, otherwise Add share_pool_size*/ 
  583.  
  584.  
  585.  
  586. Check DB object name from file id and block# 
  587.  
  588.  
  589. select owner,segment_name,segment_type  
  590. from dba_extents  
  591. where file_id = [$fno and &dno between block_id and block_id + blocks – 1 ] 
  592.  
  593.  
  594. #寻找hot block  
  595. select /*+ ordered */  
  596. e.owner ||'.'|| e.segment_name segment_name,  
  597. e.extent_id extent#,  
  598. x.dbablk - e.block_id + 1 block#,  
  599. x.tch,  
  600. l.child#  
  601. from  
  602. sys.v$latch_children l,  
  603. sys.x$bh x,  
  604. sys.dba_extents e  
  605. where  
  606. l.name = 'cache buffers chains' and  
  607. l.sleeps > &sleep_count and  
  608. x.hladdr = l.addr and  
  609. e.file_id = x.file# and  
  610. x.dbablk between e.block_id and e.block_id + e.blocks - 1;  
  611.  
  612. #找出每个文件上的等待事件  
  613. select df.name,kf.count from v$datafile df,x$kcbfwait kf where (kf.indx+1)=df.file#;  
  614.  
  615. #找出引起等待事件的SQL语句.  
  616. select sql_text from v$sqlarea a,v$session b,v$session_wait c where a.address=b.sql_address and b.sid=c.sid and c.event=[$ll]  
  617.  
  618. #监控共享池中哪个对象引起了大的内存分配  
  619. SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0; 
  620.  
  621. 判断你是从pfile启动还是spfile启动的简单方法!!! 
  622.  
  623. 判断你是从pfile启动还是spfile启动的简单方法!!!  
  624.  
  625. select decode(count(*), 1, 'spfile''pfile' )  
  626. from v$spparameter  
  627. where rownum=1  
  628. and isspecified='TRUE'  
  629. /  
  630.  
  631. DECODE  
  632. ------  
  633. spfile  
  634. ORACLE常用技巧和脚本 
  635.  
  636. ORACLE常用技巧和脚本 
  637. 1.如何查看ORACLE的隐含参数? 
  638. ORACLE的显式参数,除了在INIT.ORA文件中定义的外,在svrmgrl中用"show parameter *",可以显示。但ORACLE还有一些参数是以“_”,开头的。如我们非常熟悉的“_offline_rollback_segments”等。 
  639. 这些参数可在sys.x$ksppi表中查出。 
  640. 语句:“select ksppinm from x$ksppi where substr(ksppinm,1,1)='_'; ” 
  641.  
  642. 2.如何查看安装了哪些ORACLE组件? 
  643. 进入${ORACLE_HOME}/orainst/,运行./inspdver,显示安装组件和版本号。 
  644.   
  645. 3.如何查看ORACLE所占用共享内存的大小? 
  646. 可用UNIX命令“ipcs”查看共享内存的起始地址、信号量、消息队列。 
  647. 在svrmgrl下,用“oradebug ipc”,可看出ORACLE占用共享内存的分段和大小。 
  648. example: 
  649. SVRMGR> oradebug ipc 
  650. -------------- Shared memory -------------- 
  651. Seg Id Address Size 
  652. 1153 7fe000 784 
  653. 1154 800000 419430400 
  654. 1155 19800000 67108864 
  655.  
  656. 4.如何查看当前SQL*PLUS用户的sid和serial#? 
  657. 在SQL*PLUS下,运行: 
  658. select sid, serial#, status from v$session  
  659. where audsid=userenv('sessionid');” 
  660.   
  661. 5.如何查看当前数据库的字符集? 
  662. 在SQL*PLUS下,运行: 
  663. select userenv('language'from dual;” 
  664. 或:“select userenv('lang'from dual; ” 
  665.   
  666. 6.如何查看数据库中某用户,正在运行什么SQL语句? 
  667. 根据MACHINE、USERNAME或SID、SERIAL#,连接表V$SESSION和V$SQLTEXT,可查出。 
  668. SQL*PLUS语句: 
  669. SELECT SQL_TEXT FROM V$SQL_TEXT T, V$SESSION S WHERE T.ADDRESS=S.SQL_ADDRESS 
  670. AND T.HASH_VALUE=S.SQL_HASH_VALUE 
  671. AND S.MACHINE='XXXXX' OR USERNAME='XXXXX' -- 查看某主机名,或用户名  
  672. /”  
  673. 7.如何删除表中的重复记录?  
  674. 例句: 
  675. DELETE 
  676. FROM table_name a 
  677. WHERE rowid > ( SELECT min(rowid) 
  678. FROM table_name b 
  679. WHERE b.pk_column_1 = a.pk_column_1 
  680. and b.pk_column_2 = a.pk_column_2 ); 
  681.  
  682. 8.手工临时强制改变服务器字符集 
  683. 以sys或system登录系统,sql*plus运行:“create database character set us7ascii;". 
  684. 有以下错误提示: 
  685. create database character set US7ASCII 
  686. ERROR at line 1: 
  687. ORA-01031: insufficient privileges 
  688. 实际上,看v$nls_parameters,字符集已更改成功。但重启数据库后,数据库字符集又变回原来的了。 
  689. 该命令可用于临时的不同字符集服务器之间数据倒换之用。 
  690. 9.怎样查询每个instance分配的PCM锁的数目 
  691. 用以下命令: 
  692. select count(*) "Number of hashed PCM locks" from v$lock_element where bitand(flags,4)<>0 
  693. select count(*) "Number of fine grain PCM locks" from v$lock_element  
  694. where bitand(flags,4)=0 
  695. 10. 怎么判断当前正在使用何种SQL优化方式? 
  696. 用explain plan产生EXPLAIN PLAN,检查PLAN_TABLE中ID=0的POSITION列的值。 
  697. e.g. 
  698. select decode(nvl(position,-1),-1,'RBO',1,'CBO'from plan_table where id=0 
  699. 11. 做EXPORT时,能否将DUMP文件分成多个? 
  700. ORACLE8I中EXP增加了一个参数FILESIZE,可将一个文件分成多个: 
  701. EXP SCOTT/TIGER FILE=(ORDER_1.DMP,ORDER_2.DMP,ORDER_3.DMP) FILESIZE=1G TABLES=ORDER; 
  702.   
  703. 其他版本的ORACLE在UNIX下可利用管道和split分割: 
  704. mknod pipe p 
  705. split -b 2048m pipe order & #将文件分割成,每个2GB大小的,以order为前缀的文件: 
  706. #orderaa,orderab,orderac,... 并将该进程放在后台。 
  707. EXP SCOTT/TIGER FILE=pipe tables=order 
  708. 户如何有效地利用数据字典 
  709.  
  710. 用户如何有效地利用数据字典 
  711.  
  712. ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化,  
  713. 体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。 
  714.  
  715. 数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 
  716. 我们不能手工修改数据字典里的信息。 
  717.  
  718.   很多时候,一般的ORACLE用户不知道如何有效地利用它。 
  719.  
  720.   dictionary   全部数据字典表的名称和解释,它有一个同义词dict 
  721. dict_column   全部数据字典表里字段名称和解释 
  722.  
  723. 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: 
  724.  
  725. SQL>select * from dictionary where instr(comments,'index')>0; 
  726.  
  727. 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: 
  728.  
  729. SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES'
  730.  
  731. 依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 
  732.  
  733. 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 
  734. 一、用户 
  735.  
  736. 查看当前用户的缺省表空间 
  737. SQL>select username,default_tablespace from user_users; 
  738.  
  739. 查看当前用户的角色 
  740. SQL>select * from user_role_privs; 
  741.  
  742. 查看当前用户的系统权限和表级权限 
  743. SQL>select * from user_sys_privs; 
  744. SQL>select * from user_tab_privs; 
  745.  
  746. 还有一个网址的也不错,有实例:http://teddywang.iteye.com/blog/753785