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

来源:这里教程网 时间:2026-03-03 18:28:29 作者:

[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。

相关推荐