摘要:Oracle數據庫的日常巡檢內容有:Oracle數據庫基本狀況檢查;Oracle相關資源的使用情況檢查; Oracle數據庫性能檢查;數據庫服務器cpu、mem和I/O性能檢查;數據庫服務器安全性及其他事項檢查等五大檢查項目。詳細內容請參考下文。
1、數據庫基本狀況檢查
(1)、數據庫實例狀況檢查
查詢指令為 select instance_name,host_name,startup_time,status,database_status from v$instance;
說明:其中“STATUS”表示Oracle當前的實例狀態,必須為“OPEN”;“DATABASE_STATUS”表示Oracle當前數據庫的狀態,必須為“ACTIVE”。
(2)、數據庫表空間狀態檢查
查詢指令為 select tablespace_name,status from dba_tablespaces;
說明:輸出結果中STATUS應該都為“ONLINE”。
(3)、數據庫數據文件檢查
查詢指令為 select file_name,status from dba_data_files;
說明:輸出結果中“STATUS”應該都為“AVAILABLE”。
(4)、數據庫在線日志檢查
查詢指令為 select group#,status,type,member from v$logfile;
說明:輸出結果應該有3條或3條以上記錄,“STATUS”應該為非“INVALID”,非“DELETED”。 “STATUS”的值為空表示正常。
(5)、數據庫回滾段檢查
查詢指令為 select segment_name,status from dba_rollback_segs;
說明:輸出結果中所有回滾段的“STATUS”應該為“ONLINE”。
2、數據庫相關資源使用情況檢查
(1)、檢查Oracle初始化文件中相關參數值
查詢語句為 select resource_name,max_utilization,initial_allocation, limit_value from v$resource_limit;
說明:若字段值【LIMIT_VALU】-【MAX_UTILIZATION】<=5,則表明與RESOURCE_NAME相關的Oracle初始化參數需要調整。可以通過修改Oracle初始化參數文件$
ORACLE_BASE/admin/orcl/pfile/initORCL.ora來修改。
(2)、檢查數據庫連接情況
查詢語句為 select sid,serial#,username,program,machine,status from v$session;
說明:STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操作;如果建立了過多的連接,會消耗數據庫的資源,同時,對一些“掛死”的連接可能需要手工進行清理。
(3)、檢查表空間使用情況
查詢語句為 select f.tablespace_name,a.total,f.free,round((f.free / a.total) * 100) "% Free" from (select tablespace_name, sum(bytes / (1024 * 1024)) total 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) f WHERE a.tablespace_name =f.tablespace_name(+) order by "% Free";
說明:如果空閑率【%Free】小于10%以上,則注意要增加數據文件來擴展表空間而不要是用數據文件的自動擴展功能。
(4)、檢查system表空間內的內容
查詢語句為 select distinct (owner) from dba_tables where tablespace_name = 'SYSTEM' and owner != 'SYS' and owner != 'SYSTEM' union select distinct (owner) from dba_indexes where tablespace_name = 'SYSTEM' and owner != 'SYS' and owner != 'SYSTEM';
說明:如果記錄返回,則表明system表空間內存在一些非system和sys用戶的對象。應該進一步檢查這些對象是否與我們應用相關。如果相關請把這些對象移到非System表空間,同時應該檢查這些對象屬主的缺省表空間值。
(5)、檢查一些擴展異常的對象
查詢語句為 select Segment_Name,Segment_Type,TableSpace_Name, (Extents / Max_extents) * 100 Percent From sys.DBA_Segments Where Max_Extents != 0 and (Extents / Max_extents) * 100 >= 95 order By Percent;
說明:如果有記錄返回,則這些對象的擴展已經快達到它定義時的最大擴展值。對于這些對象要修改它的存儲結構參數。
(6)、檢查對象的下一擴展值與表空間的最大擴展值
查詢語句為 select a.table_name, a.next_extent, a.tablespace_name from all_tables a, (select tablespace_name, max(bytes) as big_chunk from dba_free_space group by tablespace_name) f where f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunk union select a.index_name, a.next_extent, a.tablespace_name from all_indexes a,(select tablespace_name, max(bytes) as big_chunk from dba_free_space group by tablespace_name) f where f.tablespace_name = a.tablespace_name and a.next_extent > f.big_chunk;
說明:如果有記錄返回,則表明這些對象的下一個擴展大于該對象所屬表空間的最大擴展值,需調整相應表空間的存儲參數。
3、檢查Oracle數據庫性能
(SQLPLUS的界面設置參數set pages 80 set lines 120 col event for a40)
(1)、檢查數據庫的等待事件
查詢語句為 select sid, event, p1, p2, p3, WAIT_TIME, SECONDS_IN_WAIT from v$session_wait where event not like 'SQL%' and event not like 'rdbms%';
說明:如果數據庫長時間持續出現大量像latch free,enqueue,buffer busy waits,db file sequential read,db file scattered read等等待事件時,需要對其進行分析,可能存在問題的語句。
(2)、等待時間最多的5個系統等待事件
查詢語句為 SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM <= 5;
(3)、查找前十條性能差的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;
(4)、Disk Read最高的SQL語句的獲取
查詢語句為 SELECT SQL_TEXT FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS) WHERE ROWNUM <= 5;
(5)、檢查死鎖及處理
查詢語句為 select sid,serial#,username,SCHEMANAME,osuser,MACHINE,terminal,PROGRAM,owner,object_name,object_type,o.object_id from dba_objects o, v$locked_object l, v$session s where o.object_id = l.object_id and s.sid = l.session_id;
4、數據庫服務器CPU、MEM、I/O性能
(1)、CPU查詢指令 top
(2)、內存查詢指令 free -m
(3)、I/O查詢指令 IOStat -k 1 3
(4)、系統負載情況查詢指令 uptime
說明:后面的3個數值如果有高于2.5的時候就表明系統在超負荷運轉了,并將此值記錄到巡檢表,視為異常。
(5)、僵尸進程查詢指令 select spid from v$process where addr not in (select paddr from v$session);
(6)、日志緩沖區查詢指令 select name,value from v$sysstat where name in ('redo entries','redo buffer allocation retries');
說明:如果【redo buffer allocation retries】/【redo entries】的值超過1%,則需要增大log_buffer。
5、數據庫服務器安全檢查
(1)、系統安全日志檢查
檢查登錄成功日志的查詢指令為 # grep -i accepted /var/log/secure
檢查登錄失敗日志的查詢指令為 # grep -i inval /var/log/secure &&grep -i failed /var/log/secure
(2)、crontab任務檢查
Oracle Job是否有失敗任務的查詢指令為 select job,what,last_date,next_date,failures,broken from dba_jobs Where schema_user='system';
(3)、檢查失效的索引
失效索引的查詢指令為 select index_name, table_name, tablespace_name, status From dba_indexes Where owner = 'system' And status <> 'VALID';
說明:分區表上的索引status為空是正常的,如有失效索引則對該索引做rebuild。其指令為alter index INDEX_NAME rebuild tablespace TABLESPACE_NAME;