SQL> select le.leseq "Current log sequence No", 2 100 * cp.cpodr_bno / le.lesiz "Percent Full", 3 (cpodr_bno - 1) * 512 "Current Offset", 4 le.lesiz * 512 - cpodr_bno * 512 "Left space" 5 from x$kcccp cp, x$kccle le 6 where LE.leseq = CP.cpodr_seq 7 and bitand(le.leflg, 24) = 8; Current log sequence No Percent Full Current Offset Left space ----------------------- ------------ -------------- ---------- 177 78.5112305 82324480 22532608 /* 通过以上查询我们可以了解实际的redo写出情况: Current Offset说明了当前日志文件所写到的位置, 而Left Space说明了当前日志文件所剩余的空间 82324480(Current Offset)+22532608(Left space)+512(redo header)=logfile size=le.lesiz* redo block size */ SQL> alter system switch logfile; System altered. SQL> select le.leseq "Current log sequence No", 2 100 * cp.cpodr_bno / le.lesiz "Percent Full", 3 (cpodr_bno - 1) * 512 "Current Offset", 4 le.lesiz * 512 - cpodr_bno * 512 "Left space" 5 from x$kcccp cp, x$kccle le 6 where LE.leseq = CP.cpodr_seq 7 and bitand(le.leflg, 24) = 8; Current log sequence No Percent Full Current Offset Left space ----------------------- ------------ -------------- ---------- 179 .002441406 2048 104855040 /* 初始位置为No 179的日志文件 */ SQL> select le.leseq "Current log sequence No", 2 100 * cp.cpodr_bno / le.lesiz "Percent Full", 3 (cpodr_bno - 1) * 512 "Current Offset", 4 le.lesiz * 512 - cpodr_bno * 512 "Left space" 5 from x$kcccp cp, x$kccle le 6 where LE.leseq = CP.cpodr_seq 7 and bitand(le.leflg, 24) = 8; Current log sequence No Percent Full Current Offset Left space ----------------------- ------------ -------------- ---------- 180 58.277832 61108224 43748864 /* 使用普通非并行DML插入产生了104855040+61108224=158M的redo */ SQL> truncate table tv; Table truncated. SQL> select le.leseq "Current log sequence No", 2 100 * cp.cpodr_bno / le.lesiz "Percent Full", 3 (cpodr_bno - 1) * 512 "Current Offset", 4 le.lesiz * 512 - cpodr_bno * 512 "Left space" 5 from x$kcccp cp, x$kccle le 6 where LE.leseq = CP.cpodr_seq 7 and bitand(le.leflg, 24) = 8; Current log sequence No Percent Full Current Offset Left space ----------------------- ------------ -------------- ---------- 180 60.6469727 63592448 41264640 /* 初始为No 180日志文件的63592448 */ SQL> alter session enable parallel dml; Session altered. /* 在session级别启用并行DML */ SQL> set autotrace on; SQL> insert /*+ parallel(tv,4) */ into tv select * from sample; 3640772 rows created. Execution Plan ---------------------------------------------------------- ERROR: ORA-12838: cannot read/modify an object after modifying it in parallel SP2-0612: Error generating AUTOTRACE EXPLAIN report Statistics ---------------------------------------------------------- 111 recursive calls 1168 db block gets 17850 consistent gets 17745 physical reads 97944 redo size 815 bytes sent via SQL*Net to client 750 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 3640772 rows processed /* autotrace statistics显示并行插入仅产生了97944字节的redo */ SQL> commit; Commit complete. SQL> select le.leseq "Current log sequence No", 2 100 * cp.cpodr_bno / le.lesiz "Percent Full", 3 (cpodr_bno - 1) * 512 "Current Offset", 4 le.lesiz * 512 - cpodr_bno * 512 "Left space" 5 from x$kcccp cp, x$kccle le 6 where LE.leseq = CP.cpodr_seq 7 and bitand(le.leflg, 24) = 8; Current log sequence No Percent Full Current Offset Left space ----------------------- ------------ -------------- ---------- 182 10.4882813 10997248 93859840 /* 而实际上日志由180切换到了182,实际的redo产生大约是41264640+104857600+10997248=150M */ /* 换而言之autotrace对并行DML语句所产生的实际redo统计远少于实际值, 这也就保证了extract能够捕获到所有这些并行DML所引起的数据变化 */ GGSCI (rh2.oracle.com) 59> stats load2 Sending STATS request to EXTRACT LOAD2 ... Start of Statistics at 2010-12-16 20:17:35. Output to /s01/new/ze: Extracting from CLINIC.TV to CLINIC.TV: *** Total statistics since 2010-12-16 20:17:24 *** Total inserts 923555.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 923555.00 *** Daily statistics since 2010-12-16 20:17:24 *** Total inserts 923555.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 923555.00 *** Hourly statistics since 2010-12-16 20:17:24 *** Total inserts 923555.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 923555.00 *** Latest statistics since 2010-12-16 20:17:24 *** Total inserts 923555.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 923555.00 End of Statistics. GGSCI (rh2.oracle.com) 60> ! stats load2 Sending STATS request to EXTRACT LOAD2 ... Start of Statistics at 2010-12-16 20:17:37. Output to /s01/new/ze: Extracting from CLINIC.TV to CLINIC.TV: *** Total statistics since 2010-12-16 20:17:24 *** Total inserts 1090336.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1090336.00 *** Daily statistics since 2010-12-16 20:17:24 *** Total inserts 1090336.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1090336.00 *** Hourly statistics since 2010-12-16 20:17:24 *** Total inserts 1090336.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1090336.00 *** Latest statistics since 2010-12-16 20:17:24 *** Total inserts 1090336.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1090336.00 End of Statistics. GGSCI (rh2.oracle.com) 61> ! stats load2 Sending STATS request to EXTRACT LOAD2 ... Start of Statistics at 2010-12-16 20:17:39. Output to /s01/new/ze: Extracting from CLINIC.TV to CLINIC.TV: *** Total statistics since 2010-12-16 20:17:24 *** Total inserts 1249284.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1249284.00 *** Daily statistics since 2010-12-16 20:17:24 *** Total inserts 1249284.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1249284.00 *** Hourly statistics since 2010-12-16 20:17:24 *** Total inserts 1249284.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1249284.00 *** Latest statistics since 2010-12-16 20:17:24 *** Total inserts 1249284.00 Total updates 0.00 Total deletes 0.00 Total discards 0.00 Total operations 1249284.00 End of Statistics. /* 可以看到extract的统计信息中Total inserts不断递增,说明extract正确捕获了 所有由并行INSERT引发的直接路径插入操作 */Does Oracle Goldengate support Parallel DML? 结论显然是: Yes。
Golengate的基本工作原理是通过挖掘重做日志以获取数据库中的数据变化;而如果我们在数据库中使用并行DML去插入数据的话会因为直接路径插入而产生少量的redo重做日志。那么OGG的日志挖掘是否能正确捕获这些并行DML所产生的数据变化呢?接着我们来实际地测试一下: