一、每天的工作
1、檢查數據庫狀態
確認所有的INSTANCE狀態以及listener狀態正常,登陸到所有數據庫或例程,檢測ORACLE後臺進程:
$ ps –ef|grep ora
$ lsnrctl status
SQL> select status from v$instance;(單實例)
SQL> select INSTANCE_NAME,host_name,status,active_state,STARTUP_TIME from gv$instance;(RAC集羣)
DataGuard備庫檢查:
查看歸檔日誌最大的序列號:
SQL>SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG GROUP BY THREAD#;---如果是單實例對單實例dg,這裏的最大序列號應該一樣
查看備庫歸檔日誌應用情況:
SQL>set linesize 200
SQL>col name for a70
SQL>SELECT
ARCH.THREAD# "Thread",name,
ARCH.SEQUENCE# "Last Sequence Received",
APPL.SEQUENCE# "Last Sequence Applied",
(ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM
(SELECT THREAD# ,SEQUENCE#,name FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
(SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME)
FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;
查詢DataGuard當前處於哪種日誌傳輸方式:
SQL>select process,client_process,sequence#,status from v$managed_standby;
PROCESS列顯示進程信息
CLIENT_PROCESS列顯示對應的主數據庫中的進程
SEQUENCE#列顯示歸檔redo的序列號
STATUS列顯示的進程狀態
查看歸檔日誌是否連續:
SQL>select * from v$archive_gap;
2、檢查文件系統和asm存儲空間
如果文件系統或者asm的剩餘空間過小或增長較快,需對其進行確認並刪除不用的文件以釋放空間。
文件系統檢查
$df –k
$df -h
Asm檢查
Sql> select name,state,total_mb,free_mb,
round(free_mb/total_mb,3)*100||'%' pt_free
from v$asm_diskgroup;
3、檢查警告日誌文件(alert_sid.log)
Oracle在運行過程中,會在警告日誌文件(alert_SID.log)中記錄數據庫的一些運行情況:數據庫的啓動、關閉,啓動時的非缺省參數;數據庫的重做日誌切換情況,記錄每次切換的時間,及如果因爲檢查點(checkpoint)操作沒有執行完成造成不能切換,會記錄不能切換的原因;對數據庫進行的某些操作,如創建或刪除表空間、增加數據文件;
數據庫發生的錯誤,如表空間不夠、出現壞塊、數據庫內部錯誤(ORA-600)定期檢查日誌文件,根據日誌中發現的問題及時進行處理
問題 |
處理 |
啓動參數不對 |
檢查初始化參數文件 |
因爲檢查點操作或歸檔操作沒有完成造成重做日誌不能切換 |
如果經常發生這樣的情況,可以考慮增加重做日誌文件組;想辦法提高檢查點或歸檔操作的效率; |
有人未經授權刪除了表空間 |
檢查數據庫的安全問題,是否密碼太簡單;如有必要,撤消某些用戶的系統權限 |
出現壞塊 |
檢查是否是硬件問題(如磁盤本生有壞塊),如果不是,檢查是那個數據庫對象出現了壞塊,對這個對象進行重建或者用備份恢復 |
表空間不夠 |
增加數據文件到相應的表空間 |
出現ORA-600 |
根據日誌文件的內容查看相應的TRC文件,如果是Oracle的bug,要及時打上相應的補丁 |
10g 的alert_SID.log通常是在$ORACLE_BASE/admin/<SID>/bdump目錄下,
11g 的alert_SID.log通常是在 $ORACLE_BASE/diag/rdbms/<SID>/<SID>/trace(文本文件)目錄下
或
$ORACLE_BASE/diag/rdbms/<SID>/<SID>/alert(xml格式文件)目錄下
使用 Unix ‘tail’或者more命令查看該日誌信息(爲了方便查詢,每天查詢後將查詢的日誌mv到與日誌同一目錄下的bak目錄下);
tail -500 alert.log|egrep -i "Error|Fail|WARNING|Invalid|ORA-|Global Enqueue Services|dead|ORA-"
4、定期檢查listener日誌
如果這些日誌量非常大,佔用很大的資源空間,可考慮定期刪除以便釋放資源。
通過 SQL> show parameter user_dump_dest參數查看其存放位置;
Listener日誌: $ORACLE_HOME/network/log
tail -500 log|egrep -i "Error|Fail|WARNING|Invalid|ORA-|Global Enqueue Services|dead|ORA-"
5、檢查數據庫連接信息
定時對數據庫的連接情況進行檢查,看與數據庫建立的會話數目是不是正常,如果建立了過多的連接,會消耗數據庫的資源。同時,對一些“掛死”的連接,可能需要手工進行清理。
以下的SQL語句列出當前數據庫建立的會話情況:
SQL> Select count(*) from v$session; ――查看當前會話連接數(單實例)
SQL> select INST_ID,count(*) from gv$session group by INST_ID;
---查看所有實例當前會話連接數(rac集羣)
SQL> set linesize 180
SQL> col USERNAME for a20
SQL> col program for a50
SQL> select sid,serial#,username,program,machine,status from v$session;
其中,
SID 會話(session)的ID號;
SERIAL# 會話的序列號,和SID一起用來唯一標識一個會話;
USERNAME 建立該會話的用戶名;
PROGRAM 這個會話是用什麼工具連接到數據庫的;
STATUS 當前這個會話的狀態,ACTIVE表示會話正在執行某些任務,INACTIVE表示當前會話沒有執行任何操作;
如果要手工斷開某個會話,則執行:(一般不建議使用這種方式去殺掉數據庫的連接,這樣有時候session不會斷開。容易引起死連接。建議通過sid查到操作系統的spid,使用ps –ef|grep spidno的方式確認spid不是ORACLE的後臺進程。使用操作系統的kill -9命令殺掉連接)
SQL> alter system kill session 'SID,SERIAL#';
注意:
USERNAME列爲空的會話,是Oracle的後臺進程,不要對這些會話進行任何操作。
6、檢查數據庫當日備份的有效性。
對RMAN備份方式: 檢查第三方備份工具的備份日誌以確定備份是否成功
對EXPORT備份方式: 檢查exp日誌文件以確定備份是否成功
對其他備份方式: 檢查相應的日誌文件
7、檢查數據文件的狀態
SQL>set linesize 150
SQL>col file_name for a50
SQL>select file_name,status from dba_data_files;
SQL>select count(*) from dba_data_files;
SQL>select count(*) from dba_data_files where status='AVAILABLE';如果數據文件的STATUS列不是AVAILABLE,那麼就要採取相應的措施,如對該數據文件進行恢復操作,或重建該數據文件所在的表空間。
8、檢查表空間的使用情況
SQL>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";
如果表空間剩餘空間不夠,刪除已經過期的數據對象,如果無對象可刪除,給相應表空間增加數據文件。
SQL>alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
數據庫結構結構發生了改變,備份一下控制文件:
SQL>alter database backup controlfile to '/home/backup/control.bak';
9、檢查數據庫的等待事件
SQL>set pages 80
SQL>set lines 120
SQL>col event for a40
SQL>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等等待事件時,需要對其進行分析,可能存在問題的語句。
10、索表的處理
查詢目前鎖對象信息
SQL>col sid for 999999
SQL>col username for a10
SQL>col schemaname for a10
SQL>col osuser for a16
SQL>col machine for a16
SQL>col terminal for a20
SQL>col owner for a10
SQL>col object_name for a30
SQL>col object_type for a10
SQL>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;
解鎖處理:
SQL>alter system kill session '&sid,&serial#';
11、檢查數據庫性能,記錄數據庫的cpu使用、io、內存情況等等
使用vmstat,iostat,sar,top等命令進行信息收集並檢查這些信息,判斷資源使用情況。
12、查看是否有僵死進程
SQL>select spid from v$process where addr not in (select paddr from v$session);
有些殭屍進程有阻塞其他業務的正常運行,定期殺掉殭屍進程
二、每週的工作
1、監控數據量的增長情況
根據本週每天的檢查情況找到空間擴展很快的數據庫對象,並採取相應的措施
1)刪除歷史數據
規定數據庫中至少保留多長時間的歷史數據,所以以前的歷史數據可以考慮備份然後進行清除以便釋放其所佔的資源空間。
2) 擴表空間
SQL>alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
注意:
在數據庫結構發生變化時,如增加了表空間,增加了數據文件或重做日誌文件這些操作,都會造成Oracle數據庫控制文件的變化,DBA應及進行控制文件的備份,備份方法:
執行SQL語句:
SQL>alter database backup controlfile to '/home/backup/control.bak';
或:
SQL>alter database backup controlfile to trace;
這樣,會在USER_DUMP_DEST(初始化參數文件中指定)目錄下生成創建控制文件的SQL命令。
2、表空間碎片查詢和整理
1)表空間碎片
SQL>select
tablespace_name,
sqrt(max(blocks) / sum(blocks)) * (100 / sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
group by tablespace_name
order by 2;
如果fsif<30,則說明碎片化程度高,需要碎片整理
可以將表空間的缺省存儲參數pctincrease改爲非0,一般將其設爲1,如:
alter tablespace tablespace_name default storage(pctincrease 1);
這樣smon便會將自由範圍自動合併。
也可以手工合併自由範圍:
alter tablespace tablespace_name coalesce;
2)表碎片
SQL>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);
通過上面sql找出碎片程度高的表,用exp/expdp導出,然後drop表,再用imp/impdp導入。
3、索引監控(11g只需設置optimizer_capture_plan_baselines=true)
找出查詢效率低的表,如果有索引查看索引的狀態,如果無索引,建立索引。
開始索引監控:
SQL> alter index index_name monitoring usage;
查看索引有沒被使用:
SQL> select INDEX_NAME,MONITORING,USED from v$object_usage;
關閉索引監控(索引監控對性能有影響,監控完關閉)
SQL> alter index index_name nomonitoring usage;
4、檢查無效的數據庫對象,不起作用的約束,無效的觸發器
SQL>SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID';
SQL>SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints WHERE status ='DISABLE' and constraint_type='P';
SQL>SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED';
5、檢查數據庫定時作業的完成情況
如果數據庫使用了Oracle的JOB來完成一些定時作業,要對這些JOB的運行情況進行檢查:
SQL>select job,log_user,last_date,failures from dba_jobs
Where failures>0;
如果FAILURES列是一個大於0的數的話,說明JOB運行失敗,要進一步的檢查
6、每週業務高峯期收集2次awr和addm報告
Awr:
SQL> @?rdbms/admin/awrrpt.sql(單實例)
SQL> @?rdbms/admin/awrrpti.sql(rac集羣)
Addm:
SQL> @?/rdbms/admin/addmrpt.sql(單實例)
SQL> @?/rdbms/admin/addmrpti.sql(rac集羣)
三、每月的工作
1、尋找數據庫性能調整的機會
根據awr收集的統計數據和addm給出的建議,比較每天對數據庫性能的監控報告,確定是否有必要對數據庫性能進行調整
2、數據庫性能調整
如有必要,進行性能調整
3、提出下一步空間管理計劃
根據每週的監控,提出空間管理的改進方案