天天看點

DBA一天幹的活

一.檢查活動狀态

通過查詢基本視圖,确認資料庫和執行個體處于正常運作狀态,可以對外提供資料服務。

1.1執行個體狀态

<code>SELECT instance_name,status FROM v$instance;</code>

查詢傳回執行個體名稱、狀态,正常狀态應為Open。

1.2會話資訊

<code>SELECT </code>

<code>SESSIONS_CURRENT,SESSIONS_HIGHWATER FROM v$license;</code>

輔助查詢,執行個體目前會話數和啟動最高連接配接會話數量。

<code>SELECT inst_id,username,COUNT(*)</code>

<code>FROM gv$session GROUP BYinst_id,username;</code>

查詢資料庫連接配接數以執行個體和使用者分組。

1.3參數檢查

<code>SELECT value FROM v$parameter </code>

<code>WHERE name=</code><code>'open_cursors'</code><code>;</code>

查詢給定參數的設定值,示例參數預設值為300,通常中等規模資料庫推薦設定為1000。

1.4參數修改     

<code>ALTER SYSTEM SET undo_retention=3600 COMMENT=</code><code>'default 900'</code> <code>SID=</code><code>'*'</code> <code>SCOPE=both;</code>

修改給定的初始化參數,RAC環境需要注意SID參數。

1.5隐含參數    

<code>ALTER SYSTEM SET </code><code>"_optimizer_use_feedback"</code><code>=FALSE SCOPE=spfile;</code>

為了解決特殊問題,有時需要設定以下劃線開頭的隐含參數。

示例關閉了11.2版本中引入的Cardinality Feedback - 基數回報特性。

1.6執行個體異常

當連接配接資料庫執行個體出現緩慢、挂起等現象,需要進行診斷和分析,甚至可能需要重新啟動資料庫執行個體。

1.6.1資訊采集

<code>SQL&gt;sqlplus -prelim / as sysdba</code>

<code>SQL&gt;oradebug setmypid</code>

<code>SQL&gt;oradebug unlimit</code>

<code>SQL&gt;oradebug hanganalyze 3</code>

<code>SQL&gt;oradebug dump systemstate 266</code>

<code>&lt;間隔一定時間,如20秒,執行下一次資料采樣. &gt;</code>

示範指令,通過采集系統的Hang資訊、系統狀态資訊等,可以分析系統挂起的原因,間隔采樣,可以用于對比變化,輔助分析。

1.6.2 跟蹤

<code>SQL&gt;alter session set events </code><code>'10046 trace name context forever,level 12'</code><code>;</code>

<code>SQL&gt;shutdown immedaite;          </code>

<code>SQL&gt;startup mount;</code>

<code>SQL&gt;alter database open;</code>

如果在資料庫關閉、啟動時遇到阻塞、挂起等,可以通過示範指令進行跟蹤,擷取跟蹤檔案進行分析。

1.6.3 安全停庫

<code>SQL&gt;alter </code><code>system</code> <code>checkpoint;</code>

<code>SQL&gt;alter </code><code>system</code> <code>archive </code><code>log</code> <code>current;</code>

<code>SQL&gt;shutdown immediate;</code>

如果資料庫出現異常需要重新啟動,可以通過示範指令執行檢查點、歸檔指令,然後嘗試以立即方式關閉資料庫。

1.6.4 強制停庫

<code>SQL&gt;shutdown </code><code>abort</code><code>;</code>

<code>SQL&gt;startup nomount;</code>

<code>SQL&gt;alter database mount;</code>

如果立即方式不能順利關閉資料庫,強制的關閉方式為abort。示範指令可以通過分步驟的方式執行資料庫啟動。

1.7連接配接異常

當連接配接資料庫出現異常,需要檢測包括網絡連通性,監聽器狀态等資訊。           

1.7.1連通性

<code>tnsping tns_name</code>

在安裝具有Oracle用戶端的環境,可以通過tnsping工具測試配置的服務名稱,觀察網絡是否連通以及響應時間。

1.7.2監聽器

<code>lsnrctl status LISTENER</code>

<code>lsnrctl status LISTENER_SCAN1</code>

<code>lsnrctl service</code>

在資料庫伺服器上,可以通過lsnrctl工具檢查監聽狀态和服務資訊,具體的監聽服務名稱可以在最後定義修改。

1.7.3監聽日志檢查

<code>adrci&gt;showalert</code>

在伺服器上,可以通過adrci工具,顯示各類告警檔案,檢查監聽器日志,可以診斷監聽問題。

二.檢查日志資訊

日志狀态檢查檢查資料庫各類日志資訊,确認資料庫執行個體、叢集等是否出現錯誤、告警,如存在問題,則需要進一步分析和應對。

2.1告警日志

<code>$ORACLE_BASE/diag/rdbms/&lt;db_name&gt;/$ORACLE_SID/</code>

<code>trace/alert_$ORACLE_SID.</code><code>log</code>     

<code>SQL&gt;show parameter background_dump_dest</code>

根據示例找到告警日志,檢查執行個體是否存在 ORA- 錯誤提示等。

