首页 > 数据库 > Oracle > [20230307]如何知道启用IMU.txt
[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博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2939164/ ,如需转载,请注明出处,否则将追究法律责任。