OGG classic模式maxtransops参数提升复制效率

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. 结论

  1. 经典模式maxtransops对效率提升还是较为明显。
  2. OGG无论经典还是集成,均为检测到源端commit之后,事务才会开始写trail文件发送到目标端,所以大事务均存在延迟,正常现象。
  3. 大事务拆分之后,如果ogg链路出现损坏,则存在一个事务只有部分入目标库现象,所以需要谨慎考虑。