Oracle 常用的V$ 視圖腳本

1. 基本的數據庫信息 版本信息: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production 數據庫信息: SQL> select name, created, log_mode from v$database; NAME CREATED LOG_MODE --------- -------------- ------------ TEST 13-9月 -09 ARCHIVELOG 2. 自動工作量倉庫(AWR) 的基本信息 自動工作量倉庫(AWR)在默認情況下,倉庫用小時填充,保留期是7天。 AWR使用多少空間 SQL>Select occupant_name,occupant_desc,space_usage_kbytes from v$sysaux_occupants where occupant_name like '%AWR%'; OCCUPANT_N OCCUPANT_DESC SPACE_USAGE_KBYTES ---------- -------------------------------------------------- ------------------ SM/AWR Server Manageability - Automatic Workload Repository 51200 系統上最原始的AWR信息是什麼? SQL> select dbms_stats.get_stats_history_availability from dual; GET_STATS_HISTORY_AVAILABILITY --------------------------------------------------------------------------- 21-8月 -09 09.18.15.359000000 上午 +08:00 什麼是AWR信息的保留期? SQL> select dbms_stats.get_stats_history_retention from dual; GET_STATS_HISTORY_RETENTION --------------------------- 31 將AWR信息的保留期更改爲15天? SQL> EXEC dbms_stats.alter_stats_history_retention(15); PL/SQL 過程已成功完成。 3. 基本的許可信息 V$LICENSE視圖允許DBA監控系統內任何時候有關數據庫數量的所有系統活動的數量。會話警告級別爲0表示沒有設置init.ora會話警告參數,所以系統不會顯示警告信息。會話最大級別爲0表示沒有設置init.ora會話最大參數,所以系統不會限制會話的數量。查詢V$LICENSE視圖,以查看所允許的最大會話數。也可以在接近最大數時設置警告。 應該定期執行腳本,以向DBA提供系統一天中實際的會話數量,從而保證正確的許可授權。設置init.ora參數LICENSE_MAX_SESSIONS = 110,將會話數限制爲110。設置init.ora參數LICENSE_SESSIONS_WARNING = 100,系統將向每位在第100個會話之後的用戶顯示警告信息,這樣他們就會通知DBA,系統因遇到問題而關閉(希望能如此)。init.ora參數LICENSE_MAX_USERS用於設置數據庫中可以創建的已命名的用戶數。在以下程序清單中,該值爲0,所以沒有限制。 SQL> select * from v$license; SESSIONS_MAX SESSIONS_WARNING SESSIONS_CURRENT SESSIONS_HIGHWATER USERS_MAX ------------ ---------------- ---------------- ------------------ ---------- 0 0 9 18 0 4. 數據庫中已安裝的產品項 查詢V$OPTION視圖,可以獲取您已安裝的Oracle產品項。V$VERSION視圖將給出已安裝的基本產品項的版本。 SQL> select * from v$option; PARAMETER VALUE ---------------------------------------------------------------- ----- Partitioning TRUE Objects TRUE Real Application Clusters FALSE Advanced replication TRUE Bit-mapped indexes TRUE Oracle Data Guard TRUE Oracle Label Security FALSE Flashback Database TRUE Data Mining Scoring Engine FALSE Transparent Data Encryption TRUE Backup Encryption TRUE Unused Block Compression TRUE ... ... 5. 內存分配摘要(V$SGA) V$SGA視圖給出了系統的系統全局區(System Global Area,SGA)內存結構的摘要信息。Data Buffers是在內存中分配給數據的字節數量。它根據init.ora的參數DB_CACHE_SIZE得到。Redo Buffers主要是依據init.ora參數LOG_BUFFER計算得到,每當COMMIT命令提交數據時,它被用於緩存已改變的記錄並將它們保存到重做日誌中。訪問V$SGA視圖可以得到系統的物理內存分配的基本概念,包括在Oracle中爲數據、共享池、large池、java池以及日誌緩衝區分配的內存。 SQL> COLUMN value FORMAT 999,999,999,999 SQL> select * from v$sga; NAME VALUE -------------------- ---------------- Fixed Size 1,248,576 Variable Size 100,664,000 Database Buffers 180,355,072 Redo Buffers 7,139,328 如果使用SGA_TARGET-- 內部動態調整大小: SQL> select ((select sum(value) from v$sga) -(select current_size from v$sga_dynamic_free_memory)) " SGA_TARGET" from dual; SGA_TARGET ---------- 289406976 6.內存分配的細節(V$SGASTAT) 在V$視圖中,可以查詢V$SGASTAT視圖來提供有關SGA更詳細的內存分配信息。這個視圖提供了SGA和內存資源的動態信息(訪問數據庫時會出現相應變化)。這個語句非常詳細地描述了SGA的尺寸。在V$SGA和V$SGASTAT視圖中均包含記錄FIXED_SGA、BUFFER_CACHE和LOG_BUFFER.V$SGASTAT視圖可獲取Oracle SGA詳細的分類列表以及共享池分配中各存儲容器的詳細信息。 SQL> select * from v$sgastat; POOL NAME BYTES ------------ -------------------------- ---------- fixed_sga 1248576 buffer_cache 180355072 log_buffer 7139328 shared pool dpslut_kfdsg 256 shared pool hot latch diagnostics 80 shared pool ENQUEUE STATS 8360 shared pool transaction 264528 shared pool KCB buffer wait statistic 3352 shared pool invalid low rba queue 320 shared pool KQF optimizer stats table 2396 ... ... 7. 在V$PARAMETER顯示init.ora信息 程序清單中的腳本顯示了系統中的init.ora參數。它還提供了有關參數的信息,確定每一個參數的當前值是否就是默認值(ISDEFAULT=TRUE)。查詢V$PARAMETER視圖,將得到init.ora參數的當前值。它還顯示了哪些init.ora參數已經改動了原始的默認值:ISDEFAULT = FALSE。它還顯示了對於一個給定的會話,只能修改哪些參數(當ISSES_MODIFIABLE = TRUE時)。最後,它顯示了在不用關閉和重啓數據庫可以修改哪些參數(當ISSYS_MODIFIABLE = IMMEDIATE時);而ISSYS_MODIFIABLE = DEFERRED說明該參數對所有新登錄的,但當前未登錄會話的用戶有效。如果參數ISSYS _MODIFIABLE =FALSE,則說明該實例必須關閉並重啓,才能使設置生效。 SQL>select name, value, isdefault, isses_modifiable,issys_modifiable from v$parameter order by name; NAME VALUE ISDEFAULT ISSES ISSYS_MOD --------------- ----------------------------------- --------- ----- --------- active_instance TRUE FALSE FALSE asm_diskgroups TRUE FALSE IMMEDIATE audit_file_dest D:/ORACLE/ADMIN/TEST/ADUMP FALSE FALSE DEFERRED audit_sys_opera FALSE TRUE FALSE FALSE background_dump D:/ORACLE/ADMIN/TEST/BDUMP FALSE FALSE IMMEDIATE backup_tape_io_ FALSE TRUE FALSE DEFERRED ... ... 8.測定數據的命中率(V$SYSSTAT) 查詢V$SYSSTAT視圖(如下程序清單所示)可以查看從內存中讀取數據的頻率。它提供了數據庫中設置的數據塊緩存區的命中率。這個信息可以幫助您判斷系統何時需要更多的數據緩存(DB_CACHE_SIZE),或者系統的狀態何時調整得不佳(二者均將導致較低的命中率)。通常情況下,您應當確保讀數據的命中率保持在95%以上。將系統的命中率從98%提高到99%,可能意味着性能提高了100%(取決於引起磁盤讀操作的語句)。 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; Read Hit Ratio -------------- .993067726 在Oracle 10g中,也可以直接獲得V$SYSMETRIC中的 AWR 信息: SQL> select metric_name,value from v$sysmetric where metric_name='Buffer Cache Hit Ratio'; METRIC_NAME VALUE ---------------------------------------------------------------- ---------- Buffer Cache Hit Ratio 100 Buffer Cache Hit Ratio 100 9.測定數據字典的命中率(V$ROWCACHE) 可以使用V$ROWCACHE視圖(如程序清單所示)來發現對數據字典的調用是否有效地利用了通過init.ora參數SHARED_POOL_SIZE分配的內存緩存.如果字典的命中率不高,系統的綜合性能將大受影響。推薦的命中率是95%或者更高。如果命中率低於這個百分比,說明可能需要增加init.ora參數SHARED_POOL_SIZE。但要記住,在V$SGASTAT視圖中看到的共享池包括多個部分,而這裏僅僅就是其中之一。注意:在大幅度使用公共同名的環境中,字典命中率可能難以超過75%,即使共享池的尺寸很大。這是因爲Oracle必須經常檢查不存在的對象是否依舊存在。 SQL>select sum(gets),sum(getmisses),(1 - (sum(getmisses) / (sum(gets)+ sum(getmisses)))) * 100 HitRate from v$rowcache; SUM(GETS) SUM(GETMISSES) HITRATE ---------- -------------- ---------- 370854 11068 97.1020261 在Oracle 10g中,也可以直接獲得V$SYSMETRIC中的AWR信息: select metric_name, value from v$sysmetric where metric_name ='Library Cache Hit Ratio'; METRIC_NAME VALUE ---------------------------------------------------------------- ---------------- Library Cache Hit Ratio 98.0281690140845 Library Cache Hit Ratio 98.0281690140845 10.測定共享SQL和PL/SQL的命中率(V$LIBRARYCACHE) 訪問V$LIBRARYCACHE視圖可以顯示實際使用的語句(SQL和PL/SQL)訪問內存的情況。如果init.ora的參數SHARED_POOL_SIZE設置得太小,內存中就沒有足夠的空間來存儲所有的語句。固定命中率通常應該是95%或更高,而重載的次數不應該超過1%。查詢V$SQL_BIND_CAPTURE視圖,看看每個SQL綁定是否太高,是否需要CURSOR_SHARING。 select sum(pins) "Executions", sum(pinhits) "Hits",((sum(pinhits) / sum(pins)) * 100) "PinHitRatio",sum(reloads) "Misses", ((sum(pins) / (sum(pins)+ sum(reloads))) * 100) "RelHitRatio" from v$librarycache; Executions Hits PinHitRatio Misses RelHitRatio ---------- ---------- ----------- ---------- ----------- 417954 403489 96.5390928 4092 99.0304374 查詢 v$sql_bind_capture,看看 average binds 是否大於15 (issue): select sql_id, count(*) bind_count from v$sql_bind_capture where child_number = 0 group by sql_id having count(*) > 20order by count(*); SQL_ID BIND_COUNT ------------- ---------- 9qgtwh66xg6nz 21 11.確定需要固定的PL/SQL對象 碎片化現象造成共享池中的可用空間均成爲許多零散的片段,而沒有足夠大的連續空間,這是共享池中的普遍現象。消除共享池錯誤(參閱第4章和第13章以瞭解更多信息)的關鍵是理解哪些對象會引起問題。一旦知道了會引起潛在問題的PL/SQL對象,就可以在數據庫啓動時固定這個代碼(這時共享池是完全連續的)。 SQL>select name, sharable_mem from v$db_object_cache where sharable_mem > 100000 and type in ('PACKAGE', 'PACKAGE BODY','FUNCTION', 'PROCEDURE') and kept = 'NO'; NAME SHARABLE_MEM ----------------- ------------ DBMS_BACKUP_RESTO 258495 DBMS_STATS 131422 12.通過V$SQLAREA查找有問題的查詢 V$SQLAREA視圖提供了一種識別有潛在問題或者需要優化的SQL語句的方法,從而可通過減少磁盤的訪問來優化數據庫的綜合性能。 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.command_type, a.sql_text Statement from v$sqlarea a, dba_users b where a.parsing_user_id = b.user_id and a.disk_reads > 100000 order by a.disk_reads desc; 13.檢查用戶的當前操作及其使用的資源 將V$SESSION和V$SQLTEXT連接就可以顯示目前每一個會話正在執行的SQL語句,如下面的程序清單所示。這在有些時候是極爲有用的,例如DBA希望查看某一個給定的時間點上系統究竟執行了哪些操作。 select a.sid, a.username, s.sql_text 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; USERNAME BLOCK_GETS CONSISTENT_GETS PHYSICAL_READS ------------------------------ ---------- --------------- -------------- DBSNMP 27 118917 246 DBSNMP 4383 111119 268 SYSMAN 45617 123434 660 SYSMAN 9416 94902 157 SYSMAN 380 37019 47 SYSTEM 11 256588 147 14.查找用戶正在訪問的對象 通過查詢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; 15.使用索引 Oracle 9i提供了監控索引使用的功能。這個新的視圖表示索引是否被引用,但不能反映索引使用的頻率。要監控的索引需要單獨打開和關閉。可以使用alter index命令來初始化監控工作,然後通過對視圖V$OBJECT_USAGE的查詢來實現索引的跟蹤。 select * from v$object_usage; 開始監控索引: alter index HRDT_INDEX1 monitoring usage; select index_name, table_name, monitoring, used,start_monitoring, end_monitoring from v$object_usage; INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING ----------- ---------- --- --- ------------------- ------------------ HRDT_INDEX1 HRS_DETAIL YES NO 10/13/2002 03:11:34 16.確定鎖定問題 確定鎖定問題將有助於定位正在等待其他某些用戶或者某些東西的用戶。可以使用這個策略來確定當前被鎖定在系統中的用戶。這也使DBA們可以確認一個相關的Oracle進程是否真地被鎖定了,還是僅僅運行得比較慢。您還能夠識別當前的語句是否正在執行鎖定用戶的操作。 select /*+ ordered */ b.username, b.serial#, d.id1, a.sql_text from v$lock d, v$session b, v$sqltext a where b.lockwait = d.kaddr and a.address = b.sql_address and a.hash_value = b.sql_hash_value; 查看系統中是哪個用戶造成了前一個用戶被鎖定的問題 select /*+ ordered */ a.serial#, a.sid, a.username, b.id1, c.sql_text from v$lock b, v$session a, v$sqltext c where b.id1 in(select /*+ ordered */ distinct e.id1 from v$lock e, v$session d where d.lockwait= e.kaddr) and a.sid = b.sid and c.hash_value = a.sql_hash_value and b.request = 0; 17. 關閉有問題的會話 select username, sid, serial#, program, terminal from v$session; alter system kill session '11,18'; You can't kill your own session though: alter system kill session '10,4'; *ERROR at line 1:ORA-00027: cannot kill current session 18.查找使用多會話的用戶 有些時候,用戶喜歡使用多會話來一次完成多個任務,但這會引起問題。開發人員也會有同樣的問題,如果他開發了一個創建了會派生大量進程的糟糕的應用程序。所有這些都可能降低系統的綜合性能。用戶名NULL是後臺進程。 SQL> select username, count(*) from v$session group by username; USERNAME COUNT(*) ------------------------------ ---------- 17 SYSTEM 4 SYSMAN 3 DBSNMP 2 19.查找磁盤I/O問題 視圖V$DATAFILE、V$FILESTAT和V$DBA_DATA_FILES提供了數據庫中所有數據文件和磁盤的文件I/O活動信息。理想情況下,物理的讀和寫應當平均分佈。如果沒有合理的配置系統,其綜合性能就會受到影響。 select a.file#, a.name, a.status, a.bytes,b.phyrds, b.phywrts from v$datafile a, v$filestat b where a.file# = b.file#; FILE# NAME STATUS BYTES PHYRDS PHYWRTS ---------- ----------------- ------- ---------- ---------- ---------- 1 D:/ORACLE/ORADATA SYSTEM 534773760 7732 1506 2 D:/ORACLE/ORADATA ONLINE 31457280 54 2778 3 D:/ORACLE/ORADATA ONLINE 356515840 2680 7905 4 D:/ORACLE/ORADATA ONLINE 5242880 25 3 20.查找回滾段的內容 這個有幫助的查詢顯示了一個回滾段的實際等待數。可以顯示回滾信息(包括自動撤消)。還可以從程序清單顯示的視圖中查詢Shrink和 wrap信息。查詢V$ROLLNAME、V$ROLLSTAT和V$TRANSACTION視圖可以提供用戶如何使用回滾段和撤消表空間的信息。通常情況下,在一個時間點上不應讓多個用戶訪問同一個回滾段(儘管這是被允許的)。 select a.name, b.extents, b.rssize, b.xacts,b.waits, b.gets, optsize, status from v$rollname a, v$rollstat b where a.usn = b.usn; NAME EXTENTS RSSIZE XACTS WAITS GETS STATUS ----------------- ---------- ---------- ---------- ---------- ---------- ------- SYSTEM 6 385024 0 0 215 ONLINE _SYSSMU1$ 3 1171456 0 0 3191 ONLINE 21.檢查空閒列表是否充足 如果使用多進程完成大量的插入操作,空閒列表(空閒的數據庫數據塊的列表)的默認值1可能是不夠的。如果沒有使用自動空間段管理(Automatic Space Segment Management,簡稱ASSM),您可能需要增加空閒列表,或者空閒列表組。在使用多進程完成大量的插入操作時,應確保有足夠的空閒列表和空閒列表組。空閒列表的默認存儲值是1。如果您使用了ASSM,Oracle將爲您管理這些參數,但是一個有大量數據交換的事務環境中,在應用ASSM前應經過仔細的測試。雖然如此,但通常最好使用ASSM。 select ((A.Count/(B.Value + C.Value))*100)Pct from V$WaitStat A, V$SysStat B, V$SysStat C where A.Class = 'free list' and B.Statistic# = ( select Statistic# from V$StatName where Name = 'db block gets') and C.Statistic# = (select Statistic# from V$StatName where Name = 'consistent gets'); 22 檢查角色和權限設置 根據用戶名進行授權的對象級特權 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 order by 1,2,3; 根據被授權人進行授權的對象級特權 Select owner || '.' || table_name obj,privilege what_granted, grantable, grantee from sys.dba_tab_privs where not exists(select 'x'from sys.dba_users where username = grantee)order by 1,2,3; 根據用戶名進行授予的系統級特權 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; 根據用戶名授予的角色 select b.granted_role ||decode(admin_option, 'YES',' (With Admin Option)',null) what_granted, a.username from sys.dba_users a, sys.dba_role_privs b where a.username = b.grantee order by 1; 根據被授權人授予的角色 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 = 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 = 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 = b.granteeorder by 1; 查詢用戶名及相應的配置文件、默認的表空間和臨時表空間 Select username, profile, default_tablespace,temporary_tablespace, created from sys.dba_users order by username; 23.等待事件V$視圖 在Oracle 10g中V$SESSION_WAIT中的所有等待事件列現在都在V$SESSION中。因此,確保查詢等待信息的 V$SESSION,因爲它是一個更快的視圖。V$ACTIVE_SESSION_HISTORY (ASH)將許多重要統計數據合併爲一個視圖或一個報表(ASH報表)。 馬上該誰等待--查詢V$SESSION_WAIT / V$SESSION 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(*); 馬上該誰等待;SPECIFIC Waits--查詢V$SESSION_WAIT 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; 誰在等待 - 最後10 個等待數--查詢V$SESSION_WAIT_HISTORY 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; 查找P1, P2, P3代表什麼--查詢 V$EVENT_NAME 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; 類的所有會話等待數--查詢V$SESSION_WAIT_CLASS select sid, wait_class, total_waits from v$session_wait_class; 系統啓動後的所有等待數--查詢V$SYSTEM_EVENT select event, total_waits, time_waited, event_id from v$system_event where time_waited > 0 order by time_waited; 類的系統等待數--查詢V$SYSTEM_WAIT_CLASS select wait_class, total_waits from v$system_wait_class order by total_waits desc; 類的系統等待數--查詢V$ACTIVE_SESSION_HISTORY --In the query below, the highest count session is leader in non-idle wait events. select session_id,count(1) from v$active_session_history group by session_id order by 2; --In the query below, find the SQL for the leader in non-idle wait events. select c.sql_id, a.sql_text from v$sql a, (select sql_id,count(1) from v$active_session_history b where sql_id is not null group by sql_idorder by 2 desc ) c where rownum <= 5 order by rownum;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章