Oracle DBA日常工作任務細化指導規範

此手冊用於指導數據庫駐場工程師日常工作,駐場工程師可以按照每天、每週、每月工作內容展開工作,此手冊僅適用於通用數據庫駐場維護,各工程師可根據自身項目特點增加、減少內容。

Oracle DBA日常工作任務細化指導規範


每天監控內容

每天對ORACLE數據庫進程,運行狀態,日誌文件,備份情況,等待事件,文件系統空間與數據庫的空間使用情況,系統資源的使用情況進行檢查,發現並解決問題。

內存使用是否超過90%

一般利用操作系統命令來查看內存使用情況,各操作系統使用命令也不同:

以Oracle用戶登錄操作系統,執行以下命令。

$ vmstat 2 20

AIX操作系統利用命令:

$ topas

solaris操作系統利用命令:

$ top

HP-UX操作系統利用命令:

$ glance

SWAP使用是否超過50%

一般利用操作系統命令來查看內存使用情況,各操作系統使用命令也不同:

AIX操作系統利用命令:

$ topas

solaris操作系統利用命令:

$ top

HP-UX操作系統利用命令:

$ glance

硬盤空間使用是否超過85%

如果數據庫所屬的安裝文件系統,和歸檔日誌的剩餘空間過小或增長較快,需對其進行確認。

數據庫安裝文件系統檢查$ORACLE_BASE路徑

$df -k

歸檔日誌路徑是否足夠

先確認歸檔日誌路徑,如果歸檔日誌放在非ASM中,則利用操作系統命令查看空間使用比率,使用率應該小於85%。

確認歸檔日誌路徑:

SQL>show parameters log_archive_dest

確認歸檔日誌路徑使用率:

$df -k


檢查數據庫進程狀態

確認所有的INSTANCE狀態以及listener狀態正常,登陸到所有數據庫或例程,檢測ORACLE後臺進程:

(1) 檢查Oracle進程

$ ps –ef|grep ora_

在檢查Oracle的進程命令輸出後,輸出顯示至少應包括以下一些進程:

Oracle寫數據文件的進程,輸出顯示為:“ora_dbwn_”

Oracle寫日誌文件的進程,輸出顯示為:“ora_lgwr_”

Oracle監聽實例狀態的進程,輸出顯示為:“ora_smon_”

Oracle監聽客戶端連接進程狀態的進程,輸出顯示為:“ora_pmon_”

Oracle進行歸檔的進程,輸出顯示為:“ora_arcn_”

Oracle進行檢查點的進程,輸出顯示為:“ora_ckpt_”

Oracle進行恢復的進程,輸出顯示為:“ora_reco_”

Oracle Rac 全局信息交互進程,輸出顯示為:“ora_lmsn_”

Oracle Rac 鎖管理器– 例程鎖,輸出顯示為:“ora_lckn_”

Oracle Rac監控全局鎖定及其資源,輸出顯示為:“ora_lmon_”

Oracle Rac管理對全局鎖定以及全局資源的訪問– 遠程鎖,輸出顯示為:“ora_lmdn_”

Oracle Rac 有關實例進程失敗的診斷信息,輸出顯示為:“ora_diag_”

數據文件狀態是否異常

select file_name,status from dba_data_files;

如果數據文件的STATUS列不是AVAILABLE,那麼就要採取相應的措施,如對該數據文件進行恢復操作,或重建該數據文件所在的表空間。

是否為OPEN模式

select instance_name,version,status,database_status

from gv$instance

order by inst_id;

其中“STATUS”表示Oracle當前的實例狀態,必須為“OPEN”;

“DATABASE_STATUS”表示Oracle當前數據庫的狀態,必須為“ACTIVE”。

監聽狀態是否正常

$ ps -ef|grep tnslsnr|grep -v grep

在檢查命令輸出後,有輸出顯示結果,表示監聽正常,否則顯示異常:

結果:tnslsnr LISTENER -inherit

告警日誌是否存在新的告警

