本文转自:http://blog.sina.com.cn/s/blog_4d22b9720102v3xo.html
感谢原作者
OGG Replicat延迟-由于在无主键表删除大批量数据导致
![此博文包含图片](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
最近发现IPS3.0上海容灾库GGS Replicat进程每天08:00开始延迟:
oracle@DBha01$./ggsci OracleGoldenGate Command Interpreter for Oracle Version11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230_FBO Solaris,sparc, 64bit (optimized), Oracle 10g on Apr 24 201209:06:57 Copyright(C) 1995, 2012, Oracle and/or its affiliates. All rightsreserved. GGSCI(DBha01) 1> info all Program MANAGER EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT REPLICAT REPLICAT REPLICAT |
大约2个小时后,处于正常状态。
通过GGS trace/trace2命令(如下):
send |
发现当时GGS正在处理的SQL语句如下:
DELETE FROM"IPS2"."ETL_TRAD_BANK" 09:57:38.223 (539896) preparing new dynamicstmt 09:57:38.223 (539896) iotype:3 mode:0 09:57:38.223 (539896) BIND val for col:0 :32 30len:19 blen:0 09:57:38.223 (539896) BIND val for col:1 :4e 54len:17 blen:0 09:57:38.223 (539896) BIND val for col:2 :31 32len:4 blen:0 09:57:38.223 (539896) BIND val for col:3 :30 32len:6 blen:0 09:57:38.223 (539896) BIND val for col:4 :4e 54len:2 blen:0 09:57:38.223 (539896) BIND val for col:5 :31 0len:1 blen:0 09:57:38.223 (539896) BIND val for col:6 :52 4dlen:3 blen:0 09:57:38.223 (539896) BIND val for col:7 :32 30len:3 blen:0 09:57:38.223 (539896) BIND val for col:8 :31 31len:4 blen:0 09:57:38.223 (539896) BIND val for col:9 :31 31len:12 blen:0 09:57:38.223 (539896) BIND val for col:10 :31 31len:16 blen:0 09:57:38.223 (539896) BIND val for col:11 :6e 75len:4 blen:0 09:57:38.223 (539896) BIND val for col:13 :6e 75len:4 blen:0 09:57:38.223 (539896) BIND val for col:14 :32 30len:19 blen:0 09:57:38.223 (539896) BIND val for col:15 :31 0len:1 blen:0 09:57:38.223 (539896) BIND val for col:16 :32 0len:1 blen:0 09:57:38.223 (539896) BIND val for col:20 :31 0len:1 blen:0 09:57:38.333 (540006) OCI statement executedsuccessfully... 09:57:38.333 (540006) executed stmt(sql_err=0) 09:57:38.333 (540006) exitedperform_sql_statements (sql_err=0,recs output=5198) 09:57:38.333 (540006) * --- enteringREAD_EXTRACT_RECORD --- * 09:57:38.333 (540006) exited READ_EXTRACT_RECORD(stat=0, seqno=1248, rba=3972388) 09:57:38.333 (540006) processing record forIPS2.ETL_TRAD_BANK 09:57:38.333 (540006) mapping record 09:57:38.333 (540006) enteringperform_sql_statements (normal) 09:57:38.333 (540006) entering execute_statement(op_type=3,IPS2.ETL_TRAD_BANK) 09:57:38.333 (540006) CDR iotype:3 09:57:38.333 (540006) preparing new dynamicstmt 09:57:38.333 (540006) iotype:3 mode:0 09:57:38.333 (540006) BIND val for col:0 :32 30len:19 blen:0 09:57:38.333 (540006) BIND val for col:1 :4e 54len:17 blen:0 09:57:38.333 (540006) BIND val for col:2 :31 32len:4 blen:0 09:57:38.333 (540006) BIND val for col:3 :30 31len:6 blen:0 09:57:38.333 (540006) BIND val for col:4 :4e 54len:2 blen:0 09:57:38.333 (540006) BIND val for col:5 :31 0len:1 blen:0 09:57:38.333 (540006) BIND val for col:6 :52 4dlen:3 blen:0 09:57:38.333 (540006) BIND val for col:7 :34 30len:3 blen:0 09:57:38.333 (540006) BIND val for col:8 :31 31len:4 blen:0 09:57:38.333 (540006) BIND val for col:9 :33 30len:12 blen:0 09:57:38.333 (540006) BIND val for col:10 :31 31len:16 blen:0 09:57:38.333 (540006) BIND val for col:11 :6e 75len:4 blen:0 09:57:38.333 (540006) BIND val for col:13 :6e 75len:4 blen:0 09:57:38.333 (540006) BIND val for col:14 :32 30len:19 blen:0 09:57:38.333 (540006) BIND val for col:15 :30 0len:1 blen:0 09:57:38.333 (540006) BIND val for col:16 :32 0len:1 blen:0 09:57:38.333 (540006) BIND val for col:20 :31 0len:1 blen:0 09:57:38.433 (540106) OCI statement executedsuccessfully... 09:57:38.433 (540106) executed stmt(sql_err=0) 09:57:38.433 (540106) exitedperform_sql_statements (sql_err=0,recs output=5199) 09:57:38.433 (540106) * --- enteringREAD_EXTRACT_RECORD --- * 09:57:38.433 (540106) exited READ_EXTRACT_RECORD(stat=0, seqno=1248, rba=3972760) 09:57:38.433 (540106) processing record forIPS2.ETL_TRAD_BANK 09:57:38.433 (540106) mapping record 09:57:38.433 (540106) enteringperform_sql_statements (normal) 09:57:38.433 (540106) entering execute_statement(op_type=3,IPS2.ETL_TRAD_BANK) 09:57:38.433 (540106) CDR iotype:3 09:57:38.433 (540106) preparing new dynamicstmt 09:57:38.433 (540106) iotype:3 mode:0 09:57:38.433 (540106) BIND val for col:0 :32 30len:19 blen:0 09:57:38.433 (540106) BIND val for col:1 :4e 54len:17 blen:0 09:57:38.433 (540106) BIND val for col:2 :31 32len:4 blen:0 09:57:38.433 (540106) BIND val for col:3 :30 32len:6 blen:0 09:57:38.433 (540106) BIND val for col:4 :4e 54len:2 blen:0 09:57:38.433 (540106) BIND val for col:5 :31 0len:1 blen:0 09:57:38.433 (540106) BIND val for col:6 :52 4dlen:3 blen:0 09:57:38.433 (540106) BIND val for col:7 :31 30len:3 blen:0 09:57:38.433 (540106) BIND val for col:8 :31 31len:4 blen:0 09:57:38.433 (540106) BIND val for col:9 :31 31len:12 blen:0 09:57:38.433 (540106) BIND val for col:10 :31 31len:16 blen:0 09:57:38.433 (540106) BIND val for col:11 :6e 75len:4 blen:0 09:57:38.433 (540106) BIND val for col:13 :6e 75len:4 blen:0 09:57:38.433 (540106) BIND val for col:14 :32 30len:19 blen:0 09:57:38.433 (540106) BIND val for col:15 :31 0len:1 blen:0 09:57:38.433 (540106) BIND val for col:16 :32 0len:1 blen:0 09:57:38.433 (540106) BIND val for col:20 :31 0len:1 blen:0 09:57:38.543 (540216) OCI statement executedsuccessfully... 09:57:38.543 (540216) executed stmt(sql_err=0) 09:57:38.543 (540216) exitedperform_sql_statements (sql_err=0,recs output=5200) 09:57:38.543 (540216) * --- enteringREAD_EXTRACT_RECORD --- * 09:57:38.543 (540216) exited READ_EXTRACT_RECORD(stat=0, seqno=1248, rba=3973132) 09:57:38.543 (540216) processing record forIPS2.ETL_TRAD_BANK 09:57:38.543 (540216) mapping record 09:57:38.543 (540216) enteringperform_sql_statements (normal) 09:57:38.543 (540216) entering execute_statement(op_type=3,IPS2.ETL_TRAD_BANK) 09:57:38.543 (540216) CDR iotype:3 09:57:38.543 (540216) preparing new dynamicstmt 09:57:38.543 (540216) iotype:3 mode:0 09:57:38.543 (540216) BIND val for col:0 :32 30len:19 blen:0 09:57:38.543 (540216) BIND val for col:1 :4e 54len:17 blen:0 09:57:38.543 (540216) BIND val for col:2 :31 32len:4 blen:0 09:57:38.543 (540216) BIND val for col:3 :30 32len:6 blen:0 09:57:38.543 (540216) BIND val for col:4 :4e 54len:2 blen:0 09:57:38.543 (540216) BIND val for col:5 :31 0len:1 blen:0 09:57:38.543 (540216) BIND val for col:6 :52 4dlen:3 blen:0 09:57:38.543 (540216) BIND val for col:7 :35 30len:3 blen:0 09:57:38.543 (540216) BIND val for col:8 :31 31len:4 blen:0 09:57:38.543 (540216) BIND val for col:9 :31 31len:12 blen:0 09:57:38.543 (540216) BIND val for col:10 :31 31len:16 blen:0 09:57:38.543 (540216) BIND val for col:11 :6e 75len:4 blen:0 09:57:38.543 (540216) BIND val for col:13 :6e 75len:4 blen:0 09:57:38.543 (540216) BIND val for col:14 :32 30len:19 blen:0 09:57:38.543 (540216) BIND val for col:15 :33 0len:1 blen:0 09:57:38.543 (540216) BIND val for col:16 :32 0len:1 blen:0 09:57:38.543 (540216) BIND val for col:20 :31 0len:1 blen:0 09:57:38.643 (540316) OCI statement executedsuccessfully... 09:57:38.643 (540316) executed stmt(sql_err=0) 09:57:38.643 (540316) exitedperform_sql_statements (sql_err=0,recs output=5201) 09:57:38.643 (540316) * --- enteringREAD_EXTRACT_RECORD --- * 09:57:38.643 (540316) exited READ_EXTRACT_RECORD(stat=0, seqno=1248, rba=3973504) 09:57:38.643 (540316) processing record forIPS2.ETL_TRAD_BANK 09:57:38.643 (540316) mapping record 09:57:38.643 (540316) enteringperform_sql_statements (normal) 09:57:38.643 (540316) entering execute_statement(op_type=3,IPS2.ETL_TRAD_BANK) 09:57:38.643 (540316) CDR iotype:3 09:57:38.653 (540326) preparing new dynamicstmt 09:57:38.653 (540326) iotype:3 mode:0 09:57:38.653 (540326) BIND val for col:0 :32 30len:19 blen:0 09:57:38.653 (540326) BIND val for col:1 :4e 54len:17 blen:0 09:57:38.653 (540326) BIND val for col:2 :31 32len:4 blen:0 09:57:38.653 (540326) BIND val for col:3 :30 32len:6 blen:0 09:57:38.653 (540326) BIND val for col:4 :4e 54len:2 blen:0 09:57:38.653 (540326) BIND val for col:5 :31 0len:1 blen:0 09:57:38.653 (540326) BIND val for col:6 :52 4dlen:3 blen:0 09:57:38.653 (540326) BIND val for col:7 :32 39len:4 blen:0 09:57:38.653 (540326) BIND val for col:8 :31 31len:4 blen:0 09:57:38.653 (540326) BIND val for col:9 :31 31len:12 blen:0 09:57:38.653 (540326) BIND val for col:10 :31 31len:16 blen:0 09:57:38.653 (540326) BIND val for col:11 :6e 75len:4 blen:0 09:57:38.653 (540326) BIND val for col:13 :6e 75len:4 blen:0 09:57:38.653 (540326) BIND val for col:14 :32 30len:19 blen:0 09:57:38.653 (540326) BIND val for col:15 :31 35len:2 blen:0 09:57:38.653 (540326) BIND val for col:16 :32 0len:1 blen:0 09:57:38.653 (540326) BIND val for col:20 :31 0len:1 blen:0 09:57:38.753 (540426) OCI statement executedsuccessfully... 09:57:38.753 (540426) executed stmt(sql_err=0) 09:57:38.753 (540426) exitedperform_sql_statements (sql_err=0,recs output=5202) |
联系到程序开发人员,其实生产应用中的SQL如下:
|
由以上可知,GGS将以上SQL1 DeleteSQL语句在目标端执行时,自动分拆一笔一笔的删除执行,进一步了解程序知晓每天删除20w笔记录,所以才导致Replicat进程Lag时间过长。。删除大批量的数据本来就不是好的程序设计方式,但是先不顾此,在此不讨论,继续分析Replicat
在这个程序之前,还有另外一支程序也是每天删除大约20w笔记录,但是并没有导致GGS Replicat进程出现延迟现象。于是,针对这两支程序进行对比,主要看看SQL有哪些差异,TABLE有哪些差异。分析的结果就是,这支程序删除20w记录的表没有主键,那支程序涉及到表有主键。
后来给出的初步的解决方案如下:
1).增加GROUPTRANSOPS
并没有达到期望的效果。
2).增加主键;
问题解决。
3).程序修改不删除数据,改建分区表。
实际上,2/3是同时进行的,只是3中没有停止删除数据而已,观察一天问题得以解决。
因此,看来对于删除大量数据表,使用GGS作为容灾时,需要在被删除表上建立主键(尽管GGS一致声称没有主键也可以,将所有列合起来当成唯一约束或者主键)。