[20230307]如何知道啟用IMU.txt

lfree發表於2023-03-10

[20230307]如何知道啟用IMU.txt

--//上個星期對生產系統redo做了一個轉儲,主要是想分析為什麼這套系統每天產生的日誌有點大。
--//我當時認為這套系統單機應該使用開啟IMU。實際上的情況該系統開啟附加日誌,不可能工作在IMU下。
--//那麼如何知道資料庫啟用IMU呢?對於相關知識有點生疏,複習一下。

--//首先有幾種情況oracle不會啟用IMU。
1.rac環境。
2.資料庫開啟flashback。
3.開啟附加日誌。
4.當然一種情況比較特殊就是如果寫滿IMU快取,系統也會切換到傳統模式。
5.當然如果切換日誌,也會導致IMU資訊寫盤。alert會出現Private Strand Flush Not Complete之類的提示。
6.如果執行alter system checkpoint也會導致IMU資訊寫盤,但是我以前遇到的情況是不確定,有時寫有時不寫。
  具體細節我一直不是很清楚..

--//如何知道當前資料庫啟用IMU呢,自己做一些總結:
1.環境:
SCOTT@book> @ver1
PORT_STRING         VERSION    BANNER
------------------- ---------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.首先不能簡單透過隱含引數_in_memory_undo確定。
SYS@book> alter database flashback on;
Database altered.

SYS@book> @ hide  _in_memory_undo
NAME            DESCRIPTION                                    DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
--------------- ---------------------------------------------- ------------- ------------- ------------ ----- ---------
_in_memory_undo Make in memory undo for top level transactions TRUE          TRUE          TRUE         TRUE  IMMEDIATE
--//我設定資料庫flashback on;,但是_in_memory_undo並不會自動設定false。
--//當然如果你發現_in_memory_undo=false,那麼一定關閉IMU。

3.最簡單方法就是檢視v$sysstat檢視:
select * from v$sysstat where name like '%IMU%';
select name,value from v$sysstat where name like '%commits%';
--//select * from v$sgastat where name='KTI-UNDO';
--//你可以等一小段時間再次執行看看是否變化來確定IMU的啟用。
--//注意如果IMU commits的值有變化說明啟用了IMU,因為資料庫可能在執行過程開啟flashback或者附加日誌.這樣就關閉IMU.
SYS@book> alter database flashback on;
Database altered.

SYS@book> select name,value from v$sysstat where name like '%commits%';
NAME         VALUE
------------ -----
user commits 13824
IMU commits  10727

--//執行一些小的dml操作並提交!!.

SYS@book> select name,value from v$sysstat where name like '%commits%';
NAME         VALUE
------------ -----
user commits 13826
IMU commits  10727
--//資料庫目前開啟flashback on,IMU commits的值沒有發生了變化!!

SYS@book> alter database flashback off;
Database altered.

SYS@book> select name,value from v$sysstat where name like '%commits%';
NAME         VALUE
------------ -----
user commits 13828
IMU commits  10727

--//執行一些小的dml操作並提交!!.

SYS@book> select name,value from v$sysstat where name like '%commits%';
NAME         VALUE
------------ -----
user commits 13834
IMU commits  10733
--//可以發現IMU commits的值增加,說明開啟IMU.這樣可以快速判斷.感覺這是最簡單的方法!!

4.其它方法:
$ cat imu.sql
SELECT INDX
      ,FIRST_BUF_KCRFA
      ,last_buf_kcrfa
      ,PNEXT_BUF_KCRFA_CLN nxtbufadr
      ,NEXT_BUF_NUM_KCRFA_CLN nxtbuf#
      ,BYTES_IN_BUF_KCRFA_CLN "B/buf"
      ,PVT_STRAND_STATE_KCRFA_CLN state
      ,STRAND_NUM_ORDINAL_KCRFA_CLN strand#
      ,PTR_KCRF_PVT_STRAND stradr
      ,INDEX_KCRF_PVT_STRAND stridx
      ,SPACE_KCRF_PVT_STRAND strspc
      ,TXN_KCRF_PVT_STRAND txn
      ,TOTAL_BUFS_KCRFA totbufs#
      ,STRAND_SIZE_KCRFA strsz
  FROM X$KCRFSTRAND ;

--//透過查詢X$KCRFSTRAND檢視,如果PTR_KCRF_PVT_STRAND=00(也就是stradr=00),基本可以判斷沒有使用IMU.

$ cat imuz.sql
SELECT
    indx
    ,inst_id
    ,ktifpno
    ,ktifpxcb tx_addr
    ,ktifpupb undo_begin
    ,ktifpupc undo_cur
    ,ktifpupe undo_end
    ,ktifprpb redo_begin
    ,ktifprpc redo_cur
    ,ktifprpe redo_end
    ,TO_NUMBER (ktifpupc, 'XXXXXXXXXXXXXXXX') - TO_NUMBER (ktifpupb, 'XXXXXXXXXXXXXXXX') undo_usage
    ,TO_NUMBER (ktifpupe, 'XXXXXXXXXXXXXXXX') - TO_NUMBER (ktifpupb, 'XXXXXXXXXXXXXXXX') undo_size
    ,TO_NUMBER (ktifprpc, 'XXXXXXXXXXXXXXXX') - TO_NUMBER (ktifprpb, 'XXXXXXXXXXXXXXXX') redo_usage
    ,TO_NUMBER (ktifprpe, 'XXXXXXXXXXXXXXXX') - TO_NUMBER (ktifprpb, 'XXXXXXXXXXXXXXXX') redo_size
    ,KTIFPPSI
    ,KTIFPRBS
    ,KTIFPTCN
    ,KTIFPFLC
    ,KTIFPOPC
    ,ktifptxflg
  FROM x$ktifp
where
    TO_NUMBER (ktifprpe, 'XXXXXXXXXXXXXXXX') - TO_NUMBER (ktifprpb, 'XXXXXXXXXXXXXXXX') !=0
;

--//如果一個業務繁忙的系統,執行以上有輸出,可以確定啟用IMU,測試環境也很容易模擬,執行一些小的dml不提交,再執行以上命令有
--//輸出,可以確定啟用IMU。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2939164/,如需轉載,請註明出處,否則將追究法律責任。

相關文章