Oracle在運行過程中,會在警告日誌文件(alert_SID.log)中記錄數據庫的一些運行情況:數據庫的啟動、關閉,啟動時的非缺省參數;數據庫的重做日誌切換情況,記錄每次切換的時間,及如果因為檢查點(checkpoint)操作沒有執行完成造成不能切換,會記錄不能切換的原因;對數據庫進行的某些操作,如創建或刪除表空間、增加數據文件;

數據庫發生的錯誤,如表空間不夠、出現壞塊、數據庫內部錯誤(ORA-600)定期檢查日誌文件,根據日誌中發現的問題及時進行處理

問題

處理

啟動參數不對

檢查初始化參數文件

因為檢查點操作或歸檔操作沒有完成造成重做日誌不能切換

如果經常發生這樣的情況,可以考慮增加重做日誌文件組;想辦法提高檢查點或歸檔操作的效率;

有人未經授權刪除了表空間

檢查數據庫的安全問題,是否密碼太簡單;如有必要,撤消某些用戶的系統權限

出現壞塊

檢查是否是硬件問題(如磁盤本生有壞塊),如果不是,檢查是那個數據庫對象出現了壞塊,對這個對象進行重建

表空間不夠

增加數據文件到相應的表空間

出現ORA-600

根據日誌文件的內容查看相應的TRC文件,如果是Oracle的bug,要及時打上相應的補丁

alert_SID.log通常是在$ORACLE_BASE/admin//bdump目錄下。

使用 Unix ‘tail’或者more命令查看該日誌信息(為了方便查詢,每天查詢後將查詢的日誌mv到與日誌同一目錄下的bak目錄下);


檢查警告日誌、TRC文件及listener日誌

如果這些日誌量非常大,佔用很大的資源空間,可考慮定期刪除以便釋放資源。

一般情況下這些文件存在的相關目錄:

警告日誌: $ORACLE_BASE/admin//bdump

或者

通過 SQL> show parameter background_dump_dest參數查看其存放位置;

Trc文件: $ORACLE_BASE/admin//udump

或者

通過 SQL> show parameter user_dump_dest參數查看其存放位置;

Listener日誌: $ORACLE_HOME/network/log

最近一次備份是否成功

對RMAN備份方式:檢查備份日誌以確定備份是否成功

$export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'

$rman target target rmanbak/kabnamr@ecidb1 catalog rman_ecif6/rman_ecif6@catadb

rman>list backup of database completed between 'sysdate-10' and 'sysdate';

rman>list backup of archivelog from time 'sysdate-3' until time 'sysdate';

rman>list backup of controlfile completed between 'sysdate-10' and 'sysdate';

rman>exit

輸出結果中應該包含所有數據文件、歸檔日誌以及控制文件的備份記錄。

是否存在1周內失敗的JOB

select job,log_user,last_date,failures

from dba_jobs;

如果FAILURES列是一個大於0的數的話,說明JOB運行失敗,要進一步的檢查。

是否存在新增的無效對象

select owner,object_name,object_type

from dba_objects where status!='VALID'

and owner!='SYS' and owner!='SYSTEM';

比對前一天監控結果,查看是否有新增的無效對象。

檢查表空間的使用情況

SET PAGESIZE 999

SET LINESIZE 110

TTITLE LEFT "Tablespace Information" SKIP 1 -

LEFT "======================================================================================"

SET HEAD ON

SET FEEDBACK ON

BREAK ON REPORT

COMPUTE SUM LABEL 'Total Spaces' OF TOTAL ON REPORT

COMPUTE SUM LABEL 'Total Spaces' OF FREE ON REPORT

col tablespace format a25

col ext_mgt format a8

col seg_mgt format a8

col status format a7

set feedback off

select b.tablespace_name tablespace,

a.extent_management ext_mgt,

a.segment_space_management seg_mgt,

a.status,

a.logging,

b.total,

b.free,

b.used_pct

from

dba_tablespaces a,