2.2叢集日志

11G:

<code>$GRID_HOME/</code><code>log</code><code>/&lt;nodename&gt;/alert&lt;nodename&gt;.</code><code>log</code>

<code>$GRID_HOME/</code><code>log</code><code>/&lt;nodename&gt;/(crsd、cssd、evmd、ohasd)/</code>

12C:

<code>$GRID_BASE/diag/crs/dg2/crs/trace/alter||nodename.</code><code>log</code>

在相應路徑找到RAC叢集日志,檢查是否存在錯誤提示資訊等。

2.3ASM日志

<code>$GRID_HOME/diag/asm/+asm/&lt;ASM_instance_name&gt;/trace/alert_&lt;instance_name&gt;.</code><code>log</code>

在相應路徑找到ASM日志,檢查是否存在錯誤提示資訊等。

2.4Trace檔案

<code>SQL&gt;SELECT value FROM v$diag_info WHERE name=</code><code>'Default Trace File'</code><code>;</code>

<code>SQL&gt;show parameter user_dump_dest</code>

擷取會話産生或全局轉儲位置,在診斷時需檢查最近日期檔案内容。

2.5叢集狀态

<code>$crsctl status resource -t</code>

確定資源狀态顯示線上。

2.6 errorstack分析

當遇到 ORA- 錯誤,而資料庫的輸出資訊不足時,可以采用errorstack進行跟蹤,采集更詳細的轉儲資訊。

<code>SQL&gt; alter </code><code>system</code> <code>set events='600 trace name</code>

<code>errorstack forever, level 10';</code>

<code>SQL&gt;alter </code><code>system</code> <code>set events='600 trace name</code>

<code>errorstack off';</code>

示例顯示了對ORA-600錯誤設定跟蹤,并關閉。

三.重做日志維護

Oracle REDO日志是資料庫的核心元件,檢查其狀态,維護其成員,監控其歸檔,稽核其性能,是DBA的重要工作。

3.1REDO組

<code>SELECT group#,sequence#,archived,status FROM v$</code><code>log</code><code>;</code>

查詢日志組号、序号,是否歸檔完成和狀态資訊,如多組日志顯示ACTIVE狀态,則可能說明資料庫存在IO方面的性能問題。

3.2REDO成員

SELECT group#,member FROM v$logfile;

檢視日志組和成員資訊。

3.3增加日志組或成員

<code>SQL&gt;ALTER DATABASE ADD LOGFILE GROUP 10</code>

<code>(</code><code>'/oracle/dbs/log1c.rdo'</code><code>,</code><code>'/oracle/dbs/log2c.rdo'</code><code>) SIZE 500M;</code>

<code>SQL&gt;ALTER DATABASE ADD LOGFILE MEMBER</code>

<code>'/oracle/dbs/log3c.rdo'</code><code>TO GROUP 10;</code>

在日志切換頻繁時,可能需要增加日志組或者加大日志大小。

3.4切換日志

<code>SQL&gt;ALTER SYSTEM SWITCH LOGFILE;</code>

切換日志組,開始寫入下一個日志組。

3.5執行歸檔

<code>SQL&gt;ALTER SYSTEM ARCHIVE LOG CURRENT;</code>

對目前日志組執行歸檔,切換到下一個日志組,

在RAC會對所有執行個體執行歸檔,Thread參數指定歸檔執行個體。

3.6删除日志組或成員

<code>SQL&gt;ALTER DATABASE DROP LOGFILE GROUP 10;</code>

<code>SQL&gt;ALTER DATABASE DROP LOGFILE MEMBER </code><code>'/oracle/dbs/redo03.log'</code><code>;</code>

删除指定日志組或日志成員,注意隻能對INACTIVE狀态的日志執行删除操作。

3.7歸檔檢查

<code>SQL&gt;archive </code><code>log</code> <code>list;</code>

檢查資料庫是否處于歸檔模式。

3.8歸檔狀态變更

<code>SQL&gt;alter database archivelog | noarchivelog;</code>

示例步驟在MOUNT狀态改變歸檔模式,注意啟動歸檔模式之後

務必制訂備份歸檔的日常政策,防止磁盤空間被耗盡。

3.9調整歸檔路徑

<code>SQL&gt;alter </code><code>system</code> <code>set log_archive_dest_2=</code><code>'location=&amp;path'</code> <code>sid=</code><code>'&amp;sid'</code><code>;</code>

如果資料庫因歸檔耗盡空間,可以指定另外的歸檔路徑,以盡快歸檔日志,恢複資料庫運作。

四.檢查空間資訊

確定資料存儲空間可用,定期檢查表空間餘量,進行表空間和檔案維護。

4.1 空間使用查詢

<code>SQL&gt; SELECT * FROM sys.sm$ts_used;</code>

檢視資料庫表空間的使用資訊。

<code>SQL&gt; SELECT * FROM sys.sm$ts_free;</code>

檢視資料庫表空間的剩餘空間。

4.2 檔案資訊

<code>SELECT tablespace_name,file_name FROM dba_data_files;</code>

