[FAQ] ogg 从 oracle 将数据同步到 TiDB,ogg 报错:Database error 1105 ([SQL error 1105]INSERT INTO tidb.tt (xxxx,xxx,xxx,xxx) ,tidb 报错:statement count 5001 exceeds the transaction limitation, autocommit = false

【问题澄清】

使用 ogg 将数据从 oracle 导入 tidb 集群报错

  • ogg 报错如下:

05-12T11:11:51.646+0800 WARNING OGG-01004 Oracle GoldenGate Delivery for MySQL, repsc.prm: Aborted grouped transaction on tidb.tt, Database error 1105 ([SQL error 1105]INSERT INTO tidb.tt (xxxx,xxx,xxx,xxx). 2020-05-12T11:11:51.646+0800 WARNING OGG-01003 Oracle GoldenGate Delivery for MySQL, repsc.prm: Repositioning to rba 48399267 in seqno 356. 2020-05-12T11:11:55.941+0800 WARNING OGG-01154 Oracle GoldenGate Delivery for MySQL, repsc.prm: SQL error 1105 mapping tidb.tt to tidb.tt [SQL error 1105]INSERT INTOtidb.tt` (xxxxxxx,xx,x,x,x,x. 2020-05-12T11:11:55.942+0800 ERROR OGG-01296 Oracle GoldenGate Delivery for MySQL, repsc.prm: Error mapping from tidb.tt to tidb.tt. 2020-05-12T11:11:55.943+0800 ERROR OGG-01668 Oracle GoldenGate Delivery for MySQL, repsc.prm: PROCESS ABENDING.

  • 其中 tidb.log 信息如下:
... tidb.log ...

[err="statement count 5001 exceeds the transaction limitation, autocommit = false\

github.com/pingcap/tidb/session.checkStmtLimit\
\tgithub.com/pingcap/tidb@/session/tidb.go:199\

github.com/pingcap/tidb/session.finishStmt\
\t
github.com/pingcap/tidb@/session/tidb.go:188\

github.com/pingcap/tidb/session.runStmt\
\t
github.com/pingcap/tidb@/session/tidb.go:257\

github.com/pingcap/tidb/session.(*session).ExecutePreparedStmt\
\t
github.com/pingcap/tidb@/session/session.go:1241\

github.com/pingcap/tidb/server.(*TiDBStatement).Execute\
\t
github.com/pingcap/tidb@/server/driver_tidb.go:75\

github.com/pingcap/tidb/server.(*clientConn).handleStmtExecute\
\t
github.com/pingcap/tidb@/server/conn_stmt.go:182\

github.com/pingcap/tidb/server.(*clientConn).dispatch\
\t
github.com/pingcap/tidb@/server/conn.go:926\

github.com/pingcap/tidb/server.(*clientConn).Run\
\t
github.com/pingcap/tidb@/server/conn.go:666\

github.com/pingcap/tidb/server.(*Server).onConn\
\t
github.com/pingcap/tidb@/server/server.go:440\

runtime.goexit\
\t
runtime/asm_amd64.s:1357\

INSERT INTO tidb.tt

......

【解决思路】

  1. ogg 中报错可以看出,是下游插入数据时出现了问题,但是并无有效信息指出具体原因为何。
  2. 检查报错时间点 tidb.log 中是否包含重要的报错信息

【解决方案】

  • 调整 tidb 参数:stmt-count-limit,或者减小单个事务包含的 SQL 语句。

【注意事项】

  • 通常建议减小事务,控制在5000 条以内。 如果改大,可能会引起其他限制,比如单个事务总的大小超过 100M。

【延伸】

关于事务限制相关报错和典型案例:

  1. 单个事务包含的 SQL 语句不超过 5000 条(默认)

  2. 单条 KV entry 不超过 6MB

  3. KV entry 的总条数(length)不超过 30w

  4. KV entry 的总大小(size)不超过 100MB(3.0 无可调节参数,4.0 在 tidb 配置文件中加入 txn-total-size-limit 参数)

    • log 信息:ERROR 8004 (HY000): transaction too large, size:104857600

【参考案例】

【涉及知识点】

  • 代码中关于 kv event 中报错的定义

tidb/kv/memdb_buffer.go at e9653675dd3b996b47647fde7e623afaaaf4317c · pingcap/tidb · GitHub
tidb/errno/errname.go at 2efab88a59499ea3934c8c1eba7b695cf24b9d29 · pingcap/tidb · GitHub