(select

d.tablespace_name tablespace_name,

round((d.sumbytes/1024/1024/1024),2) total,

round(decode(f.sumbytes,null,0,f.sumbytes)/1024/1024/1024,2) free,

round((d.sumbytes-decode(f.sumbytes,null,0,f.sumbytes))*100/d.sumbytes,2) used_pct

from

(select

tablespace_name,

sum(bytes) sumbytes

from dba_free_space

group by tablespace_name) f,

(select tablespace_name,

sum(bytes) sumbytes

from dba_data_files

group by tablespace_name) d

where f.tablespace_name(+) = d.tablespace_name

order by d.tablespace_name) b

where a.tablespace_name=b.tablespace_name

檢查是否有offline狀態的表空間,還有各表空間使用率是否超過90%。

數據文件是否自動擴展,且數據文件已接近最大值

set linesize 120

column ID format 999

column MBytes format 9999999

column MaxMBytes format 99999999

column BLOCKS format 99999999

column MAXBLOCKS format 99999999

column INC format 99999

column Now_MB format 9999999

column USER_BLOCKS format 99999999

column RELATIVE format 999

column FNO format 999

column STATUS format a9

column ONLINE_S format a9

column AUTO format a4

select FILE_ID AS ID,RELATIVE_FNO "FNO",ROUND (BYTES/1024/1024) AS MBytes,

ROUND (MAXBYTES/1024/1024) AS MaxMBytes,BLOCKS,MAXBLOCKS,AUTOEXTENSIBLE "AUTO",

INCREMENT_BY "INC",ROUND (USER_BYTES/1024/1024) "Now_MB",

USER_BLOCKS,STATUS,ONLINE_STATUS "ONLINE_S"

from dba_data_files;

在線日誌是否存在小於50M的及狀態不正常

select a.group#,a.status,a.bytes,b.member,a.ARCHIVED from v$log a,v$logfile b where a.group#=b.group#;

輸出結果“STATUS”應該為非“INVALID”,非“DELETED”,BYTES應該大於50M。

檢查鎖阻塞

SELECT decode(request,0,'阻塞者:','等待者:')||sid sid,id1,id2,lmode,request,type

FROM v$lock

WHERE (id1,id2,type) IN

(SELECT id1,id2,type

FROM v\$lock

WHERE request>0)

ORDER BY id1,request;

解鎖處理:

alter system kill session '&sid,&serial#';

查看是否有僵死進程

select spid from v$process where addr not in (select paddr from v$session);


有些殭屍進程有阻塞其他業務的正常運行,定期殺掉殭屍進程

檢查失效的索引

非分區索引:

SELECT OWNER,INDEX_NAME,INDEX_TYPE,TABLE_NAME,STATUS FROM DBA_INDEXES

WHERE STATUS = 'UNUSABLE';


分區索引:

SELECT INDEX_NAME,PARTITION_NAME,TABLESPACE_NAME,STATUS FROM DBA_IND_PARTITIONS

WHERE STATUS = 'UNUSABLE';

檢查不起作用的約束

SELECT owner, constraint_name, table_name, constraint_type, status

FROM dba_constraints

WHERE status ='DISABLE' and constraint_type='P';

檢查數據庫性能,buffer命中率等

(1) 緩衝區命中率

顯示了對於數據總讀取量而言,非磁盤讀取(緩衝區命中)的百分比。當然,十分高的命中率並不代表數據庫性能一定優良,也有可能是糟糕的SQL引起了大量的緩衝區讀操作,只有在已經調整過首要的查詢之後,這個命中率才能更好地反映數據庫性能。

檢查方法:

select (1 - (sum(decode(name, 'physical reads', value, 0)) /
(sum(decode(name, 'db block gets', value, 0)) +
sum(decode(name, 'consistent gets', value, 0))))) * 100
"Hit Ratio"


from v$sysstat;

此命中率應大於90%。

(2) 數據字典命中率

顯示了對數據字典和其它對象的內存讀操作的百分比

