gdufo

           

          Diagnostic and Tuning Tools

           

          1、alert log file:DBA必須定期查看alert log文件,主要關注的信息主要有:內部的errors(ORA-600)和block corruption errors(ORA-1578或ORA-1498);DB的操作信息,如create database、startup、shutdown、archive log、recover等;對非默認參數的設置。它所記錄的checkpoint start和end時間、未完成的checkpoint、歸檔時間crash的恢復時間是對調優很重要的。
          注:alert_sid.log文件的路徑由參數background_dump_dest決定;只有在參數log_checkpoints_to_alert被設置為true時,才會將checkpoint動作記錄其中。

          2、后臺進程的trace files:Oracle會將后臺進程檢測出的errors信息寫入trace files,主要用于診斷和查找故障原因,不包含tuning信息。

          3、user trace files:它可以通過user或DBA的server processes請求產生,分為instance-level-tracing(通過set sql_trace=true/false設置)和session-level-tracing(通過 dbms_system.set_sql_trace_in_session設置指定session的tracing,或用alter session set sql_trace=true設置當前session的tracing)。user trace files包含了對tracing session的sql的信息。此外,還可用于alter database backup controlfile to trace和alter system set events(這個看到后面再說,現在不同了解)

          4、views、utilities和tools:
          ①v$xxx視圖顯示了當前system的動態統計信息特別是v$sysstat。但是這些信息時往往是自實例啟動以來的一個累計數據。所以有時會比較unhelpful。DBA_xxx視圖記錄了數據的存儲統計信息。
          ②utlbstat和utlestat工具腳本:主要收集某段時間內的性能指標。
          ③statspack:其本質與utlbstat和utlestat是一致的,收集性能指標,優點在于它可以把統計信息保存在DB中從而進行不同階段的比較。
          ④等待事件wait events:在troubleshooting時需要關注那些進程在等待,并在等待什么資源。
          ⑤此外還有其他的GUI工具用于DB的診斷。

          5、dictionary和特殊的views:
          當想要獲得數據存儲的細節信息時,需要先使用analyze語句對數據進行分析統計,再查看相關的DBA_xxx和特定的views。但這些統計信息是靜 態的,只有再次運行analyze才會發生改變,而且對于較大data,用時較大。analyze獲得的數據主要在下面的視圖中:
          DBA_TABLES/DBA_TAB_COLUMNS/DBA_CLUSTERS/DBA_INDEXES/INDEX_STATS/DBA_TAB_HISTOGRAMS/INDEX_HISTOGRAM
          這個將會在后面詳細講述。

          6、動態troubleshooting和性能視圖:
          ①v$ views:是建立在想x$ tables的基礎上,存儲在內存結構中,保留instance的信息,所以只要在instance處于nomount的情況即可查詢了。它們被羅列在v$fixed_table中,只有sys user可用。
          ②x$ tables:是動態的,數據隨時變化,并且在shutdown時被清除,在startup時重新組裝。當設置timed_statistics為true時,它們將保存時間信息。

          ③ systemwide statistics的收集
          所有systemwide statistics的指標類型存放在v$statname中。所有指標的統計值存儲在v$sysstat中。例如:select name, class, value from v$sysstat;
          一般systemwide statistics的類型為:
          • Class 1 refers to general instance activity.
          • Class 2 refers to redo log buffer activity.
          • Class 4 refers to locking.
          • Class 8 refers to database buffer cache activity.
          • Class 16 refers to OS activity.
          • Class 32 refers to parallelization.
          • Class 64 refers to tables access.
          • Class 128 refers to debugging purposes.


          ④SGA全局統計,可以通過查看v$SGASTAT獲得。
          ⑤等待事件的統計:所有可能引起等待的事件類型都存放在v$event_name中。
          I) 所有的sessions的累計統計存放在v$system_event,顯示了自instance startup后所有等待事件的統計數據。
          II) 在troubleshooting時,往往需要知道某些進程在等待什么資源,對此,需要查找與session相關的視圖。session的數據是從連接建立開始計算的。視圖v$mystat顯示了當前連接創建的session的統計信息。 eg. select sid, username, server from v$session where type=’USER’;
          v$sesstat中顯示了所有session的每個v$sysname的統計信息。如上圖。
          eg. 下面查詢pga使用大約30000 bytes的session 
          select username,name,value
            from v$statname a, v$session b, v$sesstat c
            where a.statistic# = c.statistic#
            and b.sid = c.sid
            and b.type = ‘USER’
            and a.name = ’session pga memory’
            and c.value > 30000;
          III) session等待事件的統計:v$session_event顯示了自instance startup后,每個session的所有不同等待統計。v$session_wait顯示了active的session正在等待的事件或資源。

          7、statspack 這個我在其他文章中介紹了,嘻嘻這里只是提一下。sg中說,可以設置dbms_job,從而每周監控DB一定時間段的性能狀態,進行對比從而定期進行tuning。

          8、Oracle的等待事件:前面已經敘述了很多了,在這里要指出的是,v$session_wait中的p1text字段和 v$event_name中的parameter1字段是相對應。p2text和p3text也是一樣的。此外,動態的初始化參數 timed_statistics設置為true時,將可以取wait_time字段的value。

          此外,Oracle還提供了performance manager和Oracle enterprise兩個可選包,用于性能的檢測和管理。另外,DBA還應該根據自己的需要,創建自己的腳本用于統計,例如查看不同數據文件的使用狀況的腳本。

          posted @ 2010-01-12 12:26 gdufo| 編輯 收藏

          學習v$librarycache

          轉自:http://blog.chinaunix.net/u2/66903/showart_2004210.html

          通過查看v$librarycache視圖,可以監控library cache的活動情況,進一步衡量share pool設置是否合理。其中RELOADS列,表示對象被重新加載的次數,在一個設置合理的系統里,這個數值應該接近于0,另外,INVALIDATIONS列表示對象失效的次數,對象失效后,這意味著sql必須要被重新解析。

              下述sql查詢librarycache的性能狀況

          log_checkpoints_to_alert
          SELECT NAMESPACE, PINS, PINHITS, RELOADS, INVALIDATIONS
          FROM V$LIBRARYCACHE
          ORDER BY NAMESPACE;

          輸出如下:

          NAMESPACE             PINS    PINHITS    RELOADS INVALIDATIONS
          --------------- ---------- ---------- ---------- -------------
          BODY                  8870       8819          0             0
          CLUSTER                393        380          0             0
          INDEX                   29          0          0             0
          OBJECT                   0          0          0             0
          PIPE                 55265      55263          0             0
          SQL AREA          21536413   21520516      11204             2
          TABLE/PROCEDURE   10775684   10774401          0             0
          TRIGGER               18521844   0             0             0

          通過上述查詢,可以算出library cache的命中率:
          Library Cache Hit Ratio = sum(pinhits) / sum(pins)SUM(PINHITS)/SUM(PINS)
          ----------------------
          .999466248
          另外,對于上述的查詢,解釋如下:
          1.對于SQL AREA來說,共執行了21536413次。
          2.其中11,204次執行導致了library cache miss。這就需要對這些sql進行重新解析,因為它們已經被age out。
          3.sql有2次失效,這同時導致了library cache miss。
          4.命中率為99.94%,這意味著只有0.06%的sql需要重復解析。、
          另外一個問題,在什么情況下需要調整share pool的大小?
          根據performance tuning上的解釋,綜合我自己的看法,結論如下:
          (1)當V$LIBRARYCACHE.RELOADS的值較大,且應用程序已經很好的使用了綁定變量時,可以考慮調大share pool的值。
          (2)當V$LIBRARYCACHE.RELOADS的值很小,且share pool里的free值較大,可以考慮減少share pool的值。通過以下查詢,獲取share pool的free情況:
          SELECT * FROM V$SGASTAT 
          WHERE NAME = 'free memory'
          AND POOL = 'shared pool';

          POOL NAME BYTES
          ----------- -------------------------- ----------
          shared pool free memory 4928280



          另參考:

          http://www.itpub.net/thread-269800-1-1.html

          posted @ 2010-01-01 09:40 gdufo| 編輯 收藏

          查詢跟蹤文件位置和文件名腳本

          --查詢跟蹤文件位置和文件名腳本
          SELECT    a.VALUE || b.symbol || c.instance_name || '_ora_' || d.spid || '.trc' trace_file
            FROM (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') a,
                 (SELECT SUBSTR (VALUE, -6, 1) symbol FROM v$parameter
                   WHERE NAME = 'user_dump_dest') b,
                 (SELECT instance_name FROM v$instance) c,
                 (SELECT spid FROM v$session s, v$process p, v$mystat m
                   WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d
          /

          另一種方式:
          其實也可以使用控制文件tracefile_identifier 參數來確定跟蹤文件的名稱,例如:
          參數tracefile_identifie可以用來控制生成在user_dump_dest 目錄下的trace文件名稱
          SQL> alter session set sql_trace=true ;
          Session altered.
          SQL> alter session set tracefile_identifier ='DEBUG';
          Session altered.
          在user_dump_dest 目錄下的trace文件名稱定義為:
          INSTANCE_PID_ora_TRACEID.trc , 其中INSTANCE為ORACLE的實例名,PID為操作系統的進程ID(V$PROCESS.OSPID),TRACEID就是設置的tracefile_identifie值。

          --讀取當前session設置的參數(10g以前)www.6zhang.com
          set feedback off
          set serveroutput on
          declare
          event_level number;
          begin
              for event_number in 10000..10999 loop
                sys.dbms_system.read_ev(event_number,event_level);
                if (event_level > 0) then
                sys.dbms_output.put_line('Event '||to_char(event_number)||
                                         'is set at level '||to_char(event_level));
          end if ;
          end loop;
          end;
          /

           

          posted @ 2009-12-30 20:12 gdufo| 編輯 收藏

          Oracle-常用監控SQL

          轉: http://hi.baidu.com/windy8848/blog/item/3844fef25e7a8114b07ec51e.html

          1.監控事例的等待:
          select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,count(*)
          from v$session_wait
          group by event order by 4;

          2.回滾段的爭用情況:
          select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn=b.usn;

          3.監控表空間的I/O比例:
          col name format a10
          col file format a50
          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

          4.監控文件系統的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#

          5.在某個用戶下找所有的索引:
          select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
          from user_ind_columns, user_indexes
          where user_ind_columns.index_name = user_indexes.index_name
          and user_ind_columns.table_name = user_indexes.table_name
          order by user_indexes.table_type, user_indexes.table_name,
          user_indexes.index_name, column_position;

          6. 監控 SGA 的Buffer Cache 中的命中率
          /*select a.value + b.value "logical_reads", c.value "phys_reads",
          round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
          from v$sysstat a, v$sysstat b, v$sysstat c
          where a.statistic# = 38 and b.statistic# = 39
          and c.statistic# = 40;
          */
          select 1-((a.value-b.value-c.value)/d.value)
          from v$sysstat a,v$sysstat b,v$sysstat c,v$sysstat d
          where a.name='physical reads' and
          b.name='physical reads direct' and
          c.name='physical reads direct (lob)' and
          d.name='session logical reads';

          7. 監控 SGA 中字典緩沖區的命中率
          select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
          (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
          from v$rowcache
          where gets+getmisses <>0
          group by parameter, gets, getmisses;

          8. 監控 SGA 中共享緩存區的命中率,應該小于1%
          select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
          sum(reloads)/sum(pins) *100 libcache
          from v$librarycache;
          #I f the reloads-to-pins ratio is greater than 1%,increase the value of the SHARED_POOL_SIZE parameter.
          來自OCP9i教材

          select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
          from v$librarycache;


          9. 顯示所有數據庫對象的類別和大小
          select count(name) num_instances ,type ,sum(source_size) source_size ,
          sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
          sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
          from dba_object_size
          group by type order by 2;

          10. 監控 SGA 中重做日志緩存區的命中率,應該小于1%
          SELECT name, gets, misses, immediate_gets, immediate_misses,
          Decode(gets,0,0,misses/gets*100) ratio1,
          Decode(immediate_gets+immediate_misses,0,0,
          immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
          FROM v$latch WHERE name IN (''redo allocation'', ''redo copy'');

          11. 監控內存和硬盤的排序比率,最好使它小于 .10,增加 sort_area_size
          SELECT name, value FROM v$sysstat WHERE name IN (''sorts (memory)'', ''sorts (disk)'');

          12. 監控當前數據庫誰在運行什么SQL語句
          SELECT osuser, username, sql_text from v$session a, v$sqltext b
          where a.sql_address =b.address order by address, piece;

          13. 監控字典緩沖區
          SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
          SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
          SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;

          后者除以前者,此比率小于1%,接近0%為好。
          SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
          FROM V$ROWCACHE

          14. 找ORACLE字符集
          select * from sys.props$ where name=''NLS_CHARACTERSET'';

          15. 監控 MTS
          select busy/(busy+idle) "shared servers busy" from v$dispatcher;
          此值大于0.5時,參數需加大
          select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type=''dispatcher'';
          select count(*) from v$dispatcher;
          select servers_highwater from v$mts;
          servers_highwater接近mts_max_servers時,參數需加大

          16. 碎片程度
          select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
          having count(tablespace_name)>10;
          alter tablespace name coalesce;
          alter table name deallocate unused;
          create or replace view ts_blocks_v as
          select tablespace_name,block_id,bytes,blocks,''free space'' segment_name from dba_free_space
          union all
          select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
          select * from ts_blocks_v;
          select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
          group by tablespace_name;

          查看碎片程度高的表
          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);

          17. 表、索引的存儲情況檢查
          select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
          tablespace_name=''&tablespace_name'' and segment_type=''TABLE'' group by tablespace_name,segment_name;
          select segment_name,count(*) from dba_extents where segment_type=''INDEX'' and owner=''&owner''
          group by segment_name;

          18、找使用CPU多的用戶session
          12是cpu used by this session
          select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
          from v$session a,v$process b,v$sesstat c
          where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

          20.監控log_buffer的使用情況:(值最好小于1%,否則增加log_buffer 的大小)
          select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value||''%'' "radio"
          from v$sysstat rbar,v$sysstat re
          where rbar.name=''redo buffer allocation retries''
          and re.name=''redo entries'';

          21、查看運行過的SQL語句:
          SELECT SQL_TEXT
          FROM V$SQL

          22.oracle等待事件檢測 
           

          使用ORACLE的等待事件檢測性能瓶頸
          案例分析:以sys用戶登錄
          1.首先從整個系統考慮,找到從系統啟動以來最主要的等待事件是什么?
          SQL>@syssum.sql
          2.更為重要的是,在應用執行的時候,最主要的等待事件是什么?
          SQL>@cr_base.sql
          SQL>@in_base.sql
          執行用戶應用操作一段時間后
          SQL>@re_base.sql
          3. 查詢產生等待事件最多的哪些會話??(以等待事件log file parallel write為例)
          SQL>@seswt.sql log

          4.查找哪些語句引起的等待,按照最消耗資源的順序排列顯示
          SQL>@sqls1.sql 1000 1000
          --以最消耗資源會話13為例
          SQL>@sqlst.sql 13
          查找出相關sql語句的地址比如:2168CBB8
          SQL>@sqls2.sql 2168CBB8
           

          附錄:腳本
          --syssum.sql
          set linesize 200
          col "Wait Event" for a45
          select EVENT "Wait Event",TIME_WAITED "Time Waited",
                 TIME_WAITED/(SELECT SUM(TIME_WAITED) FROM v$system_event) "%Time waited",
                 TOTAL_WAITS "Waits",
                 TOTAL_WAITS/(SELECT SUM(TOTAL_WAITS) FROM V$system_event) "%Waited"
          from v$system_event
          order by 3 desc;

          --cr_base.sql
          create table sys_b(
          event varchar2(64),
          time_waited number,
          total_waits number);
          create table sys_e(
          event varchar2(64),
          time_waited  number,
          total_waits  number);

          --in_base.sql
          insert into sys_b
          select event,time_waited,total_waits
          from v$system_event;

          --re_base.sql
          insert into sys_e
          select event,time_waited,total_waits
          from v$system_event;
          create table sys_dif
          as
          select e.event ,e.time_waited-b.time_waited  TIME_WAITED,
                          e.total_waits-b.total_waits  TOTAL_WAITS
          from sys_b b,sys_e e
          where b.event=e.event;
          select event "Wait Event",time_waited "Time Waited",
                 time_waited/(select sum(time_waited) from sys_dif) "%Time waited",
                 total_waits "Waits",
                 total_waits /(select sum(total_waits) from sys_dif) "%Waited"
          from sys_dif
          order by 3 desc;
          drop table sys_dif;
          drop table sys_b;
          drop table sys_e;
           
          等待事件的等待次數
          --seswa.sql
          select event "Wait Event",
                 count(seconds_in_wait) "Waited So Far(sec)",
                 count(sid) "Num Sess Waiting"
          from v$session_wait
          group by event;

          --seswt.sql
          select sid,event "Wait Event",state "Wait Stat",
                 wait_time "W'd So Far(secs)", seconds_in_wait "Time W'd (secs)"
          from v$session_wait
          where event like '&a'
          order by 5;

          --sqls1.sql
          select * from
                  (select address "Stmt Addr",
                          disk_reads "Disk RDS",
                          buffer_gets "Buff Gets",
                          sorts "Sorts",
                          executions "Runs",
                          loads "Body Loads"
                    from v$sqlarea where disk_reads > &A
                    order by disk_reads  )
          where rownum < &B;
           
          --sqlst.sql
          select cpu.sid "SID",cpu.username "USER Name",cpu.value "CPU(sec)",
                 reads.value "IO Read(k)",writes.value "IO Write(k)"
          from
          (select a.sid sid,a.username username,b.name,c.value value, a.serial# serial#
          from v$session a,v$statname b,v$sesstat c
          where a.sid=c.sid and b.statistic#=c.statistic# and b.name='CPU used by this session') cpu,
          (select a.sid,a.username,b.name,c.value value from v$session a,v$statname b ,v$sesstat c
          where a.sid=c.sid and b.statistic#=c.statistic# and b.name='physical reads') reads,
          (select a.sid,a.username,b.name,c.value value from v$session a,v$statname b ,v$sesstat c
          where a.sid=c.sid and b.statistic#=c.statistic# and b.name='physical writes') writes
          where cpu.sid=reads.sid and reads.sid=writes.sid and cpu.username is not null;
           
          --sqls2.sql
          select sql_text "SQL Statement Text"
          from v$sqlarea
          where ADDRESS='&a';


          posted @ 2009-12-09 14:44 gdufo| 編輯 收藏

          show sga 的描述

          轉:http://blog.csdn.net/biti_rainy/archive/2004/06/30/30974.aspx

          關于 show sga 結果的描述
          Total System Global Area AAAAA bytes
          Fixed Size BBBBB bytes
          Variable Size CCCCC bytes
          Database Buffers DDDDD bytes
          Redo Buffers EEEEE bytes

          fixes size : oracle 的不同平臺和不同版本下可能不一樣,但對于確定環境是一個固定的值,里面存儲了 SGA 各部分 組件 的信息,可以看作 引導 建立 SGA 的區域

          Variable Size : 包括 shared pool ,java pool ,large pool, 管理DB_BLOCK_BUFFERS 的內存,管理控制文件信息的內存,等等其他管理和控制 oracle 內部結構的內存

          redo buffer

          1: 設置參數

          SQL> show parameters log_buffer

          NAME TYPE VALUE
          ------------------------------------ ------- ------------------------------
          log_buffer integer 524288


          2:日志內存大小

          SQL> select * from v$sgastat where name like '%log%';

          POOL NAME BYTES
          ----------- -------------------------- ----------
          log_buffer 656384

           

          3 : 為了保護日志內存,而增加了輔助的內存,也就是保護頁
          SQL> show sga

          Total System Global Area 496049552 bytes
          Fixed Size 454032 bytes
          Variable Size 109051904 bytes
          Database Buffers 385875968 bytes
          Redo Buffers 667648 bytes
          SQL>

          對于數據庫來說,在不同 的平臺下
          log_buffer 是離散的 一組值,假設是集合 R,并且不是按照 os blockck 或者 db block 為步長增加的,(比如可能是 65k,128k,512k ,641k....這樣的值) 當設置參數為某個值的時候,數據庫選擇的實際大小是 大于等于 該值 的 min(R) ,根據這組值,比如你設置了 log_buffer = 600k ,則實際選擇的是641 k

          然后,在實際分配內存的時候,為了 給 log buffer 做一些保護,還另外分配了一小部分空間,通常是 11 k 大小。則有641+11 = 652 k ,這才是 最后真正的 內存大小 ,也就是 show SGA 時候顯示大小

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/biti_rainy/archive/2004/06/30/30974.aspx

          posted @ 2009-12-09 11:04 gdufo| 編輯 收藏

          什么是LATCH ? 什么又導致LATCH 競爭?

          轉:
          http://carson.ycool.com/post.1264755.html

          • oracle 采用 latch、enqueue、distribute lock 、global lock等來進行‘鎖’的管理
          • Latches are low level serialization mechanisms used to protect shared data structures in the SGA. A latch is a type  of a lock that can be very quickly acquired and freed
          • Enqueue 是另外一種鎖,An enqueue is a more sophisticated mechanism which permits several concurrent processes to have varying degree of sharing of "known" resources. Any object which can be concurrently used, can be protected with enqueues. 它于 latch的不同之處在于,它是OS級別的,由OS的lock manger 來進行管理,并且嚴格遵守FIFO,而latch 確不然,很有可能是先申請latch的進程,卻最后得到latch
          • A process acquires a latch when working with a structure in the SGA (System Global Area).  在process 工作的過程中持有,在工作結束的時候釋放,在process 意外結束的時候,由PMON 來收拾殘局
          • Latch 有兩種,一個是willing-to-wait,一個是no wait
          • 如果一個process 申請latch 沒有申請的到,就開始spin,spin的次數有_spin_count參數來決定,當達到_spin_count的值時,就開始休眠,休眠時間為0.01秒
          • 主要相關視圖:v$latch,v$latch_misses,v$latch_name,

          主要的Latch

          • Cache buffers chains latch:    產生:在data buffer 有block 被access的時候產生; 解決: 減少這個latch 競爭就是要減少sql 的邏輯IO
          • Cache buffers LRU chain latch:  產生: 1、當一個新的block 被讀到data buffer 的時候 2、data 從databuffer 寫到disk   3、對Data buffer 進行scan 以獲得那些block是dirty 時候;   解決: 1、加大data buffer,但是這對于FTS 比較多的系統并不中用  2、設置Multiple buffer pools   3、加大DB_BLOCK_LRU_LATCHES 參數的值  4、always ensure DB_BLOCK_LRU_STATISTICS is set to FALSE
          • Redo allocation latch:   產生:在log buffer中分配空間的時候獲得,一個instance 只有一個Redo allocation latch ; 解決:1、加大log buffer    2、設置 nologging 選項
          • Redo copy latch:   產生:當系統將redo records 寫到log buffer 的時候產生; 
          • Library cache latch:   產生:The library cache latches 保護cached 的sql 語句,以及cached 的object 的定義,它是當將新的解析的sql 語句 插入到library cache 的時候產生,該值過大,表示hard parse 過多;  解決: 1、綁定變量   2、 適當加大shared pool     3、加大_KGL_LATCH_COUNT 參數
          • Library cache pin latch:  產生: 當cached sql 語句再次被執行的時候產生,這個latch 的嚴重丟失表明sql 被嚴重的多次執行;   解決: 幾乎沒有辦法來解決該問題,一個效果不大的辦法是書寫:a.b 類似的sql
          • Shared pool latch:   the shared pool latchis used to protect critical operations when allocating and freeing memory in the shared pool.     解決:  1、綁定變量   2、避免hard parse   3、盡量一次解析多次執行   4、適當的shared_pool  5、MTS
          • Row cache objects latch:    產生: 當用戶進程讀取數據字典定義的時候      解決: 加大shared_pool

          如果一個系統中的CPU 很繁忙,就應該減少_SPIN_COUNT 的值,反之,就應該增加

          posted @ 2009-12-09 10:47 gdufo| 編輯 收藏

          linux下完全刪除Oracle

          確認實例并刪除數據庫:
          $ more /etc/oratab
          $ . /usr/local/bin/oraenv
          $ dbca    (xmanager里,執行刪除)

          刪除oracle軟件:
          $ export ORACLE_HOME=/u01/app/oracle/product/1020/db_1
          $ $ORACLE_HOME/bin/emctl stop dbconsole
          $ ps -ef | grep dbconsole | grep -v grep    (檢查)
          $ $ORACLE_HOME/bin/lsnrctl stop
          $ ps -ef | grep tnslsnr | grep -v grep    (檢查)
          $ $ORACLE_HOME/bin/isqlplusctl stop
          $ ps -ef | grep isqlplus | grep -v grep    (檢查)   
          $ $ORACLE_HOME/bin/searchctl stop
          $ ps -ef | grep ultrasearch | grep -v grep    (檢查)
          $ $ORACLE_HOME/oui/bin/runInstaller    (xmanager里,執行刪除操作)

          =================================================================================

          1.$ORACLE_BASE/product & oraInventory
          2./etc/oratab
          3./tmp/ora相關
          4./opt/orcl*
          5./usr/local/bin/下的幾個文件可以不刪除,但注意下次跑root.sh時,提示覆蓋文件時選擇y

          /usr/local/bin下的3個受影響的文件是
          dbhome
          oraenv
          coraenv
          下次安裝跑root.sh時,注意選擇覆蓋


          ================================================================================
          1.用oracle用戶登錄
          如果要再次安裝, 最好先做一些備份工作。
          包括用戶的登錄腳本,數據庫自動啟動關閉的腳本,和Listener自動啟動的腳本。
          要是有可能連創建數據庫的腳本也保存下來
          2.使用SQL*PLUS停止數據庫
          [oracle@ora920 oracle]$ sqlplus /nolog
          SQL> connect / as sysdba
          SQL> shutdown [immediate]
          SQL> exit

          3.停止Listener
          [oracle@ora920 oracle]$ lsnrctl stop

          4.停止HTTP服務
          [oracle@ora920 oracle]$ $ORACLE_HOME/Apache/Apache/bin/apachectl stop

          5.用su或者重新登錄到root(如想重新安裝可以保留oracle用戶,省得輸入環境變量了)

          6.將安裝目錄刪除
          [root@ora920 /root]# rm -rf /opt/oracle/

          7.將/usr/bin下的文件刪除
          [root@ora920 /root]# rm /usr/bin/dbhome
          [root@ora920 /root]# rm /usr/bin/oraenv
          [root@ora920 /root]# rm /usr/bin/coraenv

          8.將/etc/oratab刪除
          [root@ora920 /root]# rm /etc/oratab

          9.將/etc/oraInst.loc刪除
          [root@ora920 /root]# rm /etc/oraInst.loc

          10.將oracle用戶刪除(若要重新安裝,可以不刪除)
          [root@ora920 /root]# userdel –r oracle

          11.將用戶組刪除(若要重新安裝,可以不刪除)
          [root@ora920 /root]# groupdel oinstall
          [root@ora920 /root]# groupdel dba

          12.將啟動服務刪除
          [root@ora920 /root]# chkconfig --del dbora

          posted @ 2009-12-06 13:35 gdufo| 編輯 收藏

          rman 增量備份

          rem run rman

          rman target / cmdfile=G:\oracle\ msglog= e:/orabackup/full_rmanlog%date:~4,10%.log


          run{
          allocate channel c1 type disk;
          backup
          incremental level=0
          format 'G:\inc0_%u_%T'
          tag sun_inc0
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=2
          format 'G:\inc2_%u_%T'
          tag mon_inc2
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=2
          format 'G:\inc2_%u_%T'
          tag tue_inc2
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=1
          format 'G:\inc1_%u_%T'
          tag wed_inc1
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=2
          format 'G:\inc2_%u_%T'
          tag thu_inc2
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=2
          format 'G:\inc2_%u_%T'
          tag fri_inc2
          database
          plus archivelog delete input;
          release channel c1;
          }

          run{
          allocate channel c1 type disk;
          backup
          incremental level=2
          format 'G:\inc2_%u_%T'
          tag sat_inc2
          database
          plus archivelog delete input;
          release channel c1;
          }

          run {
          set archivelog destination to 'g:\';
          restore archivelog sequence 16;
          }

          startup mount;

          --如果是控制文件丟失
          sql>startup nomount;
          sql>
          DECLARE
          DEVTYPE VARCHAR2(256);
          DONE BOOLEAN;
          BEGIN
          DEVTYPE:=DBMS_BACKUP_RESTORE.DEVICEALLOCATE(NULL);
          DBMS_BACKUP_RESTORE.RESTORESETDATAFILE;
          DBMS_BACKUP_RESTORE.RESTORECONTROLFILETO('G:\oracle\oradata\orcl\CONTROL01.CTL');
          DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE('G:\CTRL_C-1231731297-20091202-03',DONE=>done);
          DBMS_BACKUP_RESTORE.RESTORESETDATAFILE; DBMS_BACKUP_RESTORE.RESTORECONTROLFILETO('G:\oracle\oradata\orcl\CONTROL02.CTL');
          DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE('G:\CTRL_C-1231731297-20091202-03',DONE=>done);
          DBMS_BACKUP_RESTORE.RESTORESETDATAFILE; DBMS_BACKUP_RESTORE.RESTORECONTROLFILETO('G:\oracle\oradata\orcl\CONTROL03.CTL');
          DBMS_BACKUP_RESTORE.RESTOREBACKUPPIECE('G:\CTRL_C-1231731297-20091202-03',DONE=>done);
          DBMS_BACKUP_RESTORE.DEVICEDEALLOCATE(NULL);
          END;
          /
          sql>alter database mount;

          restore database;

          posted @ 2009-12-02 17:31 gdufo| 編輯 收藏

          從備份集恢復歸檔日志的測試與說明(轉載)


          近期研究備份和恢復卓有成效,正好對日志恢復有些生疏,看到EYGLE里有篇好文,先借過用用。

          數據庫出現問題,但不需要restore只需recover時,發現要用到的archivelog已經備份并刪除了,因為我們備份archivelog一般是采用delete input的,
          4z9kV C@ s2t0這時先需要restore archivelog,然后才能做recover,下面介紹一下restore archivelog的用法:

          restore archivelog后面可以跟的參數有"all, from, high, like, logseq, low, scn, sequence, time, until"
          $d"~2o|A gz3\0現在舉一列子說明:ITPUB個人空間Kxv#D'^DN
          1.列出已經備份的archivelog
          I'@ `{t}0list backup of archivelog all;
          :kBP3gU(].yB02.預覽恢復出程,但不真正恢復
          @5Xtp4z0可以在你執行恢復前先看看恢復過程,也可以驗證一下你的語法是否寫對
          8d6k5{@\)hY B0restore archivelog all preview; 即在你要執行的restore archivelog命令后加previewITPUB個人空間m8U P Cf;K/h
          restore archivelog sequence 18 preview;ITPUB個人空間2i9W_%C:c
          3.恢復指定時間范圍的archivelog
          `o#Cm e Mk.Z03.1 顯示2008-08-13 10:00:00到2008-08-13 11:00:00之間的archivelogITPUB個人空間sqP8IG
          list backup of archivelog time between "to_date('2008-08-13 10:00:00','yyyy-mm-dd hh24:mi:ss')" and "to_date('2008-08-13 11:00:00','yyyy-mm-dd hh24:mi:ss')";ITPUB個人空間w7VIK Zvj,n1q o*O
          3.2 預覽恢復2008-08-13 10:00:00到2008-08-13 11:00:00之間的archivelogITPUB個人空間3eP"q n,}4G8ZD3g
          restore archivelog time between "to_date('2008-08-13 10:00:00','yyyy-mm-dd hh24:mi:ss')" and "to_date('2008-08-13 11::00','yyyy-mm-dd hh24:mi:ss')" preview;ITPUB個人空間#Q@6r'O yW.S
          3.3 真正恢復2008-08-13 10:00:00到2008-08-13 11:00:00之間的archivelogITPUB個人空間Q9v+Fs]d}EYi;E5T
          restore archivelog time between "to_date('2008-08-13 10:00:00','yyyy-mm-dd hh24:mi:ss')" and "to_date('2008-08-13 11::00','yyyy-mm-dd hh24:mi:ss')"ITPUB個人空間*xJ[m2mU%m
          4.恢復指定的archivelog
          /c Z#W.ci \As1g6r ~N Z0restore archivelog sequence 18; 恢復sequence為18的archivelog
          *NLO:AU3k0yQ5Y05.restore archivelog like恢復模糊查詢出來的archivelog,這個只能用于通過catalog的備份,用nocatalog的會報錯
          6H A `l{4s4W6Mi0restore archivelog like '%18%';
          C o3j*f KO2d/B[6k;O06.恢復指定sequence范圍的archivelog
          :DZ5L5K+N{0restore archivelog from sequence 18 until sequence 20;
          7Ir,Vs P xc0或restore archivelog low sequence 18 high sequence 20;ITPUB個人空間m } ~*Ib%X5mz
          或restore archivelog low logseq 18 high logseq 20;
          3y@*nPP2yk07.指定archivelog的恢復目的地,如你想把archivelog恢復到一個臨時目錄時有用,但這個必須包含在run{}里面才能用ITPUB個人空間#~2D4f5P awr
          set archivelog destination to 'e:\temp';

          以上基本上可以解決你恢復archivelog的需求,我是在10.2.0.4版本中測試通過的,歡迎大家補充,轉載請說明出處.

          ---------------------------------------------ITPUB個人空間+|,SDL.brF
          以下部分是在本人正式環境中遇到的實際情況,非轉載:
          }%|Q$G3w[c0備份日志中有以下內容:
          A zZYi\0通道 t1: 正在指定備份集中的存檔日志
          #mf lj j[ lLg0i_0輸入存檔日志線程 =1 序列 =18070 記錄 ID=35794 時間戳=671966051
          eg/s&[#J9XTA0輸入存檔日志線程 =1 序列 =18071 記錄 ID=35796 時間戳=671966351ITPUB個人空間3K xs(E y5Z4n?
          輸入存檔日志線程 =1 序列 =18072 記錄 ID=35798 時間戳=671966652ITPUB個人空間$w`S$T`2D @Z1e'r
          輸入存檔日志線程 =1 序列 =18073 記錄 ID=35800 時間戳=671966952
          4Z~/_*TXl0輸入存檔日志線程 =1 序列 =18074 記錄 ID=35802 時間戳=671967249
          *R1t:\!AN nrh0輸入存檔日志線程 =1 序列 =18075 記錄 ID=35804 時間戳=671967550
          8p~].OC9Pd0輸入存檔日志線程 =1 序列 =18076 記錄 ID=35806 時間戳=671967850
          {;] a?M*R6jjX C0輸入存檔日志線程 =1 序列 =18077 記錄 ID=35808 時間戳=671968151ITPUB個人空間g;BEG2c:j
          輸入存檔日志線程 =1 序列 =18078 記錄 ID=35810 時間戳=671968451ITPUB個人空間`.XDt6S @)c6a

          5h*GI5i+W+u:R6g0單獨恢復18071 到18076ITPUB個人空間'J N1g+C xHw l4`3q

          rman> run
          n*G jV2~ g0{ allocate channel t1 type 'sbt_tape' parms 'ENV=(tdpo_optfile=/usr/tivoli/tsm/client/oracle/bin64/tdpo.opt)';ITPUB個人空間wkuw|-B\
          restore archivelog from logseq 18071 until logseq 18076 ;
          ,Ym"ip\9CQ4M*n0release channel t1;
          ^(Tst B-Cs0}
          ITPUB個人空間5^J v*mYM'|jK3O+g+?
          ITPUB個人空間y9dn8O2|#V.w(M,yI
          經過在線環境的實地測試,以上腳本可行

          posted @ 2009-12-01 22:11 gdufo| 編輯 收藏

          在歸檔模式下的Rman全恢復

          在歸檔模式下的Rman全恢復
          cmd
          $>rman target nocatelog
          RMAN> run{allocate channel c1 type disk;
          CONFIGURE CONTROLFILE AUTOBACKUP ON; #備份
          CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'G:\ctrl_%F';
          backup database format 'G:\orcl_%U';
          sql 'alter system archive log current';
          release channel c1;}
          ==
          修改數據
          sql>shutdown immediate
          ==
          $>rman target nocatelog
          rman>startup mount; --必須啟動到mount
          rman>restore database;
          rman>recover database;
          rman>run {sql'alter database open';} 如果在非歸檔的模式下:
               run {sql'alter database open resetlogs';} 并且修改的數據找不回來。

          posted @ 2009-12-01 14:53 gdufo| 編輯 收藏

          僅列出標題
          共19頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 Last 

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 四川省| 武城县| 无极县| 泽普县| 时尚| 临洮县| 蒙自县| 丹棱县| 依兰县| 宕昌县| 涞源县| 乳山市| 东港市| 大同市| 漳浦县| 湖南省| 舞阳县| 信宜市| 兴山县| 从江县| 四川省| 十堰市| 右玉县| 共和县| 浠水县| 平陆县| 昭通市| 黔江区| 炎陵县| 托克逊县| 宜宾县| 黎川县| 博野县| 临武县| 平安县| 即墨市| 新龙县| 湾仔区| 航空| 额尔古纳市| 故城县|