閱讀目錄html
回到頂部java
包含:檢查Oracle實例狀態,檢查Oracle服務進程,檢查Oracle監聽進程,共三個部分。ios
1.1. 檢查Oracle實例狀態sql
select instance_name,host_name,startup_time,status,database_status from v$instance;
其中「STATUS」表示Oracle當前的實例狀態,必須爲「OPEN」;「DATABASE_STATUS」表示Oracle當前數據庫的狀態,必須爲「ACTIVE」。數據庫
1.2. 檢查Oracle在線日誌狀態安全
select group#,status,type,member from v$logfile;
輸出結果應該有3條以上(包含3條)記錄,「STATUS」應該爲非「INVALID」,非「DELETED」。注:「STATUS」顯示爲空表示正常。session
1.3. 檢查Oracle表空間的狀態oracle
select tablespace_name,status from dba_tablespaces;
輸出結果中STATUS應該都爲ONLINE。ssh
1.4. 檢查Oracle全部數據文件狀態ide
select name,status from v$datafile;
輸出結果中「STATUS」應該都爲「ONLINE」。或者:
select file_name,status from dba_data_files;
輸出結果中「STATUS」應該都爲「AVAILABLE」。
1.5. 檢查無效對象
select owner,object_name,object_type from dba_objects where status!='VALID' and owner!='SYS' and owner!='SYSTEM';
若是有記錄返回,則說明存在無效對象。若這些對象與應用相關,那麼須要從新編譯生成這個對象,或者:
SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID';
1.6. 檢查全部回滾段狀態
select segment_name,status from dba_rollback_segs;
輸出結果中全部回滾段的「STATUS」應該爲「ONLINE」。
包含:
a.檢查Oracle初始化文件中相關的參數值
b.檢查數據庫鏈接狀況,檢查系統磁盤空間
c.檢查Oracle各個表空間使用狀況,檢查一些擴展異常的對象,
d.檢查system表空間內的內容,檢查對象的下一擴展與表空間的最大擴展值,總共七個部分。
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/CKDB/pfile/initORCL.ora來修改。
2.2. 檢查數據庫鏈接狀況
查看當前會話鏈接數,是否屬於正常範圍。
select count(*) from v$session; select sid,serial#,username,program,machine,status from v$session;
其中:SID 會話(session)的ID號;
SERIAL# 會話的序列號,和SID一塊兒用來惟一標識一個會話;
USERNAME 創建該會話的用戶名;
PROGRAM 這個會話是用什麼工具鏈接到數據庫的;
STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操做;
若是創建了過多的鏈接,會消耗數據庫的資源,同時,對一些「掛死」的鏈接可能須要手工進行清理。若是DBA要手工斷開某個會話,則執行:
(通常不建議使用這種方式去殺掉數據庫的鏈接,這樣有時候session不會斷開。容易引發死鏈接。建議經過sid查到操做系統的spid,使用ps –ef|grep spidno的方式確認spid不是ORACLE的後臺進程。使用操做系統的kill -9命令殺掉鏈接)
alter system kill session 'SID,SERIAL#';
注意:上例中SID爲1到10(USERNAME列爲空)的會話,是Oracle的後臺進程,不要對這些會話進行任何操做。
2.3. 檢查系統磁盤空間
若是文件系統的剩餘空間太小或增加較快,需對其進行確認並刪除不用的文件以釋放空間。
[oracle@AS14 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 9.7G 3.9G 5.4G 42% /
/dev/sda1 479M 16M 438M 4% /boot
/dev/sda2 49G 19G 28G 41% /data
none 1014M 0 1014M 0% /dev/shm
2.4. 檢查表空間使用狀況
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%以上(包含10%),則注意要增長數據文件來擴展表空間而不要是用數據文件的自動擴展功能。請不要對錶空間增長過多的數據文件,增長數據文件的原則是每一個數據文件大小爲2G或者4G,自動擴展的最大限制在8G。
2.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;
若是有記錄返回,則這些對象的擴展已經快達到它定義時的最大擴展值。對於這些對象要修改它的存儲結構參數。
2.6. 檢查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表空間,同時應該檢查這些對象屬主的缺省表空間值。
2.7. 檢查對象的下一擴展與表空間的最大擴展值
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;
若是有記錄返回,則代表這些對象的下一個擴展大於該對象所屬表空間的最大擴展值,需調整相應表空間的存儲參數。
包含:
a.檢查數據庫備份日誌信息;
b.檢查backup卷中文件產生的時間;
c.檢查oracle用戶的email
3.1. 檢查數據庫備份日誌信息
假設:備份的臨時目錄爲/backup/hotbakup,咱們須要檢查2009年7月22日的備份結果,則用下面的命令來檢查:
cat /backup/hotbackup/hotbackup-09-7-22.log|grep –i error
備份腳本的日誌文件爲hotbackup-月份-日期-年份.log,在備份的臨時目錄下面。若是文件中存在「ERROR:」,則代表備份沒有成功,存在問題須要檢查。
3.2. 檢查backup卷中文件產生的時間
#ls –lt /backup/hotbackup
backup卷是備份的臨時目錄,查看輸出結果中文件的日期,都應當是在當天凌晨由熱備份腳本產生的。若是時間不對則代表熱備份腳本沒執行成功。
3.3. 檢查oracle用戶的email
#tail –n 300 /var/mail/oracle
熱備份腳本是經過Oracle用戶的cron去執行的。cron執行完後操做系統就會發一條Email通知Oracle用戶任務已經完成。查看Oracle email中今天凌晨部分有無ORA-,Error,Failed等出錯信息,若是有則代表備份不正常。
在本節主要檢查Oracle數據庫性能狀況,包含:檢查數據庫的等待事件,檢查死鎖及處理,檢查cpu、I/O、內存性能,查看是否有僵死進程,檢查行連接/遷移,按期作統計分析,檢查緩衝區命中率,檢查共享池命中率,檢查排序區,檢查日誌緩衝區,總共十個部分。
4.1. 檢查數據庫的等待事件
set pages 80 set lines 120 col event for a40 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等等待事件時,須要對其進行分析,可能存在問題的語句。
4.2. Disk Read最高的SQL語句的獲取
SELECT SQL_TEXT FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS) WHERE ROWNUM <= 5;
4.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.4. 等待時間最多的5個系統等待事件的獲取
SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM <= 5;
4.5. 檢查運行好久的SQL
COLUMN USERNAME FORMAT A12 COLUMN OPNAME FORMAT A16 COLUMN PROGRESS FORMAT A8 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;
4.6. 檢查消耗CPU最高的進程
SET LINE 240 SET VERIFY OFF COLUMN SID FORMAT 999 COLUMN PID FORMAT 999 COLUMN S_# FORMAT 999 COLUMN USERNAME FORMAT A9 HEADING "ORA USER" COLUMN PROGRAM FORMAT A29 COLUMN SQL FORMAT A60 COLUMN OSNAME FORMAT A9 HEADING "OS USER" SELECT P.PID PID, S.SID SID, P.SPID SPID, S.USERNAME USERNAME, S.OSUSER OSNAME, P.SERIAL# S_#, P.TERMINAL, P.PROGRAM PROGRAM, P.BACKGROUND, S.STATUS, RTRIM(SUBSTR(A.SQL_TEXT, 1, 80)) SQLFROM V$PROCESS P, V$SESSION S, V$SQLAREA A WHERE P.ADDR = S.PADDR AND S.SQL_ADDRESS = A.ADDRESS(+) AND P.SPID LIKE '%&1%';
4.7. 檢查碎片程度高的表
SELECT segment_name table_name, COUNT(*) extents FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM dba_segments GROUP BY segment_name);
4.8. 檢查表空間的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;
4.9. 檢查文件系統的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#;
4.10.檢查死鎖及處理
查詢目前鎖對象信息:
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;
oracle級kill掉該session:
alter system kill session '&sid,&serial#';
操做系統級kill掉session:
#>kill -9 pid
記錄數據庫的cpu使用、IO、內存等使用狀況,使用vmstat,iostat,sar,top等命令進行信息收集並檢查這些信息,判斷資源使用狀況。
5.1 CPU使用狀況:
[root@sale8 ~]# top
top - 10:29:35 up 73 days, 19:54, 1 user, load average: 0.37, 0.38, 0.29
Tasks: 353 total, 2 running, 351 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.2% us, 0.1% sy, 0.0% ni,98.8% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 16404472k total, 12887428k used, 3517044k free, 60796k buffers
Swap: 8385920k total, 665576k used, 7720344k free, 10358384k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30495 oracle 15 0 8329m 866m 861m R 10 5.4 7:53.90 oracle
32501 oracle 15 0 8328m 1.7g 1.7g S 2 10.6 1:58.38 oracle
32503 oracle 15 0 8329m 1.6g 1.6g S 2 10.2 2:06.62 oracle
注意上面的藍色字體部分,此部份內容表示系統剩餘的cpu,當其平均值降低至10%如下的時視爲CPU使用率異常,需記錄下該數值,並將狀態記爲異常。
5.2 內存使用狀況:
# free -m
total used free shared buffers cached
Mem: 2026 1958 67 0 76 1556
-/+ buffers/cache: 326 1700
Swap: 5992 92 5900
如上所示,藍色部分表示系統總內存,紅色部分表示系統使用的內存,黃色部分表示系統剩餘內存,當剩餘內存低於總內存的10%時視爲異常。
5.3 系統I/O狀況:
# iostat -k 1 3
Linux 2.6.9-22.ELsmp (AS14) 07/29/2009
avg-cpu: %user %nice %sys%iowait %idle
0.16 0.00 0.05 0.36 99.43
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3.33 13.16 50.25 94483478 360665804
avg-cpu: %user %nice %sys%iowait %idle
0.00 0.00 0.00 0.00 100.00
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
如上所示,藍色字體部分表示磁盤讀寫狀況,紅色字體部分爲cpu IO等待狀況。
5.4 系統負載狀況:
#uptime
12:08:37 up 162 days, 23:33, 15 users, load average: 0.01, 0.15, 0.10
如上所示,藍體字部分表示系統負載,後面的3個數值若是有高於2.5的時候就代表系統在超負荷運轉了,並將此值記錄到巡檢表,視爲異常。
5.5.查看是否有僵死進程
select spid from v$process where addr not in (select paddr from v$session);
有些殭屍進程有阻塞其餘業務的正常運行,按期殺掉殭屍進程。
5.6.檢查行連接/遷移
select table_name, num_rows, chain_cnt From dba_tables Where owner = 'CTAIS2' And chain_cnt <> 0;
注:含有long raw列的表有行連接是正常的,找到遷移行保存到chained_rows表中,如沒有該表執行../rdbms/admin/utlchain.sql
analyze table tablename list chained rows;
可經過表chained_rows中table_name,head_rowid看出哪些行是遷移行
create table aa as select a.* from sb_zsxx a,chained_rows b where a.rowid=b.head_rowid and b.table_name ='SB_ZSXX'; delete from sb_zsxx where rowid in (select head_rowid from chained_rows where table_name = 'SB_ZSXX'); insert into sb_zsxx select * from chained_row where table_name = 'SB_ZSXX';
5.7 按期作統計分析
對於採用Oracle Cost-Based-Optimizer的系統,須要按期對數據對象的統計信息進行採集更新,使優化器能夠根據準備的信息做出正確的explain plan。在如下狀況更須要進行統計信息的更新:
a. 應用發生變化
b. 大規模數據遷移、歷史數據遷出、其餘數據的導入等
c .數據量發生變化
查看錶或索引的統計信息是否需更新,如:
Select table_name,num_rows,last_analyzed From user_tables where table_name ='DJ_NSRXX' select count(*) from DJ_NSRXX如num_rows和count(*)
若是行數相差不少,則該表須要更新統計信息,建議一週作一次統計信息收集,如:
exec sys.dbms_stats.gather_schema_stats(ownname=>'CTAIS2',cascade => TRUE,degree => 4);
5.8 檢查緩衝區命中率
SELECT a.VALUE + b.VALUE logical_reads, c.VALUE phys_reads, round(100 * (1 - c.value / (a.value + b.value)), 4) hit_ratio FROM v$sysstat a, v$sysstat b, v$sysstat c WHERE a.NAME = 'db block gets' AND b.NAME = 'consistent gets' AND c.NAME = 'physical reads';
若是命中率低於90%則需加大數據庫參數db_cache_size。
5.9 檢查共享池命中率
select sum(pinhits) / sum(pins) * 100 from v$librarycache;
如低於95%,則須要調整應用程序使用綁定變量,或者調整數據庫參數shared pool的大小。
5.10 檢查排序區
select name,value from v$sysstat where name like '%sort%';
若是disk/(memoty+row)的比例太高,則須要調整sort_area_size(workarea_size_policy=false)或pga_aggregate_target(workarea_size_policy=true)。
5.11 檢查日誌緩衝區
select name,value from v$sysstat where name in ('redo entries','redo buffer allocation retries');
若是redo buffer allocation retries/redo entries超過1%,則須要增大log_buffer。
在本節主要檢查Oracle數據庫的安全性,包含:檢查系統安全信息,按期修改密碼,總共兩個部分。
6.1. 檢查系統安全日誌信息
系統安全日誌文件的目錄在/var/log下,主要檢查登陸成功或失敗的用戶日誌信息。
檢查登陸成功的日誌:
[root@rac2 ~]# grep -i accepted /var/log/secure
Jan 8 08:44:43 rac2 sshd[29559]: Accepted password for root from ::ffff:10.10.10.6 port 1119 ssh2……
檢查登陸失敗的日誌:
[root@rac2 ~]# grep -i inval /var/log/secure &&grep -i failed /var/log/secure
Jan 9 10:30:44 rac2 sshd[3071]: Invalid user ydbuser from ::ffff:192.168.3.5
Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2
Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2
Jan 10 22:44:38 rac2 sshd[21611]: Failed password for root from ::ffff:10.10.10.6 port 1723 ssh2
在出現的日誌信息中沒有錯誤(Invalid、refused)提示,若是沒有(Invalid、refused)視爲系統正常,出現錯誤提示,應做出系統告警通知。
6.2. 檢查用戶修改密碼
在數據庫系統上每每存在不少的用戶,如:第三方數據庫監控系統,初始安裝數據庫時的演示用戶,管理員用戶等等,這些用戶的密碼每每是寫定的,被不少人知道,會被別有用心的人利用來攻擊系統甚至進行修改數據。須要修改密碼的用戶包括:
數據庫管理員用戶SYS,SYSTEM;其餘用戶。
登錄系統後,提示符下輸入cat /etc/passwd,在列出來的用戶中查看是否存在已經再也不使用的或是陌生的賬號。若存在,則記錄爲異常。
修改密碼方法:
alter user USER_NAME identified by PASSWORD;
在本節主要檢查當前crontab任務是否正常,檢查Oracle Job是否有失敗等共六個部分。
7.1 檢查當前crontab任務是否正常
[oracle@AS14 ~]$ crontab -l
7.2 Oracle Job是否有失敗
select job,what,last_date,next_date,failures,broken from dba_jobs Where schema_user='CAIKE';
若有問題建議重建job,如:
exec sys.dbms_job.remove(1); commit; exec sys.dbms_job.isubmit(1,'REFRESH_ALL_SNAPSHOT;',SYSDATE+1/1440,'SYSDATE+4/1440'); commit;
7.3. 監控數據量的增加狀況
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;
根據本週天天的檢查狀況找到空間擴展很快的數據庫對象,並採起相應的措施:
--刪除歷史數據
移動規定數據庫中至少保留6個月的歷史數據,因此之前的歷史數據能夠考慮備份而後進行清除以便釋放其所佔的資源空間。
---擴表空間
alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
注意:在數據庫結構發生變化時,如增長了表空間,增長了數據文件或重作日誌文件這些操做,都會形成Oracle數據庫控制文件的變化,DBA應及進行控制文件的備份,備份方法是:
執行SQL語句:
alter database backup controlfile to '/home/backup/control.bak';
或:
alter database backup controlfile to trace;
這樣,會在USER_DUMP_DEST(初始化參數文件中指定)目錄下生成建立控制文件的SQL命令。
7.4. 檢查失效的索引
select index_name, table_name, tablespace_name, status From dba_indexes Where owner = 'CTAIS2' And status <> 'VALID';
注:分區表上的索引status爲N/A是正常的,若有失效索引則對該索引作rebuild,如:
alter index INDEX_NAME rebuild tablespace TABLESPACE_NAME;
7.5. 檢查不起做用的約束
SELECT owner, constraint_name, table_name, constraint_type, status FROM dba_constraints WHERE status = 'DISABLE' and constraint_type = 'P';
若有失效約束則啓用,如:
alter Table TABLE_NAME Enable Constraints CONSTRAINT_NAME;
7.6. 檢查無效的trigger
SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED';
若有失效觸發器則啓用,如:
alter Trigger TRIGGER_NAME Enable;