檢查方法:

select (1 - (sum(getmisses) / sum(gets))) * 100 "Hit Ratio"
from v$rowcache;

此命中率應大於95%。

(3) 庫緩存命中率

顯示了對SQL和PL/SQL對象的內存讀操作的百分比。同樣注意,很高的命中率並不總是反映數據庫性能優秀。

檢查方法:

select sum(pins) / (sum(pins) + sum(reloads)) * 100 "Hit Ratio"
from v$librarycache;

此命中率應大於95%。

(4) 內存中的排序

當初始化參數中定義的SORT_AREA_SIZE大小無法滿足排序要求的空間,就會使用臨時表空間中的臨時段進行排序,磁盤排序比內存排序要慢100-10000倍,所以儘量減少磁盤排序是性能調整工作的一個重要部分。

可能引起排序的操作有create index, distinct, order by, group by等。

檢查方法:

select name, value from v$sysstat where name like '%sorts%';

返回結果中的sorts (memory)表示內存排序,而sorts (disk)則表示磁盤排序,如果存在大量的磁盤排序,則表明檢查目前系統中消耗大量磁盤的SQL是否已經經過調整。

(5) 磁盤中的排序

檢查使用磁盤排序的會話信息,可以定位執行了大量磁盤排序的會話。

檢查方法:

select b.name, a.sid, a.value
from v$sesstat a, v$statname b
where a.STATISTIC# = b.STATISTIC#
and b.name = 'sorts (disk)'
and a.value>0 and rownum<10
order by a.value desc;

每週的工作

服務器硬盤空間大於85%列表

$df -k

利用df命令檢查操作系統硬盤空間使用情況。

備份情況總結

總結本週備份成功及失敗的情況。

安全檢查總結

SELECT username ,account_status FROM dba_users

檢查有無新增用戶鎖定情況。

JOB故障總結

SELECT job_id,username,what,next_date,interval,last_date,failures,broken FROM dba_jobs ORDER BY job;

記錄broken的job。

新增無效對象總結

SELECT owner, object_name, object_type FROM dba_objects WHERE status=’INVALID’

與上週比對,看有無新增的無效對象。

表空間預警情況總結

set linesize 120

column ID format 999

column MBytes format 9999999

column MaxMBytes format 99999999

column BLOCKS format 99999999

column MAXBLOCKS format 99999999

column INC format 99999

column Now_MB format 9999999

column USER_BLOCKS format 99999999

column RELATIVE format 999

column FNO format 999

column STATUS format a9

column ONLINE_S format a9

column AUTO format a4

select FILE_ID AS ID,RELATIVE_FNO "FNO",ROUND (BYTES/1024/1024) AS MBytes,

ROUND (MAXBYTES/1024/1024) AS MaxMBytes,BLOCKS,MAXBLOCKS,AUTOEXTENSIBLE "AUTO",

INCREMENT_BY "INC",ROUND (USER_BYTES/1024/1024) "Now_MB",

USER_BLOCKS,STATUS,ONLINE_STATUS "ONLINE_S"

from dba_data_files;

數據文件不能自動擴展,或已接近最大值。

告警日誌中其他錯誤總結

按照日常工作檢查alert告警日誌的方法,檢查本週是否有異常的錯誤。

每月的工作

文件和目錄權限

ls –l $ORACLE_BASE/*

ls -l $ORACLE_HOME/*

檢查Oracle相關目錄的權限是否有變更。

DB初始化參數

Show parameters;

檢查初始化參數是否與前月有差異,是否未經授權進行更改。

用戶權限

Sqlplus / as sysdba

Select * from dba_sys_privs;

Select * from dba_role_privs;

Select * from dba_tab_privs;

檢查本月用戶有無未經授權的權限。

備份集有效性檢測

通過異機恢復或其他手段檢測備份集的有效性。

檢查表空間碎片

根據本月的檢查分析數據庫碎片情況,找到相應的解決方法。


分享到:


相關文章: