maxtransops只适用于classic模式,会对大事务进行拆分,默认值非常大,设置为较小值会将大事务分割为小事务,所以理论上,大事务不会再作为一整个事务,所以需要谨慎设置该参数。
下面测试在集成模式下、classic模式下,测试classic+maxtransops对效率提升。
1.集成模式
集成模式并行是根据事务拆分,并不是根据操作,源端事务在目标端也是一整个事务,所以理论上集成模式并行对大事务相比经典模式提升较为有限,对OLTP类小事务提升较为明显。
1.1 源端模拟插入大事务
源端执行大事务插入:
begin
for i in 1..3000000
loop
insert into test values(i,'''czh||i||''');
end loop;
commit;
end;
/
Elapsed: 00:03:59.32
1.2 目标端监视表数据
while true
do
date >> hr_count.log
sqlplus -S / as sysdba >> hr_count.log <
1.3 监视表上活动事务以及消耗undo情况
col sid for 99999
col serial# for 99999999
col username for a15
col sql_id for a15
col prev_sql_id for a15
col trx_status for a6
col used_ublk for 99999999
col used_urec for 99999999
col start_time for a25
col table_owner for a10
col table_name for a15
col lmode for 99999
col request for 99999
set lines 200 pages 200
select s.sid
,s.serial#
,s.username
,s.sql_id
,s.prev_sql_id
,t.status AS trx_status
,t.USED_UBLK
,t.USED_UREC
,t.START_TIME
,d.owner AS table_owner
,d.object_name AS table_name
,l.lmode
,l.type
,l.request
from v$transaction t,v$session s,dba_objects d,v$lock l
where t.ses_addr = s.saddr
and l.sid = s.sid
and l.id1 = d.object_id
and t.status = 'ACTIVE'
and d.object_name = 'TEST'
and d.owner = 'HR';
可以同时观察表活动事务,可以看到undo使用一直在涨。
可以从监视日志中看到目标端持续26分钟,源端执行事务花费了四分钟左右。
2. 经典模式
中间就不赘述集成模式与经典模式切换步骤了,切换为经典模式进行下面测试。
2.1 源端模拟大事务
HR@messay > begin
for i in 12..3000000
loop
insert into test values(i,'''czh||i||''');
end loop;
commit;
end;
/
PL/SQL procedure successfully completed
Elapsed: 00:04:04.60
2.2 观测事务完成
while true
do
date >> hr_count.log
sqlplus -S / as sysdba >> hr_count.log <
col sid for 99999
col serial# for 99999999
col username for a15
col sql_id for a15
col prev_sql_id for a15
col trx_status for a6
col used_ublk for 99999999
col used_urec for 99999999
col start_time for a25
col table_owner for a10
col table_name for a15
col lmode for 99999
col request for 99999
set lines 200 pages 200
select s.sid
,s.serial#
,s.username
,s.sql_id
,s.prev_sql_id
,t.status AS trx_status
,t.USED_UBLK
,t.USED_UREC
,t.START_TIME
,d.owner AS table_owner
,d.object_name AS table_name
,l.lmode
,l.type
,l.request
from v$transaction t,v$session s,dba_objects d,v$lock l
where t.ses_addr = s.saddr
and l.sid = s.sid
and l.id1 = d.object_id
and t.status = 'ACTIVE'
and d.object_name = 'TEST'
and d.owner = 'HR';
maxtransops默认值时,默认值10000000,目标端持续了25分钟。
maxtransops 10000,持续11分钟,效率提升还是比较明显。
3. 结论
- 经典模式maxtransops对效率提升还是较为明显。
- OGG无论经典还是集成,均为检测到源端commit之后,事务才会开始写trail文件发送到目标端,所以大事务均存在延迟,正常现象。
- 大事务拆分之后,如果ogg链路出现损坏,则存在一个事务只有部分入目标库现象,所以需要谨慎考虑。