檢視資料庫表空間的資料檔案資訊。

4.3 檔案維護

<code>alter database datafile </code><code>'&amp;path'</code> <code>resize 900M;</code>

<code>alter tablespace &amp;tbs_name add datafile </code><code>'&amp;path'</code> <code>size 900M;</code>

對資料庫的表空間容量進行擴容。

五.鎖/闩資訊檢查

Lock/Latch是資料庫控制并發的核心手段,檢查相關資訊可以監控資料庫的事務和運作狀況。

5.1鎖資訊

<code>SQL&gt;SELECT sid, type, lmode, </code><code>ctime</code><code>, block FROMv$lock WHERE type not in (</code><code>'MR'</code><code>,</code><code>'AE'</code><code>);</code>

檢視鎖會話ID,類型,持有時間等,

注意如果block &gt;1,可能意味着阻塞了其他會話。

5.2鎖故障排查

在資料庫出現鎖競争和阻塞時,需要排查和處理鎖定,必要時通過Kill阻塞程序消除鎖定。

5.2.1查詢阻塞會話

<code>SQL&gt;SELECT sid,sql_id,status,blocking_session FROMv$session WHERE sid in(SELECT session_id FROM v$locked_object);</code>

查詢目前鎖事物中阻塞會話與被阻塞會話的sid,sql_id和狀态資訊

5.2.2阻塞SQL文本

<code>SQL&gt; SELECT sql_id,sql_text FROMv$sqltext WHERE sql_id=</code><code>'&amp;sql_id'</code> <code>ORDER BY piece;</code>

通過sql_id查詢得到SQL文本,例如通過sql_id查詢出阻塞的SQL語句。

5.2.3鎖阻塞對象資訊

<code>SQL&gt;SELECT owner,object_name,object_type FROM dba_objects</code>

<code>WHEREobject_id in (SELECT object_id FROM v$locked_object);</code>

通過sid查詢阻塞對象的詳細資訊如對象名稱,所屬使用者等

5.2.4殺阻塞會話

<code>SQL&gt;altersystem kill session </code><code>'sid,serial#'</code><code>;</code>

在Oracle執行個體内殺死阻塞的會話程序,其中sid,serial# 為中止會話對應資訊,來自v$session。

5.2.5殺系統程序

<code>SQL&gt;SELECTpro.spid,pro.program</code>

<code>FROMv$session ses,v$process pro</code>

<code>WHEREses.sid=&amp;sid and ses.paddr=pro.addr;</code>

<code>#kill -9 spid</code>

有時對于活動程序,在系統層面中止更為快速安全,示例找到系統程序号,然後kill中止。

注意:無論何時,需要認真分析,并且避免誤殺重要背景程序。

5.3闩檢查

<code>SELECTname,</code><code>gets</code><code>,misses,immediate_gets,spin_gets</code>

<code>FROMv$latch ORDER BY 2;</code>

檢查資料庫闩的使用情況,misses、SPIN_GETS統計高的,需要關注。

5.3.1 闩使用檢查

<code>SQL&gt;SELECT addr,</code><code>gets</code> <code>FROM v$latch_children</code>

<code>WHEREname=</code><code>'cache buffers chains'</code><code>;</code>

<code>SQL&gt;SELECT hladdr,file#,dbablk FROM x$bh</code>

<code>WHEREhladdr in (SELECT addr FROM v$latch_children WHERE addr=</code><code>'&amp;addr'</code><code>);</code>

僅供學習:通過獲得Latch的位址,找到該Latch守護的X$BH中相關的Buffer。

六.等待和統計資料

Wait和Statistics資料分别代表了資料庫的等待和運作資料,觀察這些資料以了解資料庫的等待瓶頸和健康程度。

6.1等待事件查詢

<code>SELECT sid,event,wait_time_micro</code>

<code>FROM v$session_wait ORDER BY 3;</code>

通過等待事件和等待時間,了解資料庫目前連接配接會話的等待情況。

注意,如果會話衆多,需要限定查詢輸出行數。

6.2TOP10等待事件

<code>SQL&gt; SELECT * FROM (</code>

<code>SELECTEVENT,TOTAL_WAITS,AVERAGE_WAIT,TIME_WAITED</code>

<code>FROM v$system_event WHEREwait_class&lt;&gt;</code><code>'Idle'</code>

<code>ORDER BY time_waited desc)  WHERE rownum&lt;=10;</code>

檢視目前資料中TOP10等待事件資訊,需要分析和關注非空閑的顯著等待。

6.3會話統計資料

<code>SQL&gt;SELECT s.sid,s.statistic#,n.name,s.value</code>

<code>FROM v$sesstat s,v$statname n</code>

<code>WHERE s.statistic#=n.statistic# andn.name=</code><code>'redo size'</code> <code>and sid=</code><code>'&amp;sid'</code><code>;</code>

查詢資料庫會話的統計資訊資料,示例查詢了Redo的大小,SID需要提供。

本文轉自 張沖andy 部落格園部落格,原文連結:http://www.cnblogs.com/andy6/p/5840540.html   ,如需轉載請自行聯系原作者