Oracle 10g Redor 增强
在10g中,log_parallelism参数变为隐含参数,并且Oracle引入了_log_parallelism_max,_log_parallelism_dynamic,_log_parallelism_dynamic与_log_parallelism不同时Oracle会动态的选择并行度
但是需要注意的是当日志并行度被设置大于1之后,LogMiner将不能解析日志文件,ORA-01374号错误提示说明了这个问题。
相较Oracle 9i中的Public Redolog Strands(PBRS),10R2中更引入了Private Redolog Strands(PVRS),在PVRS机制下,数据库可以在共享池中分配大量的小的私有内存,通常每个大小在64~128k左右,被独立的Redo Allocation Latch所保护,当数据库中特定类型的小事务开始时会被绑定到独立且空闲的PVRS,每个Buffer绑定一个活动事务。在新的机制下,Redo产生后可以直接存入PVRS,而不再保存在PGA中,这样就不再需要额外的内存拷贝过程,Redo Copy Latch也就不再需要(PVRS也因此被称为ZERO-COPY Redo),而Redo Copy正是引发Redo Allocation Latch竞争的根源。
新的机制下,在进行Redo写出工作时,LGWR需要做的工作就是将PBRS和PVRS中的内容写出,当Redo Flush发生时,所有的Public Redo Allocation Latch需要被获取,所有Public Strands的Redo Copy Latch需要被检查,所有包含活动事务的Private Strands需要被持有。
以下是PVRS在共享池中的内存分配信息(注意在RAC环境中不适用)。
SYS@ orcl> select * from v$sgastat where name = 'private strands';
POOL NAME BYTES
------------ ------------------------------ ----------
shared pool private strands 2472960
SYS@ orcl> @GetHidPar
Enter value for par: log_private
NAME VALUE PDESC
------------------------------ --------------- --------------------------------------------------
_log_private_parallelism_mul 10 Active sessions multiplier to deduce number of pri
vate strands
_log_private_mul 5 Private strand multiplier for log space preallocat
ion
PRVS的统计数据可以从V$SYSSTAT视图查询得到,由于IMU(In Memory Undo)与PVRS紧密相关,所以两者的信息且有相关性。
SYS@ orcl> select name, value from v$sysstat where upper(name) like '%IMU%';
NAME VALUE
-------------------------------------------------------------------- -------------
doubling up with imu segment 0
IMU commits 543
IMU Flushes 37
IMU contention 2
IMU recursive-transaction flush 0
IMU undo retention flush 0
IMU ktichg flush 2
IMU bind flushes 0
IMU mbu flush 0
IMU pool not allocated 22
IMU CR rollbacks 0
IMU undo allocation size 1271452
IMU Redo allocation size 261972
IMU- failed to get a private strand 22
cell simulated physical IO bytes eligible for predicate offload 0
cell simulated physical IO bytes returned by predicate offload 0
cell simulated session smart scan efficiency 0
OS Maximum resident set size 0
如要告警日志中出现Private strand flush not complete,这是指从内存到Redo Log File的写出尚未完成:
SYS@ orcl> select name from v$event_name where upper(name) like '%STRAND%';
NAME
--------------------------------------------------------------------
log file switch (private strand flush incomplete)